本文编写一些测试例子来说下gateway中的内置路由谓词工厂。

文章目录

环境准备常见路由谓词工厂实战部分路径-谓词工厂后时刻-谓词工厂前时刻-谓词工厂时间段-谓词工厂cookie-谓词工厂方法-谓词工厂请求头-谓词工厂查询参数-谓词工厂主机-谓词工厂RemoteAddr/网段-路由谓词工厂权重-谓词工厂

本文小结

环境准备

为了测试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各种内置的路由谓词工厂,编写了简单的实例来进行说明。

好文推荐

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: