成都网站建设设计

将想法与焦点和您一起共享

SpringCloudGateway内置的路由谓词工厂

本文基于Spring Cloud Greenwich SR2

公司主营业务:成都做网站、网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出仲巴免费做网站回馈大家。

[TOC]


内置的路由谓词工厂

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段

相关源码也整理成了思维导图:
Spring Cloud Gateway 内置的路由谓词工厂


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

文章标题:SpringCloudGateway内置的路由谓词工厂
网页URL:http://chengdu.cdxwcx.cn/article/jjiccs.html