Gateway 网关之 Predicate 断言

Posted Alay

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gateway 网关之 Predicate 断言相关的知识,希望对你有一定的参考价值。

启动 Gateway 日志中会打印 加载的断言

(官网介绍:https://cloud.spring.io/spring-cloud-gateway/reference/html/#gateway-request-predicates-factories)

Loaded RoutePredicateFactory [After]
Loaded RoutePredicateFactory [Before]
Loaded RoutePredicateFactory [Between]
Loaded RoutePredicateFactory [Cookie]
Loaded RoutePredicateFactory [Header]
Loaded RoutePredicateFactory [Host]
Loaded RoutePredicateFactory [Method]
Loaded RoutePredicateFactory [Path]
Loaded RoutePredicateFactory [Query]
Loaded RoutePredicateFactory [ReadBody]
Loaded RoutePredicateFactory [RemoteAddr]
Loaded RoutePredicateFactory [Weight]
Loaded RoutePredicateFactory [CloudFoundryRouteService]

Predicate 是一个函数式接口

GatewayPredicate 是一个接口,实现类:

配置时命名规则为 前缀单词 XxxRoutePredicateFactory  命名为 Xxx,如:PathRoutePredicateFactory  配置时命名为 : Path

配置示例:

cloud:
  gateway:
    discovery:
      locator:
        enabled: true # 开启当前项目服务注册与发现功能,
        lower-case-service-id: true # 把服务名转换为小写,Eureka中默认都是大写
    routes:
      - id: demo #自定义唯一标识,只要不重复即可
        # lb:loadBalance 负载均衡 server-name 代理项目的名
        uri: lb://server-name
 
        # 路径规则,命名需要遵循,XxxRoutePredicateFactory 命名:Xxx,简单类型配置简化书写
        #          predicates: Path=/demo/**,/a/**,/b/**
 
        # 或者完整书写
        predicates:
          # 对应类型的命名前缀
          - name: Path
            # 对应可配置的参数集合
            args:
              # args 为 Map<String,String> 类型,Map类型配置 key: value
              key: value
             # PathRoutePredicateFactory 类中 内部类Config 类属性为 List<String> patterns,即可泛型为简单类型可以用","分隔如下:
                - patterns=/a/**,/b/**
 
          # 配置请求头断言
          - name: Header
            args:
              # 如校验请求头必须携带客户端来源: Origin=ios-App,regexp正则表达式
              - header: Origin
                regexp: IOS-App
              - header: My-Hearder
                regexp: my-hearder-value.*
 
        # 命名规则:
        filters:
          # 定义一个过滤器,格式:过滤器名称=参数  或者 name: 名字  args: 参数
          - StripPrefix=1 # 转发后忽略第一层

Query

设置必须包含的参数名。

下面两种写法等效。都表示路径满足    /demo/**    同时包含参数abc。

Path  和  Query  是断言。abc是请求参数名称。

在浏览器中输入: http://localhost:9000/demo/one?abc=jqk

predicates: Path=/demo/**,Query=abc
predicates:
  - Path=/demo/**
  - Query=abc

设置参数的值:

abc请求参数名称。jqk. 是abc的值,是一个正则表达式。在正则表达式中点(.)表示匹配任意一个字符。所以当请求参数abc=jqka或abc=jqkw能满足断言条件。

在断言中赋值使用逗号(,)赋值因为Query后面已经有等号,在值内容中不能在出现等号语法。

predicates:
  - Query=abc,jqk.

Header

表示请求头中必须包含的内容,参数名和参数值之间依然使用逗号,参数值要使用正则表达式,如果Header只有一个值表示请求头中必须包含的参数。如果有两个值,第一个表示请求头必须包含的参数名,第二个表示请求头参数对应值

predicates:
  - Header=Connection,keep-alive
  - Header=Cache-Control,max-age=0

两个参数:一个属性名称,一个正则表达式,这个属性的值和正则表达式匹配成功才会执行路由

- Header=X-Request-Id, \\d+   : 请求头要有 X-Request-Id ,并且值为 整数

执行测试:

curl http://localhost:11001/socket --H "X-Request-Id=1234"

Method:

Method表示请求方式。支持多个值,使用逗号分隔,表示多个值之间为 or 条件,如下: 表示 请求方式 为: GET  或者  POST

predicates:
  - Method=GET,POST

RemoteAddr:

允许访问的客户端地址。要注意使用127.0.0.1而不要使用localhost

predicates:
  - RemoteAddr=127.0.0.1,192.168.0.*

Host

匹配请求参数中Host参数的值。满足Ant模式(之前在Spring Security中学习过)可以使用

predicates:
  - Host=127.0.0.1:9000

Cookie:

要求请求中包含指定Cookie名和满足特定正则要求的值。Cookie必须有两个值,第一个Cookie包含的参数名,第二个表示参数对应的值,正则表达式。不支持一个参数写法:

predicates:
  - Cookie=age,.*

通过 curl 命令进行访问

Cookie Route Predicate 需要两个参数,一个是 cookieName,一个是正则表达式,路由会通过 CookieName 值 和正则表达式去匹配,如果匹配上就执行路由,否则不执行路由

curl http://localhost:11001/socket --cookie "age=18"

Before:

在指定时间点之前

predicates:
  - Before=2020-01-31T18:00:00.000+08:00[Asia/Shanghai]

After

限定什么时间之后路由可以生效

routes:
  # 路由ID,没有固定的规则要求,但要求唯一性,建议配合服务名
  - id: netty-socket
    # 匹配后提供服务的路由地址
    uri: lb://braineex-search
    predicates:
      # 断言,路径相匹配的才进行路由
      - Path=/socket/**
      - After=2020-12-23T14:06:18.250+08:00[Asia/Shanghai]

Between

时间区间范围内有效

- Between=2020-12-23T14:06:18.250+08:00[Asia/Shanghai],2021-12-23T14:06:18.250+08:00[Asia/Shanghai]

Weight

多版本服务发布的时候,偶尔使用。v1.0+v1.1两个版本同时发布服务。内容一致,实现机制不同。发布两个不同命名的服务集群。使用Gateway做负载均衡。

负载均衡中权重。同一个组中URI进行负载均衡。

语法:Weight=组名,负载均衡权重

在注册两个服务,这个服务(项目)是相同的,应用程序名分别叫做demo-one和demo-two。

Gateway在路由匹配时demo-one将占20%,demo-two将占80%

routes:
  - id: suiyi
    uri: lb://demo-one
    predicates:
      - Path=/demo/**
      - Weight=group,2
    filters: StripPrefix=1
  - id: suiyi2
    uri: lb://demo-two
    predicates:
      - Path=/demo/**
      - Weight=group,8
    filters: StripPrefix=1

 

本文来自博客园,作者:Vermeer,转载请注明原文链接:https://www.cnblogs.com/Alay/p/15150489.html

以上是关于Gateway 网关之 Predicate 断言的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud 统一网关Gateway -- 为什么需要网关Gateway快速入门路由断言工厂(Route Predicate Factory)

Spring Cloud Alibaba - 24 Gateway-路由断言(Predicate)过滤器(Filter)初体验

gateway网关路由匹配规则

Gateway新一代网关

Spring GateWay : 网关的转发细节

SpringCloud基础Gateway:微服务网关