美文网首页gateway
spring cloud gateway系列教程2——Gatew

spring cloud gateway系列教程2——Gatew

作者: 二当家的黑板报 | 来源:发表于2019-06-07 11:05 被阅读0次

    spring cloud gateway系列教程目录

    1. spring cloud gateway系列教程1—Route Predicate
    2. spring cloud gateway系列教程2——GatewayFilter_上篇
    3. spring cloud gateway系列教程2——GatewayFilter_下篇
    4. spring cloud gateway系列教程3—Global Filters
    5. spring cloud gateway系列教程4—其他配置

    GatewayFilter Factories

    Route filters可以通过一些方式修改HTTP请求的输入和输出,针对某些特殊的场景,Spring Cloud Gateway已经内置了很多不同功能的GatewayFilter Factories。

    下面就来通过例子逐一讲解这些GatewayFilter Factories。

    1. AddRequestHeader GatewayFilter Factory

    AddRequestHeader GatewayFilter Factory通过配置name和value可以增加请求的header。
    application.yml

    spring:
      cloud:
        gateway:
          routes:
          - id: add_request_header_route
            uri: http://www.google.com
            filters:
            - AddRequestHeader=X-Request-Foo, Bar
    

    对匹配的请求,会额外添加X-Request-Foo:Bar的header。

    2. AddRequestParameter GatewayFilter Factory

    AddRequestParameter GatewayFilter Factory通过配置name和value可以增加请求的参数。
    application.yml

    spring:
      cloud:
        gateway:
          routes:
          - id: add_request_parameter_route
            uri: http://www.google.com
            filters:
            - AddRequestParameter=foo, bar
    

    对匹配的请求,会额外添加foo=bar的请求参数。

    3. AddResponseHeader GatewayFilter Factory

    AddResponseHeader GatewayFilter Factory通过配置name和value可以增加响应的header。
    application.yml

    spring:
      cloud:
        gateway:
          routes:
          - id: add_request_header_route
            uri: http://www.google.com
            filters:
            - AddResponseHeader=X-Response-Foo, Bar
    

    对匹配的请求,响应返回时会额外添加X-Response-Foo:Bar的header返回。

    4. Hystrix GatewayFilter Factory

    Hystrix是Netflix实现的断路器模式工具包,The Hystrix GatewayFilter就是将断路器使用在gateway的路由上,目的是保护你的服务避免级联故障,以及在下游失败时可以降级返回。

    项目里面引入spring-cloud-starter-netflix-hystrix依赖,并提供HystrixCommand的名字,即可生效Hystrix GatewayFilter。
    application.yml

    spring:
      cloud:
        gateway:
          routes:
          - id: hystrix_route
            uri: http://www.google.com
            filters:
            - Hystrix=myCommandName
    

    那么剩下的过滤器,就会包装在名为myCommandName的HystrixCommand中运行。

    Hystrix过滤器也是通过配置可以参数fallbackUri,来支持路由熔断后的降级处理,降级后,请求会跳过fallbackUri配置的路径,目前只支持forward:的URI协议。
    application.yml

    spring:
      cloud:
        gateway:
          routes:
          - id: hystrix_route
            uri: lb://backing-service:8088
            predicates:
            - Path=/consumingserviceendpoint
            filters:
            - name: Hystrix
              args:
                name: fallbackcmd
                fallbackUri: forward:/incaseoffailureusethis
    

    当Hystrix降级后就会将请求转发到/incaseoffailureusethis

    整个流程其实是用fallbackUri将请求跳转到gateway内部的controller或者handler,然而也可以通过以下的方式将请求转发到外部的服务:
    application.yml

    spring:
      cloud:
        gateway:
          routes:
          - id: ingredients
            uri: lb://ingredients
            predicates:
            - Path=//ingredients/**
            filters:
            - name: Hystrix
              args:
                name: fetchIngredients
                fallbackUri: forward:/fallback
          - id: ingredients-fallback
            uri: http://localhost:9994
            predicates:
            - Path=/fallback
    

    以上的例子,gateway降级后就会将请求转发到http://localhost:9994

    Hystrix Gateway filter在转发降级请求时,会将造成降级的异常设置在ServerWebExchangeUtils.HYSTRIX_EXECUTION_EXCEPTION_ATTR属性中,在处理降级时也可以用到。

    比如下一节讲到的FallbackHeaders GatewayFilter Factory,就会通过上面的方式拿到异常信息,设置到降级转发请求的header上,来告知降级下游异常信息。

    通过下面配置可以设置Hystrix的全局超时信息:
    application.yml

    hystrix.command.fallbackcmd.execution.isolation.thread.timeoutInMilliseconds: 5000
    

    5. FallbackHeaders GatewayFilter Factory

    FallbackHeaders GatewayFilter Factory可以将Hystrix执行的异常信息添加到外部请求的fallbackUriheader上。
    application.yml

    spring:
      cloud:
        gateway:
          routes:
          - id: ingredients
            uri: lb://ingredients
            predicates:
            - Path=//ingredients/**
            filters:
            - name: Hystrix
              args:
                name: fetchIngredients
                fallbackUri: forward:/fallback
          - id: ingredients-fallback
            uri: http://localhost:9994
            predicates:
            - Path=/fallback
            filters:
            - name: FallbackHeaders
              args:
                executionExceptionTypeHeaderName: Test-Header
    

    在这个例子中,当请求lb://ingredients降级后,FallbackHeadersfilter会将HystrixCommand的异常信息,通过Test-Header带给http://localhost:9994服务。

    你也可以使用默认的header,也可以像上面一下配置修改header的名字:

    • executionExceptionTypeHeaderName ("Execution-Exception-Type")
    • executionExceptionMessageHeaderName ("Execution-Exception-Message")
    • rootCauseExceptionTypeHeaderName ("Root-Cause-Exception-Type")
    • rootCauseExceptionMessageHeaderName ("Root-Cause-Exception-Message")

    6. PrefixPath GatewayFilter Factory

    The PrefixPath GatewayFilter Factor通过设置prefix参数来路径前缀。
    application.yml

    spring:
      cloud:
        gateway:
          routes:
          - id: prefixpath_route
            uri: http://www.google.com
            filters:
            - PrefixPath=/mypath
    

    如果一个请求是/hello,通过上面路由,就会将请求修改为/mypath/hello

    7. PreserveHostHeader GatewayFilter Factory

    PreserveHostHeader GatewayFilter Factory会保留原始请求的host头信息,并原封不动的转发出去,而不是被gateway的http客户端重置。

    application.yml:

    spring:
      cloud:
        gateway:
          routes:
          - id: preserve_host_route
            uri: http://www.google.com
            filters:
            - PreserveHostHeader
    

    由于GatewayFilter Factory比较多,分开两篇来写,下一篇

    如果想查看其他spring cloud gateway的案例和使用,可以点击查看

    相关文章

      网友评论

        本文标题:spring cloud gateway系列教程2——Gatew

        本文链接:https://www.haomeiwen.com/subject/isjmxctx.html