目录
1:断言工厂
定制软件开发路由断言工厂Route Predicate Factory
定制软件开发路由配置包括:
1. 路由id:定制软件开发路由的唯一标示
2. 路由目标(uri):定制软件开发路由的目标地址,http定制软件开发代表固定地址,lb定制软件开发代表根据服务名负载均衡
3. 路由断言(predicates):路由断言,定制软件开发判断请求是否符合要求,定制软件开发符合则转发到路由目的地
4. 定制软件开发定制软件开发路由过滤器(filters):路由过滤器,定制软件开发请求或响应做处理
示例:
定制软件开发我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件
例如Path=/consumer/**是按照路径匹配的一种规则,这个规则是由
org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory
类来
处理的,像这样的断言工厂在SpringCloudGateway还有十几个:
名称 | 说明 | 示例 |
---|---|---|
After | 是某个时间点后的请求 | - After=2037-01-20T17:42:47.789-07:00[America/Denver] |
Before | 是某个时间点之前的请求 | - Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai] |
Between | 是某两个时间点之前的请求 | - Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver] |
Cookie | 请求必须包含某些cookie | - Cookie=chocolate, ch.p |
Header | 请求必须包含某些header | - Header=X-Request-Id, \d+ |
Host | 请求必须是访问某个host(域名) | - Host=.somehost.org,.anotherhost.org |
Method | 请求方式必须是指定方式 | - Method=GET,POST |
Path | 请求路径必须符合指定规则 | - Path=/red/{segment},/blue/** |
Query | 请求参数必须包含指定参数 | - Query=name, Jack或者- Query=name |
RemoteAddr | 请求者的ip必须是指定范围 | - RemoteAddr=192.168.1.1/24 |
Weight | 权重处理 |
在官方网站的示例中可以找到
像示例中的Path,用到的是官网中5.8的路由断言工厂的规则
演示一下5.1中的断言工厂中的After规则
示例1:在2031年之后可访问,那当前时间肯定是不符合时间规则,所以无法通过判断进行了路由跳转,找不到报错404
- predicates: #断言,也就是判断请求是否复合路由规则的条件
- - Path=/consumer/** #这个是按照路径匹配,只要以/consumer/开头就符合要求
- - After=2031-01-20T17:42:47.789-07:00[Asia/Shanghai]
演示一下5.2中的断言工厂中的Before规则
示例2:在2031年之前可访问,那当前时间是符合时间规则,即可通过路由的跳转
示例3:通过请求参数匹配
- spring:
- cloud:
- gateway:
- routes:
- - id: query
- uri: http://www.czxy.com
- predicates:
- - Query=my,123
- #访问路径,有参数my将转发到www.czxy.com
- http://localhost:10010/?my=123
PredicateFactory的作用是什么呢?
断言工厂,读取配置中使用的是哪种断言工厂的规则,而后解析成对应的条件,将来请求进来了进行判断!
Path=/user/**是什么含义呢?
判断请求路径是否为user开头的规则条件,只要符合user开头就是符合了条件!
注意:
-
各种 Predicates 同时存在于同一个路由时,请求必须同时满足所有的条件才被这个路由匹配。
-
一个请求满足多个路由的断言条件时,请求只会被首个成功匹配的路由转发
2:过滤器工厂
GatewayFilter是中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:
-
路由过滤器允许以某种方式修改传入的HTTP请求或传出HTTP响应。对请求或者响应进行增强
2.1:路由过滤器的种类
链接:
Spring提供了31种不同的路由过滤器工厂,可到官网查看。例如:
过滤规则 | 实例 | 说明 |
---|---|---|
PrefixPath | - PrefixPath=/app | 对所有的请求路径添加前缀app |
RedirectTo | - RedirectTo=302, | 重定向,配置包含重定向的返回码和地址 |
RemoveRequestHeader | - RemoveRequestHeader=X-Request-Foo | 去掉某个请求头信息 |
RemoveResponseHeade | - RemoveResponseHeader=X-Request-Foo | 去掉某个响应头信息 |
RemoveRequestParameter | - RemoveRequestParameter=red | 去掉某个请求参数信息 |
RewritePath | - RewritePath=/where(?<segment>/?.), /test(?<segment>/?.) | 改写路径 /where/... 改成 /test/... |
SetPath | - SetPath=/{segment} | 设置请求路径,与RewritePath类似 |
SetRequestHeader | - SetRequestHeader=X-Request-Red, Blue | 设置请求头信息 |
SetStatus | - SetStatus=401 | 设置响应状态码 |
StripPrefix | - StripPrefix=2 | 跳过指定路径 |
RequestSize | - name: RequestSize args: maxSize: 5000000 | 请求大小 |
实例1:跳过指定路径(yml文件配置方法)
- spring:
- cloud:
- gateway:
- routes:
- - id: consumer
- uri: lb://service-consumer
- predicates:
- - Path=/consumer/**
- filters:
- - StripPrefix=1
实例2:添加前缀(yml文件配置方法)
- #rest --> http://localhost:10010/consumer/echo/123
- #fegin --> http://localhost:10010/consumer/feign/echo/123
-
- spring:
- cloud:
- gateway:
- routes:
- - id: PrefixPath
- uri: lb://service-consumer
- predicates:
- - Path=/consumer/**
- filters:
- - StripPrefix=1
- - PrefixPath=/feign
-
- #feign --> http://localhost:10010/consumer/echo/123
实例3:改写路径(yml文件配置方法)
- #rest --> http://localhost:10010/consumer/echo/123
-
- spring:
- cloud:
- gateway:
- routes:
- - id: RewritePath
- uri: lb://service-consumer
- predicates:
- - Path=/consumer/**
- filters:
- - RewritePath=/consumer(?<segment>/?.*), $\{segment}
- # 正则表达式详解:
- # ?<segment> --> 名称为 segment 的组
- # /? --> /出现0次或1次
- # .* --> 任意字符出现0次或多次
- # 总结:将 /?.*匹配到的结果捕获到名称为segment的组中
- # $\{segment} --> 将名称为 segment 的分组捕获到的文本置换到此处
- ## 注意,\的出现是由于避免 yaml 语法认为这是一个变量
2.2:请求头过滤器(示例官网过滤器工厂6.1程序演示)
下面我们以AddRequestHeader 为例。
需求:给所有进入service-consumer的请求添加一个请求头:Truth=I can succeed
只需要修改gateway服务的application.yml文件,添加路由过滤即可:
- #端口号
- server:
- port: 10010
- spring:
- application:
- name: test-gateway
- cloud:
- nacos:
- discovery:
- server-addr: localhost:8848 #nacos服务地址
- gateway:
- routes: # 网关路由配置
- - id: consumer #自定义,路由id,只要唯一即可
- uri: lb://service-consumer #访问路径,路由的目标地址 lb是负载均衡,后面跟着服务名称
- predicates: #断言,也就是判断请求是否复合路由规则的条件
- - Path=/consumer/** #这个是按照路径匹配,只要以/consumer/开头就符合要求
- - Before=2031-01-20T17:42:47.789-07:00[Asia/Shanghai]
- filters: #过滤器
- - AddRequestHeader=qx,I can succeed ! #添加请求头
- - StripPrefix=1 #跳过前缀进行访问,这里即使把请求参数中consumer跳过,发送请求
编写controller测试方法用来测试请求头中是否携带
- @RestController
- @RequestMapping("/user")
- public class UserController {
- /**
- * 测试过滤器工程,添加请求头
- * @param
- * @return
- */
- @GetMapping("/test")
- public String test(@RequestHeader("qx") String qx){
- return qx;
- }
当前过滤器写在service-consumer服务路由下,因此仅仅对访问service-consumer的请求有效。
2.3:默认过滤器
如果要对所有的路由都生效,则可以将过滤器工厂写到default下。格式如下:
- #端口号
- server:
- port: 10010
- spring:
- application:
- name: test-gateway
- cloud:
- nacos:
- discovery:
- server-addr: localhost:8848 #nacos服务地址
- gateway:
- routes: # 网关路由配置
- - id: consumer #自定义,路由id,只要唯一即可
- uri: lb://service-consumer #访问路径,路由的目标地址 lb是负载均衡,后面跟着服务名称
- predicates: #断言,也就是判断请求是否复合路由规则的条件
- - Path=/consumer/** #这个是按照路径匹配,只要以/consumer/开头就符合要求
- - Before=2031-01-20T17:42:47.789-07:00[Asia/Shanghai]
- default-filters: # 默认过滤项
- - AddRequestHeader=qx,I can succeed ! #添加请求头
2.4:总结
过滤器的作用是什么?
① 对路由的请求或响应做加工处理,比如添加请求头
② 配置在路由下的过滤器只对当前路由的请求生效
defaultFilters的作用是什么?
① 对所有路由都生效的过滤器