微服务网关组件 - Spring Cloud Gateway 内置的路由谓词工厂

本文基于Spring Cloud Greenwich SR2


内置的路由谓词工厂

Spring Cloud Gateway内置了一系列的路由谓词工厂,以便我们可以在开发中灵活的使用Gateway进行请求转发。我这里将Gateway内置的所有路由谓词工厂整理成了表格,如下:

路由谓词工厂 作用 参数
After 当且仅当请求时的时间After配置的时间时,才转发该请求 一个带有时区的具体时间
Before 当且仅当请求时的时间Before配置的时间时,才转发该请求 一个带有时区的具体时间
Between 当且仅当请求时的时间Between配置的时间段时,才转发该请求 一个带有时区的具体时间段
Cookie 当且仅当请求时携带的Cookie名称及值与配置的名称及值相符时,才转发该请求 Cookie的名称及值,支持使用正则表达式来匹配值
Header 当且仅当请求时携带的Header名称及值与配置的名称及值相符时,才转发该请求 Header的名称及值,支持使用正则表达式来匹配值
Host 当且仅当请求时名为Host的Header的值与配置的值相符时,才转发该请求 Host的值,支持配置多个且支持使用通配符
Method 当且仅当请求时所使用的HTTP方法与配置的请求方法相符时,才转发该请求 HTTP请求方法,例如GET、POST等
Path 当且仅当请求时所访问的路径与配置的路径相匹配时,才转发该请求 通配符、占位符或具体的接口路径,可以配置多个
Query 当且仅当请求时所带有的参数名称与配置的参数名称相符时,才转发该请求 参数名称和参数值(非必须),支持使用正则表达式对参数值进行匹配
RemoteAddr 当且仅当请求时的IP地址与配置的IP地址相符时,才转发该请求 IP地址或IP段

相关源码也整理成了思维导图:

image

After

配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: lb://example-service
        predicates:
        # 当且仅当请求时的时间After配置的时间时,才转发该请求
        # 若请求时的时间不是After配置的时间时,则会返回404 not found
        - After=2018-08-16T11:34:42.917822900+08:00[Asia/Shanghai]

注意:当predicates配置项只配置了一个Predicate且没有配置Path时,Path的默认值为/**。所以该段配置会使访问 GATEWAY_URL/** 时转发到 user-center微服务的/**

Tips:使用以下代码可以打印带有时区的当前时间,然后再自行修改成特定时间即可:

System.out.println(ZonedDateTime.now());


Before

配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: before_route
        uri: lb://example-service
        predicates:
        # 当且仅当请求时的时间Before配置的时间时,才转发该请求
        - Before=2018-08-16T11:34:42.917822900+08:00[Asia/Shanghai]

Between

配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: between_route
        uri: lb://example-service
        predicates:
        # 当且仅当请求时的时间Between配置的时间段时,才转发该请求
        - Between=2018-08-16T11:34:42.917822900+08:00[Asia/Shanghai], 2028-08-16T11:34:42.917822900+08:00[Asia/Shanghai]

Cookie

配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: cookie_route
        uri: lb://example-service
        predicates:
        # 当且仅当请求带有名为chocolate,并且值符合正则表达式 ch.p 的Cookie时,才转发该请求
        - Cookie=chocolate, ch.p

Header

配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: header_route
        uri: lb://example-service
        predicates:
        # 当且仅当请求带有名为X-Request-Id,并且值符合正则表达式 \d+ 的Header时,才转发该请求
        - Header=X-Request-Id, \d+

Host

配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: lb://example-service
        predicates:
        # 当且仅当名为Host的Header符合**.somehost.org或**.anotherhost.org时,才转发该请求
        # 例如:www.somehost.org、beta.somehost.org、www.anotherhost.org等Host就满足该匹配
        - Host=**.somehost.org,**.anotherhost.org

Method

配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: method_route
        uri: lb://example-service
        predicates:
        # 当且仅当HTTP请求方法为GET时,才转发该请求
        - Method=GET

Path

配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: path_route
        uri: lb://example-service
        predicates:
        # 当且仅当访问路径是/foo/*、/some-example/list及/bar/**时,才转发该请求
        # segment是一个特殊的占位符,表示单层路径匹配,而/**则是多层路径的匹配
        - Path=/foo/{segment},/example/list,/bar/**

Path中配置的url占位符可以在过滤器工厂通过相关API进行获取,关于这个编程技巧可以参考官方文档的描述:

  • Path Route Predicate Factory

Query

配置示例1:

spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: lb://example-service
        predicates:
        # 当且仅当请求带有名为baz的参数,才转发该请求
        - Query=baz

配置示例2:

spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: lb://example-service
        predicates:
        # 当且仅当请求带有名为foo的参数,且参数值与正则表达式 ba. 相匹配,才转发该请求
        - Query=foo, ba.

RemoteAddr

配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: remoteaddr_route
        uri: lb://example-service
        predicates:
        # 当且仅当请求IP是192.168.1.1/24网段,例如192.168.1.10,才转发该请求
        - RemoteAddr=192.168.1.1/24


官方文档:

  • Route Predicate Factories

原文:https://blog.51cto.com/zero01/2430084

链接:https://www.jianshu.com/p/db0d6bbfdadc

你可能感兴趣的:(微服务网关组件 - Spring Cloud Gateway 内置的路由谓词工厂)