【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
**开源地址:https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB **
网上有一张图总结了 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
请求路径匹配
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
0.1/16 (其中 192.168.0.1 是 IP 地址,16 是子网掩码)。
predicates:
- RemoteAddr=192.168.1.1/24