写点什么

SpringCloud Gateway 入门实战(中篇)

作者:Java高工P7
  • 2021 年 11 月 11 日
  • 本文字数:2077 字

    阅读完需:约 7 分钟

配置


属性含义如下:


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


请求效果



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

代码实现


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

路由规则

Spring Cloud Gateway 的功能很强大,前面我们只是使用了 predicates 进行了简单 Path 的条件匹配,其实 Gataway 帮我们内置了很多 Predicates 功能。![图片](https://uploader.shimo.im/f/vdGj62wAy0okNq3o.png!thum


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


bnail)


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

Predicate 介绍

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



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



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

时间匹配

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



上面的配置 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,如下:



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



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

Cookie 匹配

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



不带 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"


返回正常


Header 匹配

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



上面的意思,就是请求头要有 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 参数就行,不管值为多少,即可路由

用户头像

Java高工P7

关注

还未添加个人签名 2021.11.08 加入

还未添加个人简介

评论

发布
暂无评论
SpringCloud Gateway入门实战(中篇)