温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Springcloud Gateway相关配置方法是什么

发布时间:2023-04-04 15:39:05 来源:亿速云 阅读:218 作者:iii 栏目:开发技术

这篇“Springcloud Gateway相关配置方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Springcloud Gateway相关配置方法是什么”文章吧。

    Spring Cloud Gateway 的核心功能:

    断言(Predicate):参照 Java8 的新特性Predicate,允许开发人员匹配 HTTP 请求中的任何内容,比如请求头或请求参数,最后根据匹配结果返回一个布尔值。
    路由(route):由ID、目标URI、断言集合和过滤器集合组成。如果聚合断言结果为真,则转发到该路由。
    过滤器(filter):可以在返回请求之前或之后修改请求和响应的内容。

    1、路由 Route:

    Route 主要由 路由id、目标uri、断言集合和过滤器集合组成,那我们简单看看这些属性到底有什么作用。
    (1)id:路由标识,要求唯一,名称任意(默认值 uuid,一般不用,需要自定义)
    (2)uri:请求最终被转发到的目标地址
    (3)order: 路由优先级,数字越小,优先级越高
    (4)predicates:断言数组,即判断条件,如果返回值是boolean,则转发请求到 uri 属性指定的服务中
    (5)filters:过滤器数组,在请求传递过程中,对请求做一些修改

    2、断言 Predicate:

            Predicate 来自于 Java8 的接口。Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。
            Predicate 可以用于接口请求参数校验、判断新老数据是否有变化需要进行更新操作。Spring Cloud Gateway 内置了许多 Predict,这些 Predict 的源码在 org.springframework.cloud.gateway.handler.predicate 包中,有兴趣可以阅读一下

    3、过滤器 filter:

    Gateway 过滤器的生命周期:
    PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
    POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的 HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
    Gateway 过滤器从作用范围可分为两种:
    GatewayFilter:应用到单个路由或者一个分组的路由上(需要在配置文件中配置)
    GlobalFilter:应用到所有的路由上(无需配置,全局生效)
    (1)局部过滤器 GatewayFilter:
            Spring Cloud Gateway 中内置了许多的局部过滤器;局部过滤器需要在指定路由配置才能生效,默认是不生效的

    (2)自定义局部过滤器:
            虽说内置的过滤器能够解决很多场景,但是难免还是有些特殊需求需要定制一个过滤器,下面就来介绍一下如何自定义局部过滤器。 

      (3) GlobalFilter 全局过滤器:
            
    全局过滤器应用全部路由上,无需开发者配置,Spring Cloud Gateway 也内置了一些全局过滤器。GlobalFilter 的功能其实和 GatewayFilter 是相同的,只是 GlobalFilter 的作用域是所有的路由配置,而不是绑定在指定的路由配置上。多个 GlobalFilter 可以通过 @Order 或者 getOrder() 方法指定执行顺序,order值越小,执行的优先级越高。
     注意,由于过滤器有 pre 和 post 两种类型,pre 类型过滤器如果 order 值越小,那么它就应该在pre过滤器链的顶层,post 类型过滤器如果 order 值越小,那么它就应该在 post 过滤器链的底层

       (4) 过滤器规则(Filter)

    过滤规则实例说明
    PrefixPath- PrefixPath=/app在请求路径前加上app
    RewritePath- RewritePath=/test, /app/test访问localhost:9022/test,请求会转发到localhost:8001/app/test
    SetPathSetPath=/app/{path}通过模板设置路径,转发的规则时会在路径前增加app,{path}表示原请求路径
    RedirectTo
    重定向
    RemoveRequestHeader
    去掉某个请求头信息

    注:当配置多个filter时,优先定义的会被调用,剩余的filter将不会生效

    4、Predicate 断言条件(转发规则)介绍

    Springcloud Gateway相关配置方法是什么

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

    Path 方式匹配转发

    通过Path转发示例,我们讲解下上面的两种配置,分别是application.yml以及RouteLocator

    配置文件匹配地址转发

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

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

    **先来解释下route的组成部分:**

    • id:路由的ID

    • uri:匹配路由的转发地址

    • predicates:配置该路由的断言,通过PredicateDefinition类进行接收配置。

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

    访问效果如下所示:

    Springcloud Gateway相关配置方法是什么

    spring-cloud-gateway-path-predicate.png

    RouteLocator 匹配路径转发

    在上面的配置中,如果使用RouteLocator方式该怎么进行配置呢?

    如下所示:

    @Bean
     
    public RouteLocator routeLocator(RouteLocatorBuilder builder) {
     
      return builder.routes()
     
        .route("blog", r -> 
     
               r.path("/api-boot-datasource-switch.html").uri("http://blog.xx.com"))
     
        .build();
     
    }

    Before 方式匹配转发

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

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

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

    After 方式匹配转发

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

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

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

    Between 方式匹配转发

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

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.xx.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.xx.com

    Cookie 方式匹配转发

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

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

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

    **测试Cookie方式转发:**

    curl http://localhost:9090 --cookie "hengboy=leo"

    通过上面方式我们是可以成功转发请求的,如果我们修改Cookie的值,就会导致无法转发,出现404。

    Header 方式匹配转发

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

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

    在上面配置中,如果X-Request-Id的值为数字,那么就可以转发到http://blog.xx.com,我们通过如下方式进行测试:

    curl http://localhost:9090 -H "X-Request-Id:123456"

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

    Host 方式匹配转发

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

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.xx.com
              predicates:
                - Host=\*\*.xx.com

    测试如下所示:

     1. curl http://localhost:9090 -H "Host: xx.com"          // 匹配
     2. curl http://localhost:9090 -H "Host: api.xx.com"        // 匹配
     3. curl http://localhost:9090 -H "Host: admin.xx.com"  // 匹配
     3. curl http://localhost:9090 -H "Host: hengboy.com"          // 不匹配

    请求方式 方式匹配转发

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

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.xx.com
              predicates:
                - Method=POST

    发送GET请求测试:

    ~ curl http://localhost:9090
    {"timestamp":"2019-04-29T06:27:41.121+0000","path":"/","status":404,"error":"Not Found","message":null}

    我们的请求并未被Spring Cloud Gateway进行转发,那么我们再来通过POST请求进行测试:

    curl -X POST http://localhost:9090

    是可以被转发到目标地址uri的,不过我的这个博客是OSS部署的,阿里云限制了POST访问,尽管如此我们也证明了可以转发。

    请求参数 方式匹配转发

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

    请求中存在xxx参数

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

    我们通过curl http://localhost:9090\?xxx\=123是可以被成功转发的,只要参数存在xxx就会被成功转发,否则出现404转发失败。

    请求中存在xxx参数且值为zzz

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

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

    请求路径 方式匹配转发

    Spring Cloud Gateway提供了请求路径变量方式匹配转发,如下所示:

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.xx.com
              predicates:
                - Path=/article/{articleId}

    在上面配置中{articleId}是一个路径变量,可以是任意值,匹配/article/1/article/abc等,测试如下所示:

    ~ curl http://localhost:9090/article/1            // 匹配
    ~ curl http://localhost:9090/article/abc        // 匹配
    ~ curl http://localhost:9090/article/1/1        // 不匹配

    请求IP 方式匹配转发

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

    spring:
      cloud:
        gateway:
          routes:
            - id: blog
              uri: http://blog.xx.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.xx.com
              predicates:
                - Query=author, hengboy
                - Query=leo
                - Method=GET
                - Cookie=hengboy, leo
                - Header=X-Request-Id, \d+
                - RemoteAddr=192.168.1.56/24

    以上就是关于“Springcloud Gateway相关配置方法是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI