本文编写一些测试例子来说下gateway中的内置路由谓词工厂。
文章目录
环境准备
为了测试gateway的使用,使用springboot搭建了简单服务。服务是注册在注册中心nacos中,网关没有在注册中心注册,后面介绍动态网关的时候再进行注册。
搭建了一个端口为8581的order服务
常见路由谓词工厂
官网给出的内置路由谓词工厂
实战部分
路径-谓词工厂
-Path=路径1
exmaple: 请求Url包含/order/**时触发路由 ,将请求转发到order-service服务中
具体配置如下:
server:
port: 8888
spring:
application:
name: api-gateway
cloud:
gateway:
#路由规则
routes:
#路由ID,唯一
- id: server-order
#目标URI,路由到微服务地址
uri: http://localhost:8581
#断言,判断条件
predicates:
#匹配对应URL的请求,将匹配到的请求追加在目标URI之后
- Path=/order/**
网关测试
先看实际效果,再分析
通过访问网关的http://localhost:8888/order/getNameAndPort 接口调用到了 order服务 localhost:8581/order/getNameAndPort 接口。这个是最简单,也是常用的路由规则。
后时刻-谓词工厂
可以设置一个时间点,当系统时间大于设置时间点时才会将请求进行路由。
– After=时刻
server:
port: 8888
spring:
application:
name: api-gateway
cloud:
gateway:
#路由规则
routes:
#路由ID,唯一
- id: server-order
#目标URI,路由到微服务地址
uri: http://localhost:8581
#断言,判断条件
predicates:
# [Asia/Shanghai] 为时间所对应的时区
- After=2020-10-10T21:21:21.993+08:00[Asia/Shanghai]
测试结果
这样设置后谓词工厂后呢,即是当系统时间(上海时区)大于2020年10月10日21点21分21秒后 ,才会将请求进行路由。
前时刻-谓词工厂
与后路径谓词工厂一样,一样是支持一个时间点设置,当当前请求时间小于设置的路由时间时,才会将请求进行路由。
– Before=时刻
server:
port: 8888
spring:
application:
name: api-gateway
cloud:
gateway:
#路由规则
routes:
#路由ID,唯一
- id: server-order
#目标URI,路由到微服务地址
uri: http://localhost:8581
#断言,判断条件
predicates:
# [Asia/Shanghai] 为时间所对应的时区
- Before=2022-10-10T21:21:21.993+08:00[Asia/Shanghai]
测试结果
时间段-谓词工厂
这个时间段路由谓词呢,实际就是 前时刻 后时刻 两个路由谓词的综合,其配置需要设置两个时间点,当请求时间在这两个时间点之间,则会触发路由,反之则不进行路由。
-Between=时刻1,时刻2
server:
port: 8888
spring:
application:
name: api-gateway
cloud:
gateway:
#路由规则
routes:
#路由ID,唯一
- id: server-order
#目标URI,路由到微服务地址
uri: http://localhost:8581
#断言,判断条件
predicates:
# [Asia/Shanghai] 为时间所对应的时区
- Between=2022-01-01T22:22:22.993+08:00[Asia/Shanghai],
2022-10-10T10:10:10.993+08:00[Asia/Shanghai]
测试结果
cookie-谓词工厂
看名字,即可猜出当前路由触发条件了,即当我们的请求包含某cookie的时候才会进行路由,
– Cookie=cookie名字,值(值支持正则表达式)
server:
port: 8888
spring:
application:
name: api-gateway
cloud:
gateway:
#路由规则
routes:
#路由ID,唯一
- id: server-order
#目标URI,路由到微服务地址
uri: http://localhost:8581
#断言,判断条件
predicates:
- Cookie=username,zs
如果按照我这么配置,那么我们的请求必须携带userme的cookie ,且其值必须为zs。
当cookie不满足时,则无法触发路由
方法-谓词工厂
所谓方法谓词工厂,即是根据HTTP请求类型匹配来路由,例如GET、POST、PUT、DELETE等等,可配置多种请求方法。
– Method=GET,POST
server:
port: 8888
spring:
application:
name: api-gateway
cloud:
gateway:
#路由规则
routes:
#路由ID,唯一
- id: server-order
#目标URI,路由到微服务地址
uri: http://localhost:8581
#断言,判断条件
predicates:
- Method=GET,POST
测试结果
当为put请求的时候
请求头-谓词工厂
例如我们在实际开发中,通常会设置一个token请求头,当有些接口需要登录访问,则会校验当前请求是否携带一个token请求头…
或者说,我们前后端交互的时候,要求前端向后端传输JSON格式的参数,那么在HTTP请求的时候,需要加上一个Content-Type= application/json 的一个键值对请求头…
我们的请求头谓词呢,即是要求当前HTTP请求必须携带定义的请求头才会触发路由
– Header=Authentication,zs
server:
port: 8888
spring:
application:
name: api-gateway
cloud:
gateway:
#路由规则
routes:
#路由ID,唯一
- id: server-order
#目标URI,路由到微服务地址
uri: http://localhost:8581
#断言,判断条件
predicates:
- Header=Authentication,zs
当我们的请求没有携带设置的请求头时
当我们的请求携带设置的请求头时
查询参数-谓词工厂
即当我们的请求中含有某个请求参数时,才会进行路由。此设置则只要求请求参数中必须携带参数名为:【参数名】
– Query=【参数名】
server:
port: 8888
spring:
application:
name: api-gateway
cloud:
gateway:
#路由规则
routes:
#路由ID,唯一
- id: server-order
#目标URI,路由到微服务地址
uri: http://localhost:8581
#断言,判断条件
predicates:
- Query=name
无设置的参数请求
有gateway路由谓词设置的参数请求
主机-谓词工厂
即需要我们的请求头中必须要携带设置的主机信息,才会对我们的请求进行路由。
主机名列表可设置多个,例如下边这样
– Host=主机1,主机2,主机3…
server:
port: 8888
spring:
application:
name: api-gateway
cloud:
gateway:
#路由规则
routes:
#路由ID,唯一
- id: server-order
#目标URI,路由到微服务地址
uri: http://localhost:8581
#断言,判断条件
predicates:
- Host=**.zs.org
** 则支持模糊匹配
携带Host信息的时候
不携带或者错误的host信息
RemoteAddr/网段-路由谓词工厂
当前谓词呢,即只接受设置的某一网段类的请求,当请求来自于某一网段时,才会触发路由
–RemoteAddr=192.168.0.1/24
server:
port: 8888
spring:
application:
name: api-gateway
cloud:
gateway:
#路由规则
routes:
#路由ID,唯一
- id: server-order
#目标URI,路由到微服务地址
uri: http://localhost:8581
#断言,判断条件
predicates:
- RemoteAddr=192.168.0.1/24
即当请求方的IP为192.168.0.1-192.168.0.24之间时,才会触发路由。
权重-谓词工厂
我们做后端的,都应该知道这个词:负载均衡。而在负载均衡中呢,又涉及到了负载的权重策略 ,例如随机、轮询、权重等。何为权重?权重,说白了就是某一因素对某一事物的重要程度,程度的高低则为权重的高低。
在路由谓词的时候即支持权重了,可根据我们配置的权重比,将请求进行相应量化的转发,其需要设置两个参数一个是group一个是weight,即权重分组和权重比。
– Weight=组, 权重比
server:
port: 8888
spring:
application:
name: api-gateway
cloud:
gateway:
#路由规则
routes:
#路由ID,唯一
- id: server-order
#目标URI,路由到微服务地址
uri: http://localhost:8581
#断言,判断条件
predicates:
- Weight=testWeight, 2
- id: server-order2
#目标URI,路由到微服务地址
uri: http://localhost:8582
#断言,判断条件
predicates:
- Weight=testWeight, 1
两次8581的服务,一次8582的服务
本文小结
本文介绍了现在常用的gateway各种内置的路由谓词工厂,编写了简单的实例来进行说明。