转载

Spring Cloud Gateway介绍(中篇)

前篇我们介绍了Gateway的由来,这一篇我们 介绍一下Gateway的使用 ,希望能够帮到小伙伴们。

Gateway网关路由有两种配置方式: 1、在配置文件yml中配置 2、代码中注入RouteLocator的Bean 这两种方式是等价的,建议使用yml配置方式

项目依赖

我们采用最新的版本

Spring Cloud Gateway介绍(中篇)

因为Gateway使用的是Netty + webflux,所以不需要引入web模块;只要引入spring-cloud-starter-gateway就行了,里面 包含了spring-boot-starter-webflux 注:什么是webflux,老顾以后介绍

配置

Spring Cloud Gateway介绍(中篇)

属性含义如下:

id:我们自定义的路由 ID,保持唯一 uri:目标服务地址 predicates:路由条件,Predicate 接受一个输入参数,返回一个布尔值结果。该属性包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)

请求效果

Spring Cloud Gateway介绍(中篇)

上面这段配置的意思是,配置了一个id为route-name的路由规则,当访问地址 http://localhost:8080/get 时会自动转发到地址:httpbin.org:80/get

代码实现

Spring Cloud Gateway介绍(中篇)

效果和配置方式是一样的。 上面我们简单的用两个案例演示了Gateway的路由转发,下面我们 详细介绍一下路由规则

路由规则

Spring Cloud Gateway 的功能很强大,前面我们只是使用了 predicates 进行了简单Path的条件匹配,其实Gataway帮我们 内置了很多 Predicates 功能。

Spring Cloud Gateway介绍(中篇)

在项目启动日志中,我们就能发现有 很多PredicateFactory 。Gateway 是通过Spring WebFlux的 HandlerMapping做为底层支持来匹配到转发路由 ,这些 Predicates 工厂通过 不同的HTTP请求参数来匹配 ,多个 Predicates 工厂可以 组合使用

Predicate 介绍

Predicate 来源于 Java 8, Predicate 接受一个输入参数,返回一个布尔值结果 。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑 (比如:与,或,非)。

Spring Cloud Gateway介绍(中篇)

在 Spring Cloud Gateway 中 Spring 利用 Predicate 的特性实现了各种路由匹配规则 ,有通过 Header、请求参数等 不同的条件来进行作为条件匹配到对应的路由 。 网上有一张图总结了 Spring Cloud 内置的几种 Predicate 的实现。

Spring Cloud Gateway介绍(中篇)

上图中,很清晰的说明了各个工厂的规则,说到底Predicate就是为了实现一组匹配规则,方便让请求过来找到对应的 Route 进行处理。

时间匹配

Gateway支持 设置一个时间 ,在请求进行转发的时候, 可以通过判断在这个时间之前或者之后进行转发 。比如我们现在设置只有在2019年9月10日才会路由转发,在这之前不进行转发,我就可以这样配置:

Spring Cloud Gateway介绍(中篇)

上面的配置After属性,设置时间,代表在这时间之后才能匹配;我们设置的是2019-9-10,这里的时间通过 ZonedDateTime来对时间进行的对比 ,ZonedDateTime 是 Java 8 中日期时间功能里,用于 表示带时区的日期与时间信息的类 ,ZonedDateTime 支持通过时区来设置时间,中国的时区是:Asia/Shanghai。

上面的示例是指, 请求路径为/get,且请求时间在 2019年9月10日0点0分0秒之后的所有请求都转发到地址http://httpbin.org:80 。+08:00是指时间和UTC时间相差八个小时,时间地区为Asia/Shanghai。

添加完路由规则之后,如果 当地时间为9月4日访问地址http://localhost:8080/get不会转发 ,如果是 9月10日会自动转发到http://httpbin.org:80/getBefore Route Predicate 刚好相反 ,在某个时间之前的请求都进行转发。 我们把上面路由规则中的 After 改为 Before,如下:

Spring Cloud Gateway介绍(中篇)

就表示在这个 时间之前可以进行路由,在这时间之后停止路由 。 有了时间前与时间后,当然就会有 时间之间Between ,如下:

Spring Cloud Gateway介绍(中篇)

意思一看就能看出,在两时间之间即可路由,不在不可路由。

Cookie 匹配

Cookie Route Predicate 可以接收两个参数, 一个是 Cookie name ,一个是正则表达式 ,路由规则会通过 获取对应的 Cookie name 值和正则表达式去匹配 ,如果 匹配上就会执行路由 ,如果 没有匹配上则不执行

Spring Cloud Gateway介绍(中篇)

不带cookies访问

curl http://localhost:8080/get  //不带cookies
复制代码

返回404

{"timestamp":"2019-09-04T09:28:45.726+0000","path":"/get","status":404,"error":"Not Found","message":null}
复制代码

带上cookies访问,且userId为1

curl http://localhost:8080/get --cookie "userId=1"
复制代码

返回正常

Spring Cloud Gateway介绍(中篇)

Header 匹配

Header Predicate 和 Cookie Predicate 一样,也是接收 2 个参数, 一个 header 中属性名称和一个正则表达式 ,这个 属性值和正则表达式匹配则执行

Spring Cloud Gateway介绍(中篇)

上面的意思,就是请求头要有token属性,并且值为整数的正则表达式

curl http://localhost:8080/get  -H "token:12" 
复制代码

返回正常,将参数-H "token:12"改为-H "token:hello"再次执行时返回404证明没有匹配。

下面老顾就介绍快点,因为比较简单,一通百通

Host 匹配

Host Route Predicate 接收一组参数,一组匹配的域名列表,这个模板是一个 ant 分隔的模板, 用.号作为分隔符 。它通过参数中的主机地址作为匹配规则。

predicates:
   - Host=**.toutiao.com
复制代码

请求匹配上的

curl http://localhost:8080/get  -H "Host: www.toutiao.com" 
curl http://localhost:8080/get  -H "Host: md.toutiao.com" 
复制代码

请求方式匹配

通过请求的方式是 POST、GET、PUT、DELETE 等进行路由。

predicates:
    - Method=GET          //或者POST,PUT
复制代码

请求路径匹配

Path Route Predicate 接收一个匹配路径的参数来判断是否走路由。

predicates:
    - Path=/get/{segment}
复制代码

如果请求路径符合要求,则此路由将匹配,例如:/get/1 或者 /get/bar。

请求参数匹配

Query Route Predicate 支持传入两个参数,一个是属性名,一个为属性值,属性值可以是正则表达式。

predicates:
   - Query=token
复制代码

只有属性名token,表示只要有token参数就行,不管值为多少,即可路由

predicates:
    - Query=token, /d+
复制代码

表示不但要有参数名token,值还要是整数才能路由

请求 ip 地址匹配

通过设置某个 ip 区间号段的请求才会路由, RemoteAddr Route Predicate 接受 cidr 符号(IPv4 或 IPv6 )字符串的列表(最小大小为1) ,例如 192.168.0.1/16 (其中 192.168.0.1 是 IP 地址,16 是子网掩码)。

predicates:
   - RemoteAddr=192.168.1.1/24
复制代码

如果请求的远程地址是 192.168.1.10,则此路由将匹配。

组合使用

predicates:
    - Host=**.toutiao.com
    - Path=/get
    - Method=GET
    - Query=token
    - After=2019-01-20T06:06:06+08:00[Asia/Shanghai]
复制代码

各种 Predicates 同时存在于同一个路由时,请求必须同时满足所有的条件才被这个路由匹配

原文  https://juejin.im/post/5d8ad519e51d4578502c2450
正文到此结束
Loading...