乐趣区

关于云计算:Spring-Cloud-Gateway实战之四内置predicate小结

欢送拜访我的 GitHub

https://github.com/zq2599/blog_demos

内容:所有原创文章分类汇总及配套源码,波及 Java、Docker、Kubernetes、DevOPS 等;

本篇概览

  • 本文是《Spring Cloud Gateway 实战》系列的第四篇,咱们将已有的断言(predicate)的类型做个小结,明天的内容中,除了官网举荐的简化版配置,还给出了动静路由时该断言的 JSON 格局配置;

After

  • <font color=”blue”>After</font> 示意路由在指定工夫之后才失效
  • 配置文件,留神工夫字符串的格局,<font color=”blue”>+08:00</font> 示意东八区:
spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: http://127.0.0.1:8082
        predicates:
        - After=2021-08-16T07:36:00.000+08:00[Asia/Shanghai]
  • 动静路由的 JSON 格局,留神 <font color=”blue”>args</font> 参数要用 <font color=”red”>datetime</font>:
[
    {
        "id": "after_route",
        "uri": "http://127.0.0.1:8082",
        "predicates":[
            {
                "name": "After",
                "args": {"datetime": "2021-08-16T07:36:00.000+08:00[Asia/Shanghai]"
                }
            }
        ]
    }
]

Before

  • <font color=”blue”>Before</font> 示意路由在指定工夫之前才失效
  • 配置文件:
spring:
  cloud:
    gateway:
      routes:
      - id: before_route
        uri: http://127.0.0.1:8082
        predicates:
        - Before=2021-08-16T07:36:00.000+08:00[Asia/Shanghai]
  • 动静路由的 JSON 格局,留神 <font color=”blue”>args</font> 参数要用 <font color=”red”>datetime</font>:
[
    {
        "id": "before_route",
        "uri": "http://127.0.0.1:8082",
        "predicates":[
            {
                "name": "Before",
                "args": {"datetime": "2021-08-16T07:36:00.000+08:00[Asia/Shanghai]"
                }
            }
        ]
    }
]

Between

  • <font color=”blue”>Between</font> 示意路由在指定时间段之内才失效,既然是时间段就是两个参数,留神它们的写法
  • 配置文件:
spring:
  application:
    name: hello-gateway
  cloud:
    gateway:
      routes:
        - id: between_route
          uri: http://127.0.0.1:8082
          predicates:
            - Between=2021-08-16T07:36:00.000+08:00[Asia/Shanghai], 2021-08-16T08:15:00.000+08:00[Asia/Shanghai]
  • 动静路由的 JSON 格局,留神 <font color=”blue”>args</font> 参数,起始工夫是 <font color=”red”>datetime1</font>,完结工夫是 <font color=”red”>datetime2</font>:
[
    {
        "id": "path_route_addr",
        "uri": "http://127.0.0.1:8082",
        "predicates":[
            {
                "name": "Between",
                "args": {"datetime1": "2021-08-16T07:36:00.000+08:00[Asia/Shanghai]",
                    "datetime2": "2021-08-16T08:18:00.000+08:00[Asia/Shanghai]"
                }
            }
        ]
    }
]

Cookie

  • <font color=”blue”>Cookie</font> 示意 cookie 存在指定名称,并且对应的值合乎指定正则表达式,才算匹配胜利
  • 配置文件:

    spring:
    cloud:
      gateway:
        routes:
        - id: cookie_route
          uri: https://example.org
          predicates:
          - Cookie=chocolate, ch.p
  • 动静路由的 JSON 格局,留神 <font color=”blue”>args</font> 参数:
[
    {
        "id": "cookie_route",
        "uri": "http://127.0.0.1:8082",
        "predicates":[
            {
                "name": "Cookie",
                "args": {
                    "name": "chocolate",
                    "regexp": "ch.p"
                }
            }
        ]
    }
]

Header

  • <font color=”blue”>Header</font> 示意 header 存在指定名称,并且对应的值合乎指定正则表达式,才算匹配胜利
  • 上面的例子要求 header 中必须存在 <font color=”blue”>X-Request-Id</font>,并且值肯定要是数字
  • 配置文件:
spring:
  cloud:
    gateway:
      routes:
      - id: header_route
        uri: https://example.org
        predicates:
        - Header=X-Request-Id, \d+
  • 动静路由的 JSON 格局,留神 <font color=”blue”>args</font> 参数是 <font color=”red”>header</font> 和 <font color=”red”>regexp</font>,还要留神的是 regexp 的值外面有两个反斜杠(本义问题):
[
    {
        "id": "header_route",
        "uri": "http://127.0.0.1:8082",
        "predicates":[
            {
                "name": "Header",
                "args": {
                    "header": "X-Request-Id",
                    "regexp": "\\d+"
                }
            }
        ]
    }
]
  • 用 postman 测试的参数填写和后果如下:

Host

  • <font color=”blue”>Host</font> 示意申请的 host 要和指定的字符串匹配,并且对应的值合乎指定正则表达式,才算匹配胜利,能够同时指定多个 host 匹配表达式,上面的例子给了两个,其中第一个指定了端口:
  • 配置文件:
spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: http://127.0.0.1:8082
        predicates:
        - Host=test.com:8081,**.anotherhost.org
  • 动静路由的 JSON 格局,留神 <font color=”blue”>args</font> 参数,另外通过实测发现,这里 regex 的值是个正则表达式,因而下面配置文件中的多个 host,在此处要通过正则表达式的写法实现(json 数组的写法,在反序列化的时候总是出现异常,无奈解析胜利):
[
    {
        "id": "header_route",
        "uri": "http://127.0.0.1:8082",
        "predicates":[
            {
                "name": "Host",
                "args": {"regex": "test.com:8086"}
            }
        ]
    }
]

Method

  • <font color=”blue”>Method</font> 十分好了解,匹配指定的办法类型(能够有多个)
  • 配置文件:
spring:
  cloud:
    gateway:
      routes:
      - id: method_route
        uri: http://127.0.0.1:8082
        predicates:
        - Method=GET,POST
  • 动静路由的 JSON 格局,同样,因为集体程度问题,临时只实际出指定单个办法的 JSON 写法,如果你晓得如何指定过个办法,还望告知,谢谢:
[
    {
        "id": "method_route",
        "uri": "http://127.0.0.1:8082",
        "predicates":[
            {
                "name": "Method",
                "args": {"methods": "GET"}
            }
        ]
    }
]

Path

  • <font color=”blue”>Path</font> 很罕用,匹配指定的办法类型(能够有多个)
  • 配置文件,留神 <font color=”blue”>{segment}</font>,示意该地位的实在值能够被提取进去,在 filter 中能够应用,这在后续的 filter 文章中会有阐明:
spring:
  cloud:
    gateway:
      routes:
      - id: path_route
        uri: http://127.0.0.1:8082
        predicates:
        - Path=/hello/{segment},/lbtest/{segment}
  • 动静路由的 JSON 格局,同样,因为集体程度问题,临时只实际出指定单个办法的 JSON 写法,如果你晓得如何指定过个办法,还望告知,谢谢:
[
    {
        "id": "path_route",
        "uri": "http://127.0.0.1:8082",
        "predicates":[
            {
                "name": "Path",
                "args": {"pattern": "/hello/{segment}"
                }
            }
        ]
    }
]

Query

  • <font color=”blue”>Query</font> 匹配的是申请中是否带有指定的参数,也能要求该参数等于指定的值(正则表达式)才被匹配上
  • 配置文件,只有带有名为 <font color=”blue”>name</font> 的申请参数就被匹配:
spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: http://127.0.0.1:8082
        predicates:
        - Query=name
  • 如下所示,还能够指定 name 参数的值必须 <font color=”blue”>aaa.</font>,这个小数点示意匹配一个字符,例如 <font color=”blue”>name=aaa1</font> 或者 <font color=”blue”>name=aaa2</font> 都能够:
spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: http://127.0.0.1:8082
        predicates:
        - Query=name,aaa.
  • 动静路由的 JSON 格局,留神参数名和参数值别离用 <font color=”blue”>param</font> 和 <font color=”blue”>regexp</font> 来设置:
[
    {
        "id": "query_route",
        "uri": "http://127.0.0.1:8082",
        "predicates":[
            {
                "name": "Query",
                "args": { 
                    "param": "name",
                    "regexp": "aaa."
                }
            }
        ]
    }
]
  • 测试如下:

RemoteAddr

  • <font color=”blue”>RemoteAddr</font> 很好了解,匹配的指定起源的申请
  • 配置文件:
spring:
  cloud:
    gateway:
      routes:
      - id: remoteaddr_route
        uri: http://127.0.0.1:8082
        predicates:
        - RemoteAddr=192.168.50.134/24
  • 动静路由的 JSON 格局,留神参数名和参数值别离用 <font color=”blue”>param</font> 和 <font color=”blue”>regexp</font> 来设置:
[
    {
        "id": "remoteaddr_route",
        "uri": "http://127.0.0.1:8082",
        "predicates":[
            {
                "name": "RemoteAddr",
                "args": {"sources": "192.168.50.134/24"}
            }
        ]
    }
]
  • 测试如下,留神测试的时候主机地址不要用 <font color=”blue”>localhost</font> 和 <font color=”blue”>127.0.0.1</font>,这样会导致服务端判断起源的时候获得的网卡地址为 0.0.0.0:

Weight

  • <font color=”blue”>Weight</font> 顾名思义,依照权重将申请散发到不同地位
  • 配置文件:
spring:
  cloud:
    gateway:
      routes:
      - id: weight_high
        uri: http://192.168.50.134:8082
        predicates:
        - Weight=group1, 8
      - id: weight_low
        uri: http://192.168.50.135:8082
        predicates:
        - Weight=group1, 2
  • 以上就是罕用的断言类型了,可见性能曾经很弱小了,心愿能给您一些参考

你不孤独,欣宸原创一路相伴

  1. Java 系列
  2. Spring 系列
  3. Docker 系列
  4. kubernetes 系列
  5. 数据库 + 中间件系列
  6. DevOps 系列

欢送关注公众号:程序员欣宸

微信搜寻「程序员欣宸」,我是欣宸,期待与您一起畅游 Java 世界 …
https://github.com/zq2599/blog_demos

退出移动版