Spring Cloud Gateway
- 添加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” (后)过滤器逻辑被运行。
请求流程:
- 客户端发起请求
- Handler Mapping: 根据断言,将请求转发到对应的路由
- Web Handler: 处理请求(一层层经过过滤器)
- 实际调用服务
网关的作用
- 路由
- 负载均衡
- 统一鉴权
- 跨域
- 统一业务处理(缓存)
- 访问控制
- 发布控制
- 流量染色
- 接口保护
- 限制请求
- 信息脱敏
- 降级(熔断)
- 限流:学习令牌桶算法、学习漏桶算法,学习一下 RedisLimitHandler
- 超时时间
- 统一日志
- 统一文档
路由
起到转发的作用,比如有接口 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
统一接口保护
- 限制请求:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#requestheadersize-gatewayfilter-factory
- 信息脱敏:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-removerequestheader-gatewayfilter-factory
- 降级(熔断):https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#fallback-headers
- 限流:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-requestratelimiter-gatewayfilter-factory
- 超时时间:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#http-timeouts-configuration
- 重试(业务保护):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
网关的分类
- 全局网关(接入层网关): 作用是负载均衡、请求日志等,不和业务逻辑绑定
- 业务网关(微服务网关): 存在一些业务逻辑,作用是将请求转发到不同的业务/项目/接口/服务
参考文章:https://blog.csdn.net/qq_21040559/article/details/122961395
实现网关
- Nginx (全局网关)、Kong 网关 (API 网关, Kong: https://github.com/Kong/kong), 编程成本相对高点
- Spring Cloud GateWay (取代了 Zuul ) , 性能高、可以用 Java 代码来写逻辑,适合学习
网关的技术选型:https://zhuanlan.zhihu.com/p/500587132
开启日志
logging:
level:
org:
springframework:
cloud:
gateway: trace
断言
- After 在 xx 时间之后
- Before 在 xx 时间之前
- Between 在 xx 时间之间
- 请求类别
- 请求头(包含 cookie)
- 查询参数
- 客户端地址
- 权重
过滤器
基本功能:对请求头、请求参数、响应头的增删改查
- 添加请求头
- 添加请求参数
- 添加响应头
- 降级
- 限流
- 重试