欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Cloud 学习笔记 —— 服务网关 Gateway 的 Predicate

程序员文章站 2022-06-13 13:50:38
...

12.3 Gateway 的 Predicate

有4 种匹配规则

1. 通过时间匹配

  • (1)配置 yml 文件
spring:
  cloud:
    gateway:
      routes:
        - id: javaboy-route
          uri: http://httpbin.org
          predicates:
            - After=2020-10-01T01:01:01+08:00[Asia/Shanghai]

表示在- After=2020-10-01T01:01:01+08:00[Asia/Shanghai]之后才会转发
今天是 2020-10-11日,配置的是转发 2020-10-01 之后的请求,所以应该能转发,转发的地址还是http://httpbin.org
Spring Cloud 学习笔记 —— 服务网关 Gateway 的 Predicate
-(2)重启服务,访问:http://localhost:8080/get
Spring Cloud 学习笔记 —— 服务网关 Gateway 的 Predicate
转发成功,这就是 predicates 时间匹配的After用法
除了 After还有 BeforeBetween
Before表示在某个时间点之前的请求转发
Between,表示在两个时间之间的请求转发,两个时间用英文的 “,” 隔开

2.请求方式匹配

可以指定只转发一种请求方法,请求方式 Method 有 Get 、Put 、POST、DELETE

  • (1)配置 yml 文件
spring:
  cloud:
    gateway:
      routes:
        - id: javaboy-route
          uri: http://httpbin.org
          predicates:
            - Method=GET

Method=GET 表示,只允许 GET 请求

  • (2)继续访问 http://httpbin.org 地址测试,这次使用 POSTMAN 测试:
    Spring Cloud 学习笔记 —— 服务网关 Gateway 的 Predicate
    Spring Cloud 学习笔记 —— 服务网关 Gateway 的 Predicate
    这就是请求方式匹配

3.请求路径匹配

  • (1)配置 yml 文件
spring:
  cloud:
    gateway:
      routes:
        - id: javaboy-route
          uri: www.javaboy.org
          predicates:
            - Path=/2019/0612/{segment}

路径转发又回到开始的 HelloWorld 级别使用时的 Path 设置,{segment} 时一个占位符,表示满足 /2019/0612/ 这个规则的请求转发

  • (2)www.javaboy.org 的可用地址有:
    http://www.javaboy.org/2019/0612/git-install.html
    http://www.javaboy.org/2019/0612/git-basic.html
    用这两个地址测试:
    Spring Cloud 学习笔记 —— 服务网关 Gateway 的 Predicate
    Spring Cloud 学习笔记 —— 服务网关 Gateway 的 Predicate
    因为可能是这样直接返回页面,有些请求报错,所以没显示出来,但是通过 F12 的 element 选项,可以看见响应结果,说明转发成功了,这就是通过路径匹配

4.通过请求参数匹配

  • 1.通过只有请求参数匹配
spring:
  cloud:
    gateway:
      routes:
        - id: javaboy-route
          uri: http://httpbin.org
          predicates:
            - Query=name

表示请求中必须有 name 参数才进行转发,否则不转发
一次没有 name 参数,一次有 那么参数的请求结果:
Spring Cloud 学习笔记 —— 服务网关 Gateway 的 Predicate
Spring Cloud 学习笔记 —— 服务网关 Gateway 的 Predicate

  • 2.通过既有请求参数又有值匹配
spring:
  cloud:
    gateway:
      routes:
        - id: javaboy-route
          uri: http://httpbin.org
          predicates:
            - Query=name,java.*

表示参数名必须有 name,参数值必须有以 java 开头的值才进行转发
一次有 java 开头值,一次没有 java 开头的参数值请求进行测试,测试地址是http://httpbin.org
Spring Cloud 学习笔记 —— 服务网关 Gateway 的 Predicate
Spring Cloud 学习笔记 —— 服务网关 Gateway 的 Predicate

5.多种匹配模式可以组合使用

  • yml 文件单一路由组合
spring:
  cloud:
    gateway:
      routes:
        - id: javaboy-route
          uri: http://httpbin.org
          predicates:
            - Query=name,java.*
            - Method=GET
            - After=2020-10-01T01:01:01+08:00[Asia/Shanghai]

这里的 - Query 、- Method 、- After 是 && 的关系

  • yml 文件多个路由组合
spring:
  cloud:
    gateway:
      routes:
        - id: javaboy-route
          uri: http://httpbin.org
          predicates:
            - Query=name,java.*
            - Method=GET
            - After=2020-10-01T01:01:01+08:00[Asia/Shanghai]
        - id: javaboy-route2
            uri: www.javaboy.org
            predicates:
              - Query=name,java.*
              - Method=GET
              - After=2020-10-01T01:01:01+08:00[Asia/Shanghai]

这里的 javaboy-route 和 javaboy-route2 是**谁在前面,谁匹配的**关系,因为 yml 文件是有序的;比如访问 http://localhost:8080/get?name=javaboy ,javaboy-route 和 javaboy-route2 是都能匹配,因位置的关系,javaboy-route 在 yml 文件中靠前,所以这个请求只被 javaboy-route 转发