是什么:SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty
Spring WebFlux 是 Spring 5.0 引入的新的响应式框架,区别于 Spring MVC,它不需要依赖Servlet API,它是完全异步非阻塞的,并且基于 Reactor 来实现响应式流规范
作用:
- 反向代理
- 鉴权
- 流量控制
- 熔断
- 日志监控
执行流程:
核心逻辑:路由转发+执行过滤器链
客户端 -----> Springcloud gateway ----->Gateway Handler Mapping(匹配对应的路由)------->Gateway Web Handler------->过滤器链(执行对应的业务)---->返回
过滤器可以在代理服务器执行前 后执行业务逻辑
执行在业务逻辑之前:做参数校验、权限校验、流量监控、日志输出、协议转换等
执行咋业务逻辑之后:在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控
网关路由的实现过程,基础操作在:com.capgemini.springcloud.Gateway9527
实现路由的两种方式:配置 初始化类(路由代替了ip+port,后面的路径还是要保持一致
动态路由:实现修改 URI改为服务名,lb协议代表开启负载均衡功能
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
#uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service #匹配后提供服务的路由地址 需要注意的是uri的协议为lb,表示启用Gateway的负载均衡功能。
predicates:
- Path=/payment/get/** # 断言,路径相匹配的进行路由
断言:为了实现一组匹配规则,让请求过来找到对应的Route进行处理
具体实现:
predicates:
- Path=/payment/lb/** # 断言,路径相匹配的进行路由
- After=2022-07-05T15:10:03.685+08:00[Asia/Shanghai] #满足这个时间后 才可以就行访问
#- Before=2020-02-05T15:10:03.685+08:00[Asia/Shanghai] #之前
#- Between=2020-02-02T17:45:06.206+08:00[Asia/Shanghai],2020-03-25T18:59:06.206+08:00[Asia/Shanghai] #中间
# - Cookie=username,zzyy #http://localhost:9527/payment/lb --cookie "username=zzyy" 带这个cookie访问
#- Header=X-Request-Id, \d+ # 请求头要有X-Request-Id属性并且值为整数的正则表达式 curl http://localhost:9527/payment/lb -H "X-Request-Id:123
- Host=**.atguigu.com #正确:curl http://localhost:9527/payment/lb -H "Host:" 满足最后是atguigu.com
- Query=username, \d+ # 要有参数名username并且值还要是整数才能路由 http://localhost:9527/payment/lb?username=31
过滤器:一般使用自定义过滤器(implements GlobalFilter,Ordered)
实现 全局日志记录
统一网关鉴权