开发者学堂课程【全面讲解 Spring Cloud Alibaba 技术栈(知识精讲+项目实战)第三阶段:Gateway 内置路由断言】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/685/detail/11890
Gateway 内置路由断言
内容介绍:
一、断言
二、内置路由断言工厂
三、内置路由断言工厂的使用
一、断言
Predicate(断言)用于进行条件判断,只有断言都返回真,才会真正的执行路由。
也有人将断言成为谓词,那么断言真正的含义是?
断言就是说:在什么条件下,才能进行路由转发
断言分为两部分:一是内置路由断言,二是自定义路由断言
内置路由断言:
1.内置路由断言工厂
SpringCloud Gateway 包括许多内置的断言工厂,所有这些断言都与 HTTP 请求的不同属性匹配。具体如下:
(1)基于于Datetime类型的断言工厂
此类型的断言根据时间做判断,主要有三个:
AfterRoutePredicateFactory:接收一个日期参数,判断请求日期是否晚于指定日期
BeforeRoutePredicateFactory:接收一个日期参数,判断请求日期是否早于指定日期
BetweenRoutePredicateFactory:接收两个日期参数,判断请求日期是否在指定时间段内
-After=2019-12-31T23:59:59.789+08:0O[Asia/Shanghai]
(2)基于远程地址的断言工厂
RemoteAddrRoutePredicateFactory:接收一个IP地址段,判断请求主机地址是否在地址段中
-RemoteAddr=92.168.1.1/24
(3)基于 Cookie 的断言工厂
CookieRoutePredicateFactory: 接收两个参数,cookie 名字和一个正则表达式。判断请求 cookie 是否具有给定名称且值与正则表达式匹配。
-(ookie=chocolate, ch.
(4)基于 Header 的断言工厂
HeaderRoutePredicateFactory:接收两个参数,标题名称和正则表达式。判断请求Header 是否具有给定名称且值与正则表达式匹配。
-Header=X-Request-ld,ld+
(5)基于 Host 的断言工厂
HostRoutePredicateFactory:接收一个参数,主机名模式。判断请求的 Host 是否满足匹配规则。
-Host=**.testhost.org
(6)基于 Method 请求方法的断言工厂
MethodRoutePredicateFactory:接收一个参数,判断请求类型是否跟指定的类型匹配。
-Method=GET
(7)基于 Path 请求路径的断言工厂
PathRoutePredicateFactory:接收一个参数,判断请求的URI部分是否满足路径规则。
-Path=/fool{segment}
(8)基于 Query 请求参数的断言工厂
QueryRoutePredicateFactory :接收两个参数,请求 param 和正则表达式,判断请求参数是否具有给定名称且值与正则表达式匹配。
-Query=baz, ba.
(9)基于路由权重的断言工厂
WeightRoutePredicateFactory:接收一个[组名,权重],然后对于同一个组内的路由按照权重转发
routes:
-id: weight_route1
uri: host1
predicates:
-Path=/product/**
-Weight=group3,1
-id: weight_route2
Uri:host2
Predicates:
-
Path=/product/**
-
Weight=group3,9
2.内置路由断言工厂的使用
我们用个例子来演示:
复制 before 一列=2019-11-28T00:00:00.000+08:00、
predicates: #
断言(条件判断,返回值是boolean转发请求要满足的条件)
- Path=/product-serv/** #
当请求路径满足Path指定的规则时,此路由信息才会正常转发
- Before=2020-11-28T00:00:00.000+08: 00
filters:#
过滤器(在请求传递过程中对请求做一些手脚)
-
S
tripPrefix=1 #
在请求转发之前去掉—层路径
访问 product-serv,
输入 localhost:7000/product-srev/product/1,
结果如下图
访问无问题
将数据改为2010,访问之后页面报错
说明只有当请求满足路径满足 Path 指定的规则时,此路由信息才会正常转发
我们再测 Method=GET,
将 Before=2010-11-28T00:00:00.000+08: 00删除
访问结果正常
将数据改为 POST,访问结果错误