gateway配置_Spring Cloud Alibaba#25.Gateway配置路由规则

8df3472f782fc370da18fd251e8cd706.png

本文讲解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

1302ebf28acb79d72db0f506a1038405.png

谓词

Spring Cloud Gateway 将路由作为 Spring WebFlux HandlerMapping 基础结构的一部分进行匹配。Spring Cloud Gateway 包含许多内置的路由谓词工厂。所有这些谓词都匹配 HTTP 请求的不同属性。多个谓词工厂可以通过逻辑与进行组合。

6df848ed93499a31405d76195e47a517.png
  • After 路由谓词工厂

After 路由谓词工厂采用一个 datetime 类型的参数。此谓词匹配当前日期时间之后发生的请求。

application.yml

3f7095b011f3f6c186b6579f6c60c0cc.png

此路由与 2017 年 1 月 20 日 17:42 MountainTime(Denver)之后的所有请求相匹配。

  • Before 路由谓词工厂

Before 路由谓词工厂采用一个 datetime 类型的参数。此谓词匹配当前日期时间之前发生的请求。

application.yml

663d9a37dbb582bd7df83f7a18ba323b.png

此路由与 2017 年 1 月 20 日 17:42 MountainTime(Denver)之后的所有请求相匹配。

  • Between 路由谓词工厂采用两个参数,datetime1 和datetime2。此谓词匹配datetime1 之后和 datetime2 之前发生的请求。datetime2 参数必须在 datetime1 之后。

4a56b861883be5d11c60e9a3c357316f.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

此路由与请求匹配的 cookie 名称为 chocolate,其值与 CH.P 正则表达式匹配。

  • Header 路由谓词工厂

Header 路由谓词工厂采用两个参数,Header 名称和正则表达式。此谓词与具有给定名称且值与正则表达式匹配的 Header 匹配。

application.yml

aa2da66ae2d46ff8396dcb2ee32c65c2.png

如果请求具有名为 X-Request-Id 的 Header,其值与d+正则表达式匹配(具有一个或多个数字的值),则该路由匹配。

  • Host 路由谓词工厂

Host 路由谓词工厂采用一个参数:主机名模式。该模式是一种 Ant 样式模式作为分隔符。此谓词与匹配该模式的主机头部匹配。

application.yml

c9e64a19f7f51012d22fe8dc311bcd56.png

如果请求的主机头部具有值http://www.somehost.org或http://beta.somehost.org,则此路由将匹配。

  • Method 路由谓词工厂

Method 路由谓词工厂采用一个参数:要匹配的 HTTP 方法。

application.yml

4fb89281a56bde97ad5bd6e5914265fd.png

如果请求方法是 GET,则此路由将匹配。

  • Path 路由谓词工厂

Path 路由谓词工厂采用一个参数:Spring PurthMatter 模式。

application.yml

35bd6af9d193ae75f8d4285a8bf8ada4.png

如果请求路径如:/foo/1 或/foo/bar,则此路由将匹配。

此谓词提取 URI 模板变量(如上面示例中定义的 segment)作为名称和值的映射,并将其放置在 ServerWebExchange.getAttributes()中,其中键定义在

PathRoutePre.e.URL_PREDICATE_VARS_ATTR 中。这些值随后可供网关过滤器工厂使用。

  • Query 路由谓词工厂

Query 路由谓词工厂采用两个参数:一个必需的参数和一个可选的正则表达式。

application.yml

4378b3789028a81b1e12d6b938ad5e8a.png

如果请求包含 baz 查询参数,此路由将匹配。

application.ym

d64bb8bf5ad9ad85d891c52016bf73f3.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

如果请求的远程地址为192.1681.10,则该路由将匹配。

. GatewayFilter 过滤器

路由过滤器允许以某种方式修改传入 HTTP 请求或传出 HTTP 响应。路由过滤器的作用域是特定的路由。Spring Cloud Gateway 包括许多内置的网关过滤器工厂。有关如何使用以下过滤器的更详细示例,请参阅unit tests 单元测试

过滤器

  • AddRequestHeader 过滤器

AddRequestHeader过滤器使用两个参数(name && value )

application.yml

f4f5f86ef86cfc193b1f14255deb7e6e.png

这个路由所有匹配请求的下游请求的头部中添加了 X-Request-red: blue。

AddRequestHeader通常用户匹配请求路径或者host中的变量。下面的例子中会将诸如 https://xxx.org/red/snzz 中的 snzz 放入 X-Request-red的value中。

application.yml

c8638638bd9697e75ee66bef3b8c5367.png
  • AddRequestParameter 添加参数过滤器

AddRequestParameter过滤器接受 name和 value参数

application.yml

bb5075b967c0d6ddfc9d11cc41b3ec6a.png

上面的例子中为所有请求的下游请求的查询字符串red=blue。

通常用于为指定请求路径或者域名的请求中添加请求参数,下面的例子中。会为http://myhost.org域名下的所有请求加上一个参数,假如访问的是http://dev.myhost.org,那么请求中就会加上一个foo=bar-dev的参数。

857d874f0cf9006597008a4be6df4102.png
  • AddResponseheader 过滤器

AddResponseHeader 采用 name和 value 参数:

77c812f77a57a1e6c5a1cfb6b7c7ac10.png

这将为所有匹配请求的下游响应头添加 X-Response-Red: Bar 头。

通常用于为指定请求路径或者域名的请求响应的消息头添加参数,下面的例子中。会为http://myhost.org域名下的所有请求响应体的头部加上一个参数,假如访问的是http://dev.myhost.org,那么响应头中就会加上一个foo=bar-dev的参数。

b74154af049991942d4c727675ac1785.png
  • DedupeResponseHeader 去重响应过滤器

DedupeResponseHeader接受一个name参数和一个可选的strategy 参数。Name可以包含以空格分隔的header名称列表。

610e892847fa18744f2f006c1a671639.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

可以参考下面的API文档来配置这个断路器。Resilience4J Documentation

  • 默认过滤器

你可以声明spring.cloud.gateway.default-filters来为所有的路由添加过滤器,这个属性是一个list。

application.yml

73b9efd75390e36e5a99c217939daabf.png

上面的配置会为httpbin请求路径下的请求的ResponseHeader中加入参数X-Response-Default-Red=Default-Blue。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值