|
|
|
|
# SpringCloud - Gateway
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 1. 基础介绍
|
|
|
|
|
|
|
|
|
|
- SpringCloud Gateway 的核心概念
|
|
|
|
|
- SpringCloud Gateway 是 Spring 官方最新推出的一款基于 SpringFramework 5, Project Reactor 和SpringBoot 2之上开发的网关
|
|
|
|
|
- 它与第一代网关 Zuu 不同的是: gateway 是异步非阻塞的(netty + webflux 实现), zuul是同步阻塞请求的
|
|
|
|
|
- Gateway 三大组成部分
|
|
|
|
|
- Route 路由(ID + 目标URL) - Predicate 断言 - Filter 过滤器
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- SpringCloud Gateway 的工作模型
|
|
|
|
|
- SpringCloud Gateway 工作模型图示及解读
|
|
|
|
|
- 请求发送到网关,经由分发器将请求匹配到相应的 HandlerMapping
|
|
|
|
|
- 请求和处理器之间有一个映射,路由到网关处理程序,即 Web Handler
|
|
|
|
|
- 执行特定的请求过滤器链 (Filters Proxy Filter)
|
|
|
|
|
- 最终到达代理的微服务 (Proxied Service)
|
|
|
|
|
---
|
|
|
|
|
## 2. 谓词 Predicate 的原理与应用
|
|
|
|
|
|
|
|
|
|
- 参考: [PredicateTest.java]
|
|
|
|
|
|
|
|
|
|
## 3. 集成 Nacos 实现动态路由配置
|
|
|
|
|
|
|
|
|
|
- 静态路由配置
|
|
|
|
|
- 静态路由配置写在配置文件中(yml或者 properties 文件中),端点是:spring.cloud.gateway
|
|
|
|
|
- 缺点非常明显,每次改动都需要网关模块重新部署
|
|
|
|
|
---
|
|
|
|
|
## 4. 注册网关事件监听器
|
|
|
|
|
|
|
|
|
|
- 参考: [DynamicRouteServiceImpl.java] | [DynamicRouteServiceImplByNacos.java]
|
|
|
|
|
|
|
|
|
|
- 验证网关监听器的可用性 修改看是否可以生效, 已经测试成功
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
## 5. 解读 SpringCloud Gateway Filter
|
|
|
|
|
|
|
|
|
|
- SpringCloud Gateway Filter 的相关概念
|
|
|
|
|
- SpringCloud Gateway 基于过滤器实现,同 zuul 类似,有 pre 和 post 两种方式的filter,分别处理前置逻辑和后置逻辑
|
|
|
|
|
- 客户端的请求先经过 pre 类型的 filter,然后将请求转发到具体的业务服务,收到业务服务的响应之后,再经过 post 类型的 fiter 处理,最后返回响应到客户端
|
|
|
|
|
- Filter 一共有两大类: 全局过滤器 和 局部过滤器
|
|
|
|
|
|
|
|
|
|
- 搜索 GlobalFilter 就可以知道 Gateway 所支持的所有过滤器
|
|
|
|
|
- 添加前缀的局部过滤器: PrefixPathGatewayFilterFactory -> 局部过滤器返回均为 GatewayFilter
|
|
|
|
|
- 添加后缀过滤器(去掉前缀): StripPrefixGatewayFilterFactory
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
- SpringCloud Gateway Filter 的执行流程
|
|
|
|
|
- 过滤器有优先级之分,Order越大,优先级越低,越晚被执行
|
|
|
|
|
- 全局过滤器所有的请求都会执行
|
|
|
|
|
- 局部过滤器只有配置的请求才会执行
|
|
|
|
|
---
|
|
|
|
|
## 6. 局部过滤器 - 校验 Header 中的 Token
|
|
|
|
|
- 实现一个局部过滤器, 和局部过滤器工厂
|
|
|
|
|
- [HeaderTokenGatewayFilter.java] + [HeaderTokenGatewayFilterFactory.java]
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
## 7. 缓存 HTTP 请求 Body 的全局过滤器
|
|
|
|
|
- 缓存 HTTP 请求 Body 的全局过滤器
|
|
|
|
|
- [GlobalCacheRequestBodyFilter.java]
|
|
|
|
|
---
|
|
|
|
|
## 8. 登录、注册、鉴权全局过滤器
|
|
|
|
|
- [GlobalLoginOrRegisterFilter.java]
|
|
|
|
|
---
|
|
|
|
|
## 9. 代码与文件两种方式配置网关路由
|
|
|
|
|
- 文件进行配置
|
|
|
|
|
```json
|
|
|
|
|
[
|
|
|
|
|
{
|
|
|
|
|
"id": "dev-protocol-springcloud-nacos-client",
|
|
|
|
|
"order": 0, // order 越小优先级越高0
|
|
|
|
|
"predicates": [
|
|
|
|
|
{
|
|
|
|
|
"args": {
|
|
|
|
|
"pattern": "/dev-protocol-springcloud-gateway/dev-protocol-spring-cloud-nacos/**"
|
|
|
|
|
},
|
|
|
|
|
"name": "Path"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"uri": "lb://dev-protocol-spring-cloud-nacos",
|
|
|
|
|
"filters": [
|
|
|
|
|
{
|
|
|
|
|
"name": "HeaderToken"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "StripPrefix",
|
|
|
|
|
"args": {
|
|
|
|
|
"parts": "1" // 用来跳过上面的 pattern 前面的配置, 因为 [bootstrap.yml] 中的配置 context-path
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
```
|
|
|
|
|
- 配置类进行配置: [RouteLocatorConfig.java]
|
|
|
|
|
|
|
|
|
|
## 10. 验证网关微服务功能可用性
|
|
|
|
|
|
|
|
|
|
- src/main/resources/http 下
|
|
|
|
|
- [HeaderTokenGatewayFilterFactory.java]
|
|
|
|
|
- 注意配置文件中的过滤器名称就是 [HeaderToken]GatewayFilterFactory , 框内的名称
|
|
|
|
|
|
|
|
|
|
## 11. SpringCloud Gateway 微服务入口网关总结
|
|
|
|
|
|
|
|
|
|
- SpringCloud Gateway 在工程中的位置
|
|
|
|
|
- SpringCloud Gateway 是工程的最前端
|
|
|
|
|
- 网关是微服务工程架构下的唯一入口(客户端)
|
|
|
|
|
- Gateway 提供了统一的路由方式,基于Filter 链的方式提供了网关的基本功能
|
|
|
|
|
---
|
|
|
|
|
- SpringCloud Gateway 与Zuul 的区别
|
|
|
|
|
- Zuul 1.X是一个基于阻塞 I/0 的 APIGateway
|
|
|
|
|
- 基于 Servlet2.5 使用阻塞架构,不支持任何长连接
|
|
|
|
|
- Zuu 的设计模式与 Nginx 很像,每次 I/0 操作都是从工作线程中选择一个执行,请求线程被阻塞到工作线程完成
|
|
|
|
|
- SpringCloud Gatewgy建立在 Spring5、Project Reactor 和 SpringBoot2 之上,使用非阻塞API
|
|
|
|
|
- SpringCloud Gateway 支持 WebSocket,并且与 Spring 紧密集成拥有更好的开发体验
|
|
|
|
|
---
|
|
|
|
|
- SpringCloud Gateway 三大核心概念(Route、Predicate、Filter)
|
|
|
|
|
- Route(路由):是构建网关的基本模块,由ID、URI、一系列的断言和过滤器组成
|
|
|
|
|
- Predicate(断言):可以匹配 HTTP 请求中所有的内容(请求头、参数等等),请求与断言相匹配则通过当前断言
|
|
|
|
|
- Filter(过滤器):包括全局和局部过滤器,可以在请求被路由前后对请求进行更改
|
|
|
|
|
- 用户 -> SpringCloud Gateway -> Predicate(s) -> Filter(s) -> Service
|
|
|
|
|
---
|
|
|
|
|
- SpringCloud Gateway 过滤器
|
|
|
|
|
- 全局过滤器和局部过滤器
|
|
|
|
|
- 全局过滤器作用于所有的路由,不需要单独配置,通常用来实现统一化处理的业务需求
|
|
|
|
|
- 局部过滤器实现并生效的三个步骤
|
|
|
|
|
- 需要实现 GatewayFiter, Ordered, 实现相关的方法
|
|
|
|
|
- 加入到过滤器工厂,并且将工厂注册到 Spring 容器中
|
|
|
|
|
- 在配置文件中进行配置,如果不配置则不启用此过滤器规则(路由规则)
|
|
|
|
|
---
|
|
|
|
|
- SpringCloud Gateway 路由的配置
|
|
|
|
|
- 常用的三种配置方式
|
|
|
|
|
- 在代码中注入 RouteLocator Bean,并手工编写配置路由定义
|
|
|
|
|
- 在 application.yml、bootstrap.yml 等配置文件中配置 spring.cloud.gateway
|
|
|
|
|
- 通过配置中心(Nacos)实现动态的路由配置
|
|
|
|
|
|