![8df3472f782fc370da18fd251e8cd706.png](https://i-blog.csdnimg.cn/blog_migrate/d146ccaa21c48e71e88012f04c95c2f5.jpeg)
本文讲解Gateway如何配置路由规则
笔记对应学习视频:
https://www.itlaoqi.com/chapter/2667.html
三个关键名词
-
- Route(路由):网关的转发规则,例如localhost:9000/article-service/list转发至localhost:8100/list
- Predicate(谓词):路由的生效条件
- After=2020-10-04T00:00:00.000+08:00[Asia/Shanghai] 代表2020年10月4日凌晨路由规则生效
- Filter(过滤器):允许修改请求以及响应的内容
- 例如:路由转发时在请求头附加"auth"信息等操作
![db0833588073eeaa6b71e4fa50c062bc.png](https://i-blog.csdnimg.cn/blog_migrate/121c04198ac6173007eaadd32bc052e5.png)
![1302ebf28acb79d72db0f506a1038405.png](https://i-blog.csdnimg.cn/blog_migrate/e95f89cfe2f821dd07b89e036ac7748f.jpeg)
谓词
Spring Cloud Gateway 将路由作为 Spring WebFlux HandlerMapping 基础结构的一部分进行匹配。Spring Cloud Gateway 包含许多内置的路由谓词工厂。所有这些谓词都匹配 HTTP 请求的不同属性。多个谓词工厂可以通过逻辑与进行组合。
![6df848ed93499a31405d76195e47a517.png](https://i-blog.csdnimg.cn/blog_migrate/a3d37be62d12b6a5228fd24935ef8a76.jpeg)
- After 路由谓词工厂
After 路由谓词工厂采用一个 datetime 类型的参数。此谓词匹配当前日期时间之后发生的请求。
application.yml
![3f7095b011f3f6c186b6579f6c60c0cc.png](https://i-blog.csdnimg.cn/blog_migrate/4888de743bb597729f5a31d949399f2e.png)
此路由与 2017 年 1 月 20 日 17:42 MountainTime(Denver)之后的所有请求相匹配。
- Before 路由谓词工厂
Before 路由谓词工厂采用一个 datetime 类型的参数。此谓词匹配当前日期时间之前发生的请求。
application.yml
![663d9a37dbb582bd7df83f7a18ba323b.png](https://i-blog.csdnimg.cn/blog_migrate/6a124db6da494d5d907660b707fc8b37.png)
此路由与 2017 年 1 月 20 日 17:42 MountainTime(Denver)之后的所有请求相匹配。
- Between 路由谓词工厂采用两个参数,datetime1 和datetime2。此谓词匹配datetime1 之后和 datetime2 之前发生的请求。datetime2 参数必须在 datetime1 之后。
![4a56b861883be5d11c60e9a3c357316f.png](https://i-blog.csdnimg.cn/blog_migrate/0d7a9f2b14c0d3132a385c4e96bba3cd.png)
此路由与 2017 年 1 月 20 日 17:42 Mountain Time (Denver)之后和 2017 年 1 月 21 日17:42 Mountain Time (Denver)之前的所有请求相匹配,这对维护窗口很有用。
- Cookie 路由谓词工厂
Cookie 路由谓词工厂采用两个参数,cookie 名称和正则表达式。此谓词匹配具有给定名称的 cookie,值与正则表达式匹配。
application.yml
![e231cd0712bf8157cb73f1f8cda153e1.png](https://i-blog.csdnimg.cn/blog_migrate/5bd223504ceec74ff548767866447bae.png)
此路由与请求匹配的 cookie 名称为 chocolate,其值与 CH.P 正则表达式匹配。
- Header 路由谓词工厂
Header 路由谓词工厂采用两个参数,Header 名称和正则表达式。此谓词与具有给定名称且值与正则表达式匹配的 Header 匹配。
application.yml
![aa2da66ae2d46ff8396dcb2ee32c65c2.png](https://i-blog.csdnimg.cn/blog_migrate/d9f7d79dfb218173aea03fe5ffd8a502.png)
如果请求具有名为 X-Request-Id 的 Header,其值与d+正则表达式匹配(具有一个或多个数字的值),则该路由匹配。
- Host 路由谓词工厂
Host 路由谓词工厂采用一个参数:主机名模式。该模式是一种 Ant 样式模式作为分隔符。此谓词与匹配该模式的主机头部匹配。
application.yml
![c9e64a19f7f51012d22fe8dc311bcd56.png](https://i-blog.csdnimg.cn/blog_migrate/865b32a09bc2615980d3160a9e74d03b.png)
如果请求的主机头部具有值http://www.somehost.org或http://beta.somehost.org,则此路由将匹配。
- Method 路由谓词工厂
Method 路由谓词工厂采用一个参数:要匹配的 HTTP 方法。
application.yml
![4fb89281a56bde97ad5bd6e5914265fd.png](https://i-blog.csdnimg.cn/blog_migrate/ae66cb97aebd2c09ec71e37fe661e2c3.png)
如果请求方法是 GET,则此路由将匹配。
- Path 路由谓词工厂
Path 路由谓词工厂采用一个参数:Spring PurthMatter 模式。
application.yml
![35bd6af9d193ae75f8d4285a8bf8ada4.png](https://i-blog.csdnimg.cn/blog_migrate/86f8de523b2ee8a65a8927840aea4200.png)
如果请求路径如:/foo/1 或/foo/bar,则此路由将匹配。
此谓词提取 URI 模板变量(如上面示例中定义的 segment)作为名称和值的映射,并将其放置在 ServerWebExchange.getAttributes()中,其中键定义在
PathRoutePre.e.URL_PREDICATE_VARS_ATTR 中。这些值随后可供网关过滤器工厂使用。
- Query 路由谓词工厂
Query 路由谓词工厂采用两个参数:一个必需的参数和一个可选的正则表达式。
application.yml
![4378b3789028a81b1e12d6b938ad5e8a.png](https://i-blog.csdnimg.cn/blog_migrate/9c1f615effb072e9c8cc1550e606ba5c.png)
如果请求包含 baz 查询参数,此路由将匹配。
application.ym
![d64bb8bf5ad9ad85d891c52016bf73f3.png](https://i-blog.csdnimg.cn/blog_migrate/ccd78e8882a22e9fa2820cc59757c193.png)
如果请求包含一个 foo 查询参数,它的值与 ba.正则表达式匹配,则此路由将匹配,所以bar 和 baz 都将匹配。
- RemoteAddr 路由谓词工厂
RemoteAddr 路由谓词工厂采用 CIDR 符号(IPv4 或 IPv6)字符串的列表(最小值为1),例如 192.168.0.1/16(其中 192.168.0.1 是 IP 地址,16 是子网掩码)。
application.yml
![0289dcf3a556edcb9638f6eddd170e2a.png](https://i-blog.csdnimg.cn/blog_migrate/33526d509f7df280861b3738739e5171.png)
如果请求的远程地址为192.1681.10,则该路由将匹配。
. GatewayFilter 过滤器
路由过滤器允许以某种方式修改传入 HTTP 请求或传出 HTTP 响应。路由过滤器的作用域是特定的路由。Spring Cloud Gateway 包括许多内置的网关过滤器工厂。有关如何使用以下过滤器的更详细示例,请参阅unit tests 单元测试
过滤器
- AddRequestHeader 过滤器
AddRequestHeader过滤器使用两个参数(name && value )
application.yml
![f4f5f86ef86cfc193b1f14255deb7e6e.png](https://i-blog.csdnimg.cn/blog_migrate/882286cae643de781265e7990b609d40.png)
这个路由所有匹配请求的下游请求的头部中添加了 X-Request-red: blue。
AddRequestHeader通常用户匹配请求路径或者host中的变量。下面的例子中会将诸如 https://xxx.org/red/snzz 中的 snzz 放入 X-Request-red的value中。
application.yml
![c8638638bd9697e75ee66bef3b8c5367.png](https://i-blog.csdnimg.cn/blog_migrate/7326dc46c65301f7d1f03ad4b3478e15.png)
- AddRequestParameter 添加参数过滤器
AddRequestParameter过滤器接受 name和 value参数
application.yml
![bb5075b967c0d6ddfc9d11cc41b3ec6a.png](https://i-blog.csdnimg.cn/blog_migrate/8911d72e8f1f8daa257bcc4c6117ae0a.png)
上面的例子中为所有请求的下游请求的查询字符串red=blue。
通常用于为指定请求路径或者域名的请求中添加请求参数,下面的例子中。会为http://myhost.org域名下的所有请求加上一个参数,假如访问的是http://dev.myhost.org,那么请求中就会加上一个foo=bar-dev的参数。
![857d874f0cf9006597008a4be6df4102.png](https://i-blog.csdnimg.cn/blog_migrate/9eb9012998cec1180aee7bcbda5c2aa3.png)
- AddResponseheader 过滤器
AddResponseHeader 采用 name和 value 参数:
![77c812f77a57a1e6c5a1cfb6b7c7ac10.png](https://i-blog.csdnimg.cn/blog_migrate/936f899c5aa958470920cb0e552fd8db.png)
这将为所有匹配请求的下游响应头添加 X-Response-Red: Bar 头。
通常用于为指定请求路径或者域名的请求响应的消息头添加参数,下面的例子中。会为http://myhost.org域名下的所有请求响应体的头部加上一个参数,假如访问的是http://dev.myhost.org,那么响应头中就会加上一个foo=bar-dev的参数。
![b74154af049991942d4c727675ac1785.png](https://i-blog.csdnimg.cn/blog_migrate/4a2f217dfd413b4c8386b0d3cf6f9538.png)
- DedupeResponseHeader 去重响应过滤器
DedupeResponseHeader接受一个name参数和一个可选的strategy 参数。Name可以包含以空格分隔的header名称列表。
![610e892847fa18744f2f006c1a671639.png](https://i-blog.csdnimg.cn/blog_migrate/8dd706d111f7d649a9b1cce26ac79f45.png)
在网关 CORS 逻辑和下游逻辑都添加了Access-Control-Allow-Credentials和Access-Control-Allow-Origin响应头的情况下,这将删除重复的值。
DedupeResponseHeader过滤器还接受一个可选的策略参数。接受的值是 RETAIN_FIRST (默认值:保留第一个)、 RETAIN_FIRST (保留最后一个)和 RETAIN_UNIQUE(保留唯一的)。
- Spring Cloud CircuitBreaker
Spring Cloud 断路器网关过滤器工厂使用 Spring Cloud 断路器 api 将网关路由包裹在断路器中。 支持多个可以与 Spring 云网关一起使用的库。 Spring Cloud 开箱即用地支持Resilience4J。
要启用 Spring Cloud CircuitBreaker 过滤器,需要将 Spring-Cloud-starter-CircuitBreaker-reactor-resilience4j 放在类路径上。
application.yml
![1a63dd162f6d0205473a7a2445b38e3d.png](https://i-blog.csdnimg.cn/blog_migrate/9e269081337e0c7befc30afb3946ac04.png)
可以参考下面的API文档来配置这个断路器。Resilience4J Documentation
- 默认过滤器
你可以声明spring.cloud.gateway.default-filters来为所有的路由添加过滤器,这个属性是一个list。
application.yml
![73b9efd75390e36e5a99c217939daabf.png](https://i-blog.csdnimg.cn/blog_migrate/a060f3e8eb978bc61edbf06ad582c4ad.png)
上面的配置会为httpbin请求路径下的请求的ResponseHeader中加入参数X-Response-Default-Red=Default-Blue。