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

    二、自定义路由谓词工厂

  • 相关阅读:
    多态与封装
    [Vue] karme/jasmine/webpack/vue搭建测试环境
    [Vue] vue中setInterval的问题
    hosts文件的作用
    [Nodejs] node写个helloworld
    [JavaScript] Cookie,localStorage,sessionStorage概述
    [Vue] vuex进行组件间通讯
    常用工具网站(记事,图表等)
    npm安装github包的方式
    常用的练习网站
  • 原文地址:https://www.cnblogs.com/myitnews/p/14107922.html
Copyright © 2011-2022 走看看