zoukankan      html  css  js  c++  java
  • Spring Cloud Gateway 路由谓词工厂

    Spring Cloud Gateway 包含许多内置的Route Predicate Factories。所有这些谓词都匹配HTTP请求的不同属性。多个 Route Predicate Factories 可以通过逻辑与(and)结合起来一起使用。

    每一个Predicate的使用,你可以理解为:当满足这种条件后才会被转发,如果是多个,那就是都满足的情况下被转发。

    一、路由谓词工厂 RoutePredicateFactory

    按照功能对路由谓词工厂进行划分,可以划分为以下几种,如图所示:

    目前有两种配置方式:

    • application.yml配置文件方式(推荐)
    • 通过@Bean注解RouteLocator方法返回值
    Path 方式匹配转发
    配置文件匹配地址转发

    在application.yml配置文件内添加对应的路由配置,如下所示:

    spring:
      application:
        name: spring-cloud-gateway-sample
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                # 匹配路径转发
                - Path=/api-boot-datasource-switch.html
    # 端口号
    server:
      port: 9090

    解释下routes的组成部分:

    • id:路由的ID
    • uri:匹配路由的转发地址
    • predicates:配置该路由的断言,通过PredicateDefinition类进行接收配置。

    在上面的配置中,当访问http://localhost:9090/api-boot-datasource-switch.html时就会被自动转发到http://blog.yuqiyu.com/api-boot-datasource-switch.html,这里要注意完全匹配Path的值时才会进行路由转发。

    RouteLocator 匹配路径转发
    @Bean
    public RouteLocator routeLocator(RouteLocatorBuilder builder) {
      return builder.routes()
        .route("blog", r -> 
               r.path("/api-boot-datasource-switch.html").uri("http://blog.yuqiyu.com"))
        .build();
    }
    Before 方式匹配转发

    当部署有访问时间限制的接口时,我们可以通过Before Predicate来完成某一个时间点之前允许访问,过时后则不允许转发请求到具体的服务,配置如下所示:

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Before=2019-05-01T00:00:00+08:00[Asia/Shanghai]

    在上面配置中,我们允许2019-05-01日凌晨之前通过路由转发到http://blog.yuqiyu.com,通过查看org.springframework.cloud.gateway.handler.predicate.BeforeRoutePredicateFactory源码我们发现,Spring Cloud Gateway的Before断言采用的ZonedDateTime进行匹配时间,这里要注意存在时区的问题,需要配置[Asia/Shanghai]作为中国时区。

    After 方式匹配转发 

    After Predicate与Before配置使用一致,匹配某一个时间点之后允许路由转发,如下所示配置:

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - After=2019-04-29T00:00:00+08:00[Asia/Shanghai]

    在上面配置中允许2019-04-29凌晨之后进行转发到http://blog.yuqiyu.com。

    Between 方式匹配转发

    那如果是一个时间段内允许请求转发,通过Before、After组合配置也可以完成,不过Spring Cloud Gateway还是提供了Between方式,如下所示:

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Between=2019-04-29T00:00:00+08:00[Asia/Shanghai], 2019-05-01T00:00:00+08:00[Asia/Shanghai]

    在上面配置中,允许在2019-04-29日凌晨后 & 2019-05-01凌晨之前请求转发到http://blog.yuqiyu.com。

    Cookie 方式匹配转发

    Spring Cloud Gateway 还提供了根据Cookie值的方式匹配转发请求,如果请求中所携带的Cookie值与配置的Predicate匹配,那么就可以被允许转发到指定地址,如下所示:

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Cookie=hengboy, yuqiyu

    在上面配置中,如果客户端发送请求时携带了"hengboy=yuqiyu"的Cookie信息,则允许请求转发。

    Header 方式匹配转发

    Spring Cloud Gateway可以根据发送请求的Header信息进行匹配转发,加入我们可以根据X-Request-Id的值进行匹配,如下所示:

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Header=X-Request-Id, d+

    在上面配置中,如果X-Request-Id的值为数字,那么就可以转发到http://blog.yuqiyu.com。

    如果头信息为X-Request-Id:abc时,就会转发失败,出现404。

    Host 方式匹配转发

    Spring Cloud Gateway可以根据Host主机名进行匹配转发,如果我们的接口只允许**.yuqiyu.com域名进行访问,那么配置如下所示:

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Host=**.yuqiyu.com
    请求方式匹配转发

    Rest请求风格的接口内往往会存在多种请求方式的接口,如果我们的接口只允许POST请求访问,那么配置如下所示:

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Method=POST
    请求参数匹配转发

    Spring Cloud GateWay还支持根据指定的参数进行匹配,Query方式的Predicate也有两种方式匹配情况,如下所示:

    1、请求中存在xxx参数

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Query=xxx

    只要参数存在xxx就会被成功转发,否则出现404转发失败。

    2、求中存在xxx参数且值为zzz

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Query=xxx, zzz

    根据上面配置,我们限定了参数xxx必须为zzz时才会被成功转发,否则同样会出现404抓发失败。

    参数值可以是正则表达式。

    请求路径匹配转发
    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Path=/article/{articleId}

    在上面配置中{articleId}是一个路径变量,可以是任意值,匹配/article/1、/article/abc等。

    请求IP匹配转发

    Spring Cloud Gateway可以限制允许访问接口的客户端IP地址,配置后只对指定IP地址的客户端进行请求转发,配置如下所示:

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - RemoteAddr=192.168.1.56/24

    在上面我们配置了192.168.1.56/24,其中192.168.1.56是客户端的IP地址,而24则是子网掩码。

    组合示例

    相同的Predicate也可以配置多个,请求的转发是必须满足所有的Predicate后才可以进行路由转发,组合使用示例如下所示:

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.yuqiyu.com
              predicates:
                - Query=author, hengboy
                - Query=yuqiyu
                - Method=GET
                - Cookie=hengboy, yuqiyu
                - Header=X-Request-Id, d+
                - RemoteAddr=192.168.1.56/24

    二、自定义路由谓词工厂

  • 相关阅读:
    Saltstack module acl 详解
    Saltstack python client
    Saltstack简单使用
    P5488 差分与前缀和 NTT Lucas定理 多项式
    CF613D Kingdom and its Cities 虚树 树形dp 贪心
    7.1 NOI模拟赛 凸包套凸包 floyd 计算几何
    luogu P5633 最小度限制生成树 wqs二分
    7.1 NOI模拟赛 dp floyd
    springboot和springcloud
    springboot集成mybatis
  • 原文地址:https://www.cnblogs.com/myitnews/p/14107922.html
Copyright © 2011-2022 走看看