【Java EE】Spring Cloud Gateway


参考文档 https://springdoc.cn/spring-cloud-gateway/

添加Spring Cloud Gateway

使用 group ID 为 org.springframework.cloud,artifact ID 为 spring-cloud-starter-gateway 的starter

 <dependency>    
 <groupId>org.springframework.cloud</groupId>  
   <artifactId> spring-cloud-starter-gateway</artifactId>
   </dependency>

术语表

  • Route(路由): 网关的基本构件。它由一个ID、一个目的地URI、一个谓词(Predicate)集合和一个过滤器(Filter)集合定义。如果集合谓词为真,则路由被匹配。
  • Predicate(谓词): 这是一个 Java 8 Function Predicate。输入类型是 Spring Framework ServerWebExchange。这让你可以在HTTP请求中的任何内容上进行匹配,比如header或查询参数。
  • Filter(过滤器): 这些是 GatewayFilter 的实例,已经用特定工厂构建。在这里,你可以在发送下游请求之前或之后修改请求和响应。

简而言之:
路由(根据什么条件,转发到哪里去)

断言:一组规则、条件, 用来确定如何转发路由

过滤器: 对请求进行一系列的处理, 比如添加请求头、添加请求参数

工作流程

客户端向 Spring Cloud Gateway 发出请求。如果Gateway处理程序映射确定一个请求与路由相匹配,它将被发送到Gateway Web处理程序。这个处理程序通过一个特定于该请求的过滤器链来运行该请求。过滤器被虚线分割的原因是,过滤器可以在代理请求发送之前和之后运行逻辑。所有的 “pre” (前)过滤器逻辑都被执行。然后发出代理请求。在代理请求发出后,“post” (后)过滤器逻辑被运行。

请求流程:

  1. 客户端发起请求
  2. Handler Mapping: 根据断言,将请求转发到对应的路由
  3. Web Handler: 处理请求(一层层经过过滤器)
  4. 实际调用服务

在这里插入图片描述

网关的作用

  1. 路由
  2. 负载均衡
  3. 统一鉴权
  4. 跨域
  5. 统一业务处理(缓存)
  6. 访问控制
  7. 发布控制
  8. 流量染色
  9. 接口保护
    1. 限制请求
    2. 信息脱敏
    3. 降级(熔断)
    4. 限流:学习令牌桶算法、学习漏桶算法,学习一下 RedisLimitHandler
    5. 超时时间
  10. 统一日志
  11. 统一文档

路由

起到转发的作用,比如有接口 A 和接口 B, 网关会记录这些信息,根据用户访问的地址和参数,转发请求到对应的接口(服务器/集群)

/a => 接口 A

/b => 接口 B

Gateway 路由:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories

负载均衡

在路由的基础上

/c => 服务 A / 集群 A (随机转发到其中的某一个机器)

uri 从固定地址改成 lb:xxxx

统一处理跨域

网关统一处理跨域,不用在每个项目里单独处理

GateWay 处理跨域:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#cors-configuration

发布控制

灰度发布,比如上线新接口,先给新接口分配 20% 的流量,老接口 80%, 再慢慢调整比例

https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-weight-route-predicate-factory

流量染色

给请求(流量)添加一些标识,一般是设置请求头中,添加新的请求头

https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-addrequestheader-gatewayfilter-factory

全局染色:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#default-filters

统一接口保护

  1. 限制请求:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#requestheadersize-gatewayfilter-factory
  2. 信息脱敏:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-removerequestheader-gatewayfilter-factory
  3. 降级(熔断):https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#fallback-headers
  4. 限流:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-requestratelimiter-gatewayfilter-factory
  5. 超时时间:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#http-timeouts-configuration
  6. 重试(业务保护):https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-retry-gatewayfilter-factory

统一业务处理

把每个项目中都要做的通用逻辑放到上层(网关),统一处理,比如本项目的次数统计

统一鉴权

判断用户是否有权限进行操作,无论访问什么接口,都统一验证权限,避免重复写验证权限操作。

访问控制

黑白名单,比如限制 DDOS IP

统一日志

统一的请求、响应信息记录

统一文档

将下游项目的文档进行聚合,在一个页面统一查看

可以使用 knife4j : https://doc.xiaominfo.com/docs/middleware-sources/aggregation-introduction

网关的分类

  1. 全局网关(接入层网关): 作用是负载均衡、请求日志等,不和业务逻辑绑定
  2. 业务网关(微服务网关): 存在一些业务逻辑,作用是将请求转发到不同的业务/项目/接口/服务

参考文章:https://blog.csdn.net/qq_21040559/article/details/122961395

实现网关

  1. Nginx (全局网关)、Kong 网关 (API 网关, Kong: https://github.com/Kong/kong), 编程成本相对高点
  2. Spring Cloud GateWay (取代了 Zuul ) , 性能高、可以用 Java 代码来写逻辑,适合学习

网关的技术选型:https://zhuanlan.zhihu.com/p/500587132

开启日志

logging:
  level:
    org:
      springframework:
        cloud:
          gateway: trace

断言

  1. After 在 xx 时间之后
  2. Before 在 xx 时间之前
  3. Between 在 xx 时间之间
  4. 请求类别
  5. 请求头(包含 cookie)
  6. 查询参数
  7. 客户端地址
  8. 权重

过滤器

基本功能:对请求头、请求参数、响应头的增删改查

  1. 添加请求头
  2. 添加请求参数
  3. 添加响应头
  4. 降级
  5. 限流
  6. 重试

猜你喜欢

转载自blog.csdn.net/m0_51371693/article/details/130799821