Spring-Cloud-Gateway介绍(中篇)

转载请声明出处!

前言

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

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

项目依赖

我们采用最新的版本

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

配置

属性含义如下:

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功能。

在项目启动日志中,我们就能发现有很多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/get
Before 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
    自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

image.png

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值