You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

138 lines
5.8 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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)实现动态的路由配置