系列学习 Gateway 之第 2 篇 —— 路由规则 predicate,动态路由配置

本篇博客基于: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 路由配置讲解到这。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值