本篇博客基于:https://blog.csdn.net/BiandanLoveyou/article/details/117323743
路由规则 predicate 也叫谓词,这些Predict的源码在org.springframework.cloud.gateway.handler.predicate 包中,列举各种 predicate :
在上图中,有很多类型的 predicate。比如说时间类型的 Predicated(AfterRoutePredicateFactory BeforeRoutePredicateFactory BetweenRoutePredicateFactory),当只有满足特定时间要求的请求会进入到此 predicate 中,并交由 router 处理;cookie类型的CookieRoutePredicateFactory,指定的 cookie 满足正则匹配,才会进入此 router。以及 host、method、path、querparam、remoteaddr 类型的 predicate,每一种 predicate 都会对当前的客户端请求进行判断,是否满足当前的要求,如果满足则交给当前请求处理。如果有很多个 Predicate,并且一个请求满足多个Predicate,则按照配置的顺序第一个生效。
路由规则之 Path
OK,上一篇博客已经讲解了 Gateway 的入门,并且展示了路由规则里的 Path(请求路径正则表达式匹配指定值)。博客地址:https://blog.csdn.net/BiandanLoveyou/article/details/117323743
spring:
application:
name: gateway-server
cloud:
gateway:
routes:
# 路由的 ID,没有固定规则但要求唯一,建议配合服务名
# 产品微服务路由
- id: product-server
# 匹配后提供服务的路由地址
uri: http://${eureka.instance.hostname}:9090/
# 断言,路径相匹配的进行路由,配置服务端的方法路径
predicates:
- Path=/product/**
为了快速学习,这里只展示 predicates 的配置部分,其它的配置跟 Path 的一致。
路由规则之 Query
Query 路由有2个参数:一个参数名和一个参数值的正则表达式(非必选)。
- Query=token,get.*
在上面的配置文件中,配置了请求中含有参数 token,并且 token 的值匹配 get 开头,则请求命中路由,能够被正确路由转发。如访问:http://127.0.0.1:9999/product/1?token=getName
路由规则之 Method
- Method=GET
在上面的配置中,所有的 GET 类型的请求都会路由转发到配置的 uri。
如访问:http://127.0.0.1:9999/product/1
但是 POST 请求是无法被路由的。
路由规则之 datetime
datetime 有3种:After、Before、Between。这里讲解 After。
- After=2021-05-28T08:08:08+08:00[Asia/Shanghai]
当请求的时间在这个配置的时间之后,请求会被路由到对应的 URI 上。
路由规则之 RemoteAddr
- RemoteAddr=192.168.0.104/0 # 匹配192.168.0.104地址,0表示子网掩码
这是远程地址的匹配规则,只有匹配到了该 IP 地址,才会被路由。
路由规则之 Header
- Header=X-Request-Id, \d+
在上面的配置中,当请求的Header中有 X-Request-Id 的header名,且 header 值为数字时,请求会被路由到配置的 uri。
使用 postman 发送请求:
Gateway 动态路由
在实际开发过程中,我们都是使用动态路由比较多,上面讲述的几种路由,只是小打小闹而已,实际项目中很少用到,比如我们后期要修改什么路由规则,难道要修改代码,重新发布版本?
1、动态获取 URI
我们修改 Gateway 的配置文件
spring:
application:
name: gateway-server
cloud:
gateway:
routes:
# 路由的 ID,没有固定规则但要求唯一,建议配合服务名
# 产品微服务路由
- id: product-server
# 根据服务名称从注册中心获取服务地址
uri: lb://product-server
# 断言
predicates:
- Path=/product/**
注意到 uri 的配置: lb://product-server ,其中,lb 表示 loadbalance 负载均衡的缩写。会根据服务名称从注册中心获取服务地址。
这种方式也不够好,在实际开发中,如果增加、删除某个微服务,还是要修改代码,重新发布版本。
2、服务名称转发
spring:
application:
name: gateway-server
cloud:
gateway:
discovery:
locator:
# 是否与注册中心进行结合,通过服务ID转发到具体的服务实例
enabled: true #是否开启基于服务发现的路由规则
lower-case-service-id: true #是否将服务名称转为小写
这里我们配置 discovery,让 Gateway 与注册中心结合,通过服务ID去转发到具体的服务中。
重启 Gateway 服务,这时候我们如果想访问产品微服务,就要输入网关地址 + 产品微服务的服务名称:http://127.0.0.1:9999/product-server/product/1
想访问订单微服务,就要输入网关地址 + 订单微服务的名称:
http://127.0.0.1:9999/order-server/order/1
OK,Gateway 路由配置讲解到这。