文章目录

  • 前言
  • 1. 内置断言工厂的介绍
  • 2. 内置断言工厂的使用(示例)
  • 2.1 BeforeRoutePredicateFactory工厂
  • 2.2 MethodRoutePredicateFactory工厂


前言

Predicate 断言,用于进行条件判断,只有断言都为真,才会真正的执行路由。

1. 内置断言工厂的介绍

SpringCloud Gateway包括许多内置的断言工厂,所有这些断言都与HTTTP请求的不同属性匹配。
具体如下:

  • 基于Datetime类型的断言工厂
    此类的断言根据时间来做判断,主要有三个
    AfterRoutePredicateFactory: 接收一个日期参数,判断请求日期是否晚于指定日期
    BeforeRoutePredicateFactory: 接收一个日期参数,判断请求日期是否早于指定日期
    BetweenRoutePredicateFactory: 接收两个日期参数,判断请求日期是否在指定时间段内
After=2021-12-12T23:59:59.123+08:00[Asia/Shanghai]
  • 基于远程地址的断言工厂
    RemoteAddrRoutePredicateFactory: 接收一个IP地址段,判断请求主机地址是否在地址段中
RemoteAddr=192.168.1.1/24
  • 基于Cookie的断言工厂
    CookieRoutePredicateFactory: 接收两个参数cookie名字和一个正则表达式。判断请求cookie是否具有给定名称且值与正则表达式匹配。
Cookie=chocolate,ch.
  • 基于Header的断言工厂
    HeaderRoutePredicateFactory: 接收两个参数,标题名称和正则表达式。判断请求Header是否具有给定名称且值与正则表达式匹配。
Header=X-Request-Id,\d+
  • 基于Host的断言工厂
    HostRoutePredicateFactory: 接收一个参数,主机名模式。判断请求的Host是否满足匹配条件。
Host=**.baidu.com
  • 基于Method请求方法的断言工厂
    MethodRoutePredicateFactory: 接收一个参数,判断请求类型是否跟指定的类型匹配。
Method=GET
  • 基于Path请求路径的断言工厂
    PathRoutePredicateFactory: 接收一个参数,判断请求的URI部分是否满足路径规则。
Path=/product-serv/{segment}
  • 基于Query请求参数的断言工厂
    QueryRoutePredicateFactory: 接收一个参数,请求param和正则表达式,判断请求参数是否具有给定名称值与正则表达式是否匹配。
Query=baz,ba.
  • 基于路由权重的断言工厂
    WeightRoutePredicateFactory: 接收一个[组名,权重],然后对于同一个组内的路由按照权重转发。
routes: #路由数组,满足什么条件,转发到什么微服务
        - id: product_route  #当前路由发的标识,需要唯一,默认是UUID
#          uri: http://localhost:8081 #请求最终转发的地址
          uri: lb://server-product #lb 指的是负载均衡,后面跟的是具体微服务的名称
          order: 1 #路由优先级 数值越小优先级越高
          predicates: #断言
            - Path=/product-serv/** #当请求路径满足Path指定的规则时,此路由信息才会正常转发
            - Weight=group3,1
          filters: #过滤器,在请求传递过程中,对请求做一些手脚
            - StripPrefix=1 #在请求转发之前去掉一层路径,例如 localhost:7000/product-serv/product/1-->localhost:8081/product/1
        - id: product_route2  #当前路由发的标识,需要唯一,默认是UUID
          #          uri: http://localhost:8081 #请求最终转发的地址
          uri: lb://server-product #lb 指的是负载均衡,后面跟的是具体微服务的名称
          order: 1 #路由优先级 数值越小优先级越高
          predicates: #断言
            - Path=/product-serv/** #当请求路径满足Path指定的规则时,此路由信息才会正常转发
            - Weight=group3,9
          filters: #过滤器,在请求传递过程中,对请求做一些手脚
            - StripPrefix=1 #在请求转发之前去掉一层路径,例如 localhost:7000/product-serv/product/1-->localhost:8081/product/1

springboot 断言类AssertUtil包装_gateway

2. 内置断言工厂的使用(示例)

2.1 BeforeRoutePredicateFactory工厂

springboot 断言类AssertUtil包装_正则表达式_02


重启gateway网关,发起请求。

springboot 断言类AssertUtil包装_微服务_03

把时间修改后,重启gateway,再次请求,断言为真,可以访问到接口。

springboot 断言类AssertUtil包装_架构_04


springboot 断言类AssertUtil包装_优先级_05

2.2 MethodRoutePredicateFactory工厂

在添加断言前,先测试POST是否可以请求,确认发起POST可以请求接口。

springboot 断言类AssertUtil包装_微服务_06


此时,设置Method=GET

springboot 断言类AssertUtil包装_正则表达式_07

发起POST请求,请求失败。而发起GET请求,则没问题。

springboot 断言类AssertUtil包装_优先级_08


springboot 断言类AssertUtil包装_架构_09