zoukankan      html  css  js  c++  java
  • Spring Cloud Alibaba学习笔记(18)

    参考:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.1.0.RELEASE/single/spring-cloud-gateway.html#_gatewayfilter_factories

    AddRequestHeader GatewayFilter Factory

    为原始请求添加Header,配置示例:为原始请求添加名为 X-Request-Foo ,值为 Bar 的请求头

    spring:
      cloud:
        gateway:
          routes:
          - id: add_request_header_route
            uri: https://example.org
            filters:
            - AddRequestHeader=X-Request-Foo, Bar
    

    AddRequestParameter GatewayFilter Factory

    为原始请求添加请求参数及值,配置示例:为原始请求添加名为foo,值为bar的参数,即:foo=bar

    spring:
      cloud:
        gateway:
          routes:
          - id: add_request_parameter_route
            uri: https://example.org
            filters:
            - AddRequestParameter=foo, bar
    

    AddResponseHeader GatewayFilter Factory

    为原始响应添加Header,配置示例:为原始响应添加名为 X-Request-Foo ,值为 Bar 的响应头

    spring:
      cloud:
        gateway:
          routes:
          - id: add_response_header_route
            uri: https://example.org
            filters:
            - AddResponseHeader=X-Response-Foo, Bar
    

    DedupeResponseHeader GatewayFilter Factory

    我们在Gateway以及微服务上都设置了CORS(解决跨域)Header的话,如果不做任何配置,那么请求 -> 网关 -> 微服务,获得的CORS Header的值,就将会是这样的:

    Access-Control-Allow-Credentials: true, true
    Access-Control-Allow-Origin: https://musk.mars, https://musk.mars
    

    可以看到这两个Header的值都重复了,若想把这两个Header的值去重的话,就需要使用到DedupeResponseHeader,配置示例:

    spring:
      cloud:
        gateway:
          routes:
          - id: dedupe_response_header_route
            uri: https://example.org
            filters:
            # 若需要去重的Header有多个,使用空格分隔
            - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
    

    去重策略:

    • RETAIN_FIRST:默认值,保留第一个值
    • RETAIN_LAST:保留最后一个值
    • RETAIN_UNIQUE:保留所有唯一值,以它们第一次出现的顺序保留

    PS:Spring Cloud Greenwich SR2提供的新特性,低于这个版本无法使用。

    Hystrix GatewayFilter Factory

    为路由引入Hystrix的断路器保护,配置示例:

    spring:
      cloud:
        gateway:
          routes:
          - id: hystrix_route
            uri: https://example.org
            filters:
            - Hystrix=myCommandName
    

    PS:Hystrix是Spring Cloud第一代容错组件,不过已经进入维护模式,未来Hystrix会被Spring Cloud移除掉,取而代之的是Alibaba Sentinel/Resilience4J。

    FallbackHeaders GatewayFilter Factory

    同样是对Hystrix的支持,上一小节所介绍的过滤器工厂支持一个配置参数:fallbackUri,该配置用于当发生异常时将请求转发到一个特定的uri上。而FallbackHeaders这个过滤工厂可以在转发请求到该uri时添加一个Header,这个Header的值为具体的异常信息。配置示例:

    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
    

    PrefixPath GatewayFilter Factory

    为原始的请求路径添加一个前缀路径,配置示例:该配置使访问${GATEWAY_URL}/hello 会转发到https://example.org/mypath/hello

    spring:
      cloud:
        gateway:
          routes:
          - id: prefixpath_route
            uri: https://example.org
            filters:
            - PrefixPath=/mypath
    

    PreserveHostHeader GatewayFilter Factory

    为请求添加一个preserveHostHeader=true的属性,路由过滤器会检查该属性以决定是否要发送原始的Host Header。配置示例:

    spring:
      cloud:
        gateway:
          routes:
          - id: preserve_host_route
            uri: https://example.org
            filters:
            - PreserveHostHeader
    

    如果不设置,那么名为 Host 的Header将由Http Client控制

    RequestRateLimiter GatewayFilter Factory

    用于对请求进行限流,限流算法为令牌桶。配置示例:

    spring:
      cloud:
        gateway:
          routes:
          - id: requestratelimiter_route
            uri: https://example.org
            filters:
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 10
                redis-rate-limiter.burstCapacity: 20
    

    RedirectTo GatewayFilter Factory

    将原始请求重定向到指定的Url,配置示例:

    spring:
      cloud:
        gateway:
          routes:
          - id: redirect_route
            uri: https://example.org
            filters:
            - RedirectTo=302, https://acme.org
    

    该配置使访问 ${GATEWAY_URL}/hello 会被重定向到 https://acme.org/hello ,并且携带一个 Location:http://acme.org 的Header,而返回客户端的HTTP状态码为302
    PS:

    • HTTP状态码应为3xx,例如301
    • URL必须是合法的URL,该URL会作为Location Header的值

    RemoveHopByHopHeadersFilter GatewayFilter Factory

    为原始请求删除IETF组织规定的一系列Header,默认删除的Header如下:

    • Connection
    • Keep-Alive
    • Proxy-Authenticate
    • Proxy-Authorization
    • TE
    • Trailer
    • Transfer-Encoding
    • Upgrade
      可以通过配置去指定仅删除哪些Header,配置示例:
    spring:
      cloud:
        gateway:
          filter:
            remove-hop-by-hop:
              # 多个Header使用逗号(,)分隔
              headers: Connection,Keep-Alive
    

    RemoveRequestHeader GatewayFilter Factory

    为原始请求删除某个Header,配置示例:删除原始请求中名为 X-Request-Foo 的请求头

    spring:
      cloud:
        gateway:
          routes:
          - id: removerequestheader_route
            uri: https://example.org
            filters:
            - RemoveRequestHeader=X-Request-Foo
    

    RemoveResponseHeader GatewayFilter Factory

    为原始响应删除某个Header,配置示例:删除原始响应中名为 X-Request-Foo 的响应头

    spring:
      cloud:
        gateway:
          routes:
          - id: removeresponseheader_route
            uri: https://example.org
            filters:
            - RemoveResponseHeader=X-Response-Foo
    

    RewritePath GatewayFilter Factory

    通过正则表达式重写原始的请求路径,配置示例:

    spring:
      cloud:
        gateway:
          routes:
          - id: rewritepath_route
            uri: https://example.org
            predicates:
            - Path=/foo/**
            filters:
            # 参数1为原始路径的正则表达式,参数2为重写后路径的正则表达式
            - RewritePath=/foo/(?<segment>.*), /${segment}
    

    该配置使得访问 /foo/bar 时,会将路径重写为/bar 再进行转发,也就是会转发到 https://example.org/bar。需要注意的是:由于YAML语法,需用$ 替换 $

    RewriteResponseHeader GatewayFilter Factory

    重写原始响应中的某个Header,配置示例:

    spring:
      cloud:
        gateway:
          routes:
          - id: rewriteresponseheader_route
            uri: https://example.org
            filters:
            # 参数1为Header名称,参数2为值的正则表达式,参数3为重写后的值
            - RewriteResponseHeader=X-Response-Foo, password=[^&]+, password=***
    

    该配置的意义在于:如果响应头中 X-Response-Foo 的值为/42?user=ford&password=omg!what&flag=true,那么就会被按照配置的值重写成/42?user=ford&password=&flag=true,也就是把其中的password=omg!what重写成了password=

    SaveSession GatewayFilter Factory

    在转发请求之前,强制执行WebSession::save操作,配置示例:

    spring:
      cloud:
        gateway:
          routes:
          - id: save_session
            uri: https://example.org
            predicates:
            - Path=/foo/**
            filters:
            - SaveSession
    

    主要用在那种像 Spring Session 延迟数据存储(数据不是立刻持久化)的,并希望在请求转发前确保session状态保存情况。如果你将Spring Secutiry于Spring Session集成使用,并想确保安全信息都传到下游机器,就需要配置这个filter。

    secureHeaders GatewayFilter Factory

    secureHeaders过滤器工厂为原始响应添加了一系列起安全作用的响应头。默认会添加如下Headers(包括值):

    • X-Xss-Protection:1; mode=block
    • Strict-Transport-Security:max-age=631138519
    • X-Frame-Options:DENY
    • X-Content-Type-Options:nosniff
    • Referrer-Policy:no-referrer
    • Content-Security-Policy:default-src 'self' https:; font-src 'self' https: data:; img-src 'self' https: data:; object-src 'none'; script-src https:; style-src 'self' https: 'unsafe-inline'
    • X-Download-Options:noopen
    • X-Permitted-Cross-Domain-Policies:none

    如果你想修改这些Header的值,那么就需要使用这些Headers对应的后缀,如下:

    • xss-protection-header
    • strict-transport-security
    • frame-options
    • content-type-options
    • referrer-policy
    • content-security-policy
    • download-options
    • permitted-cross-domain-policies

    配置示例:

    spring:
      cloud:
        gateway:
          filter:
            secure-headers:
              # 修改 X-Xss-Protection 的值为 2; mode=unblock
              xss-protection-header: 2; mode=unblock
    

    如果想禁用某些Header,可使用如下配置:

    spring:
      cloud:
        gateway:
          filter:
            secure-headers:
              # 多个使用逗号(,)分隔
              disable: frame-options,download-options
    

    SetPath GatewayFilter Factory

    修改原始的请求路径,配置示例:

    spring:
      cloud:
        gateway:
          routes:
          - id: setpath_route
            uri: https://example.org
            predicates:
            - Path=/foo/{segment}
            filters:
            - SetPath=/{segment}
    

    该配置使访问 ${GATEWAY_URL}/foo/bar 时会转发到 https://example.org/bar ,也就是原本的/foo/bar被修改为了/bar

    SetResponseHeader GatewayFilter Factory

    修改原始响应中某个Header的值,配置示例:将原始响应中 X-Response-Foo 的值修改为 Bar

    spring:
      cloud:
        gateway:
          routes:
          - id: setresponseheader_route
            uri: https://example.org
            filters:
            - SetResponseHeader=X-Response-Foo, Bar
    

    SetStatus GatewayFilter Factory

    修改原始响应的状态码,配置示例:

    spring:
      cloud:
        gateway:
          routes:
          - id: setstatusstring_route
            uri: https://example.org
            filters:
            # 字符串形式
            - SetStatus=BAD_REQUEST
          - id: setstatusint_route
            uri: https://example.org
            filters:
            # 数字形式
            - SetStatus=401
    

    SetStatusd的值可以是数字,也可以是字符串。但一定要是Spring HttpStatus 枚举类中的值。上面这两种配置都可以返回401这个HTTP状态码。

    StripPrefix GatewayFilter Factory

    用于截断原始请求的路径,配置示例:

    spring:
      cloud:
        gateway:
          routes:
          - id: nameRoot
            uri: http://nameservice
            predicates:
            - Path=/name/**
            filters:
            # 数字表示要截断的路径的数量
            - StripPrefix=2
    

    如果请求的路径为 /name/bar/foo ,那么则会截断成/foo后进行转发 ,也就是会截断2个路径。

    Retry GatewayFilter Factory

    针对不同的响应进行重试,例如可以针对HTTP状态码进行重试,配置示例:

    spring:
      cloud:
        gateway:
          routes:
          - id: retry_test
            uri: http://localhost:8080/flakey
            predicates:
            - Host=*.retry.com
            filters:
            - name: Retry
              args:
                retries: 3
                statuses: BAD_GATEWAY
    

    可配置如下参数:

    • retries:重试次数
    • statuses:需要重试的状态码,取值在 org.springframework.http.HttpStatus 中
    • methods:需要重试的请求方法,取值在 org.springframework.http.HttpMethod 中
    • series:HTTP状态码序列,取值在 org.springframework.http.HttpStatus.Series 中

    RequestSize GatewayFilter Factory

    设置允许接收最大请求包的大小,配置示例:如果请求包大小超过设置的值,则会返回 413 Payload Too Large以及一个errorMessage

    spring:
      cloud:
        gateway:
          routes:
          - id: request_size_route
          uri: http://localhost:8080/upload
          predicates:
          - Path=/upload
          filters:
          - name: RequestSize
            args:
              # 单位为字节
              maxSize: 5000000
    

    Modify Request Body GatewayFilter Factory

    在转发请求之前修改原始请求体内容,该过滤器工厂只能通过代码配置,不支持在配置文件中配置。代码示例:

    @Bean
    public RouteLocator routes(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("rewrite_request_obj", r -> r.host("*.rewriterequestobj.org")
                .filters(f -> f.prefixPath("/httpbin")
                    .modifyRequestBody(String.class, Hello.class, MediaType.APPLICATION_JSON_VALUE,
                        (exchange, s) -> return Mono.just(new Hello(s.toUpperCase())))).uri(uri))
            .build();
    }
    
    static class Hello {
        String message;
    
        public Hello() { }
    
        public Hello(String message) {
            this.message = message;
        }
    
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    }
    

    该过滤器工厂处于 BETA 状态,未来API可能会变化,生产环境慎用

    Modify Response Body GatewayFilter Factory

    可用于修改原始响应体的内容,该过滤器工厂同样只能通过代码配置,不支持在配置文件中配置。代码示例:

    @Bean
    public RouteLocator routes(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("rewrite_response_upper", r -> r.host("*.rewriteresponseupper.org")
                .filters(f -> f.prefixPath("/httpbin")
                    .modifyResponseBody(String.class, String.class,
                        (exchange, s) -> Mono.just(s.toUpperCase()))).uri(uri)
            .build();
    }
    

    该过滤器工厂处于 BETA 状态,未来API可能会变化,生产环境慎用

    Default Filters

    Default Filters用于为所有路由添加过滤器工厂,也就是说通过Default Filter所配置的过滤器工厂会作用到所有的路由上。配置示例:

    spring:
      cloud:
        gateway:
          default-filters:
          - AddResponseHeader=X-Response-Default-Foo, Default-Bar
          - PrefixPath=/httpbin
    
  • 相关阅读:
    UML类关系:依赖、关联、聚合、组合(收藏)
    java常用设计模式八:代理模式
    java常用设计模式三:原型模式
    java常用设计模式总览
    java常用设计模式七:装饰模式
    java常用设计模式六:适配器模式
    Sword C语言原子操作
    C语言 宽字符串
    C语言 字符串切割
    C语言 sscanf函数补充
  • 原文地址:https://www.cnblogs.com/fx-blog/p/11751977.html
Copyright © 2011-2022 走看看