-
gateway的主要功能之一是转发请求,转发规则的定义主要包含三个部分
组成 描述 路由 Route 路由是网关的基本单元, 由ID、URI、一组Predicate、一组Filter组成,根据Predicate进行匹配转发。 断言 Predicate 路由转发的判断条件,目前SpringCloud Gateway支持多种方式, 常见如:Path、Query、Method、Header等,写法必须遵循 key=vlue的形式 过滤器 Filter 过滤器是路由转发请求时所经过的过滤逻辑,可用于修改请求、响应内容 - 修改yml文件,
- 添加
-
routes: - id: consumer #自定义 uri: lb://service-consumer #访问路径 predicates: #断言 - Path=/consumer/** filters: #过滤器 - StripPrefix=1
7.3.2 predicates 断言
在 Spring Cloud Gateway 中 Spring 利用 Predicate 的特性实现了各种路由匹配规则,有通过 Header、请求参数等不同的条件,来进行作为条件匹配到对应的路由。
简单来说, Predicate 就是一组匹配规则,方便请求过来时,匹配到对应的 Route 进行处理。
-
Spring Cloud GateWay 内置多种 Predicate ,如下:
-
规则 | 实例 |
---|---|
Path | - Path=/gate/,/rule/ |
Before | - Before=2017-01-20T17:42:47.789-07:00[America/Denver] |
After | - After=2017-01-20T17:42:47.789-07:00[America/Denver] |
Between | - Between=2017-01-20T17:42:47.789-07:00[America/Denver],2017-01-21T17:42:47.789-07:00[America/Denver] |
Cookie | - Cookie=chocolate, ch.p |
Header | - Header=X-Request-Id, \d+ |
Host | - Host=www.hd123.com |
Method | - Method=GET |
Query | - Query=baz |
RemoteAddr | - RemoteAddr=192.168.1.1/24 |
-
实例1:通过请求参数匹配
spring: cloud: gateway: routes: - id: query uri: http://www.czxy.com predicates: - Query=my,123 #访问路径,有参数my将转发到www.czxy.com
http://localhost:10010/?my=123
-
实例2:通过请求路径匹配
spring: cloud: gateway: routes: - id: path uri: http://www.czxy.com predicates: - Path=/czxy/{flag} #
http://localhost:10010/czxy/666
-
总结:
-
各种 Predicates 同时存在于同一个路由时,请求必须同时满足所有的条件才被这个路由匹配。
-
一个请求满足多个路由的断言条件时,请求只会被首个成功匹配的路由转发
-
7.3.3 Filter 网关过滤器
-
路由过滤器允许以某种方式修改传入的HTTP请求或传出HTTP响应。
过滤规则 | 实例 | 说明 |
---|---|---|
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:跳过指定路径
-
spring: cloud: gateway: routes: - id: consumer uri: lb://service-consumer predicates: - Path=/consumer/** filters: - StripPrefix=1
-
实例2:添加前缀
#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:改写路径
#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 语法认为这是一个变量