gateway--重点笔记

一 网关定义

所谓的API网关,就是指系统的统一入口,它封装了应用程序的内部结构,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑
可以在这里实现,诸如认证、鉴权、监控、路由转发等等。
 

二 Spring Cloud Gateway 功能特征

基于Spring Framework 5, Project Reactor 和 Spring Boot 2.0 进行构建;
动态路由:能够匹配任何请求属性;
支持路径重写;
集成 Spring Cloud 服务发现功能(Nacos、Eruka);
可集成流控降级功能(Sentinel、Hystrix);
可以对路由指定易于编写的 Predicate(断言)和 Filter(过滤器);

 

三 核心概念

路由(route)
路由是网关中最基础的部分,路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成。如果断言为真,则说明请求的URL和配置的路由匹配。
断言(predicates)
Java8中的断言函数,SpringCloud Gateway中的断言函数类型是Spring5.0框架中的ServerWebExchange。断言函数允许开发者去定义
匹配Http request中的任何信息,比如请求头和参数等。
过滤器(Filter)
SpringCloud Gateway中的filter分为Gateway FilIer和Global Filter。Filter可以对请求和响应进行处理。

 

四 大体流程

image

执行流程大体如下:
1. Gateway Client向Gateway Server发送请求
2. 请求首先会被HttpWebHandlerAdapter进行提取组装成网关上下文
3. 然后网关的上下文会传递到DispatcherHandler,它负责将请求分发给RoutePredicateHandlerMapping
4. RoutePredicateHandlerMapping负责路由查找,并根据路由断言判断路由是否可用
5. 如果过断言成功,由FilteringWebHandler创建过滤器链并调用
6. 请求会一次经过PreFilter--微服务--PostFilter的方法,最终返回响应

 

五 路由断言工厂

当请求gateway的时候, 使用断言对请求进行匹配, 如果匹配成功就路由转发, 如果匹配失败就返回404
类型:内置,自定义
基于Datetime类型的断言工厂
‐ After=2019‐12‐31T23:59:59.789+08:00[Asia/Shanghai]
基于远程地址的断言工厂
RemoteAddrRoutePredicateFactory:接收一个IP地址段,判断请求主机地址是否在地址段中 
 ‐ RemoteAddr=192.168.1.1/24
基于Cookie的断言工厂
CookieRoutePredicateFactory:接收两个参数,cookie 名字和一个正则表达式。 判断请求
cookie是否具有给定名称且值与正则表达式匹配。 
 ‐Cookie=chocolate, ch.
基于Header的断言工厂
HeaderRoutePredicateFactory:接收两个参数,标题名称和正则表达式。 判断请求Header是否具有给定名称且值与正则表达式匹配。 
 ‐Header=X‐Request‐Id, \d+
基于Host的断言工厂
HostRoutePredicateFactory:接收一个参数,主机名模式。判断请求的Host是否满足匹配规则
‐Host=**.testhost.org
基于Method请求方法的断言工厂
MethodRoutePredicateFactory:接收一个参数,判断请求类型是否跟指定的类型匹配
‐Method=GET
基于Path请求路径的断言工厂
PathRoutePredicateFactory:接收一个参数,判断请求的URI部分是否满足路径规则。 
‐Path=/foo/{segment}
基于Query请求参数的断言工厂
QueryRoutePredicateFactory :接收两个参数,请求param和正则表达式, 判断请求参数是否具有给定名称且值与正则表达式匹配。
 ‐Query=baz, ba.
基于路由权重的断言工厂
WeightRoutePredicateFactory:接收一个[组名,权重], 然后对于同一个组内的路由按照权重转发 
routes:
2 ‐id: weight_route1
3 uri: host1
4 predicates:
5 ‐Path=/product/**
6 ‐Weight=group3, 1
7 ‐id: weight_route2
8 uri: host2
9 predicates:
10 ‐Path=/product/**
11 ‐Weight= group3, 9

 

自定义路由断言工厂 
自定义路由断言工厂需要继承 AbstractRoutePredicateFactory 类,重写 apply 方法的逻辑。在 apply 方法中可以通过
exchange.getRequest() 拿到 ServerHttpRequest 对象,从而可以获取到请求的参数、请求方式、请求头等信息。 
1、必须spring组件 bean
2. 类必须加上RoutePredicateFactory作为结尾
3. 必须继承AbstractRoutePredicateFactory
4. 必须声明静态内部类 声明属性来接收 配置文件中对应的断言的信息
5. 需要结合shortcutFieldOrder进行绑定
6.通过apply进行逻辑判断 true就是匹配成功 false匹配失败
@Component
2 @Slf4j
3 public class CheckAuthRoutePredicateFactory extends AbstractRoutePredicateFactory<CheckAuthRoutePredicateFactory.Con
yml中配置
spring:
2 cloud:
3 gateway:
4 #设置路由:路由id、路由到微服务的uri、断言
5 routes:
6 ‐ id: order_route #路由ID,全局唯一
7 uri: http://localhost:8020 #目标微服务的请求地址和端口
8 predicates:
9 # 测试:http://localhost:8888/order/findOrderByUserId/1
10 ‐ Path=/order/** #Path路径匹配
11 #自定义CheckAuth断言工厂
12 ‐ CheckAuth=xushu

 

六 过滤器工厂

Gateway 内置了很多的过滤器工厂,我们通过一些过滤器工厂可以进行一些业务逻辑处理器,比如添加剔除响应头,添加去除参数
自定义过滤器工厂 
继承AbstractNameValueGatewayFilterFactory且我们的自定义名称必须要以GatewayFilterFactory结尾并交给spring管理

yml配置

spring:
2 cloud:
3 gateway:
4 #设置路由:路由id、路由到微服务的uri、断言
5 routes:
6 ‐ id: order_route #路由ID,全局唯一
7 uri: http://localhost:8020 #目标微服务的请求地址和端口
8 #配置过滤器工厂
9 filters:
10 ‐ CheckAuth=fox,男

 

全局过滤器
局部过滤器和全局过滤器区别:
局部:局部针对某个路由, 需要在路由中进行配置
全局:针对所有路由请求, 一旦定义就会投入使用

 

Gateway跨域配置(CORS Configuration)
spring:
2 cloud:
3 gateway:
4 globalcors:
5 cors‐configurations:
6 '[/**]':
7 allowedOrigins: "*"
8 allowedMethods:
9 ‐ GET
10 ‐ POST
11 ‐ DELETE
12 ‐ PUT
13 ‐ OPTION

 

gateway整合sentinel流控降级

待整理

 

 

 

 
 
 
 
 
posted @ 2026-04-18 19:55  OMGq  阅读(8)  评论(0)    收藏  举报