Spring Cloud Gateway系例—GatewayFilter 工厂

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Spring Cloud Gateway系例—GatewayFilter 工厂

路由(Route)过滤器(Filter)允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。路由过滤器的范围是一个特定的路由。Spring Cloud Gateway 包括许多内置的 GatewayFilter 工厂。

关于如何使用以下任何过滤器的更详细的例子,请看 单元测试。

6.1.AddRequestHeader

AddRequestHeader GatewayFilter 工厂需要一个 name 和 value 参数。下面的例子配置了一个 AddRequestHeader GatewayFilter。

Example 14. application.yml

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

image.gif

这个列表将 X-Request-red:blue header添加到所有匹配请求的下游请求的header信息中。

AddRequestHeader 知道用于匹配路径或主机的URI变量。URI变量可以在值中使用,并在运行时被扩展。下面的例子配置了一个 AddRequestHeader GatewayFilter,它使用一个变量。

Example 15. application.yml

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_header_route
        uri: https://example.org
        predicates:
        - Path=/red/{segment}
        filters:
        - AddRequestHeader=X-Request-Red, Blue-{segment}

image.gif

6.2.AddRequestHeadersIfNotPresent

AddRequestHeadersIfNotPresent GatewayFilter 工厂接受一个由冒号分隔的 name 和 value 键值对的集合。下面的例子配置了一个 AddRequestHeadersIfNotPresent GatewayFilter。

Example 16. application.yml

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_headers_route
        uri: https://example.org
        filters:
        - AddRequestHeadersIfNotPresent=X-Request-Color-1:blue,X-Request-Color-2:green

image.gif

这个列表为所有匹配的请求在下游请求的header信息中添加了两个header信息 X-Request-Color-1:blue 和 X-Request-Color-2:green。这类似于 AddRequestHeader 的工作方式,但与 AddRequestHeader 不同的是,它只在header 信息不存在的情况下才会这样做。否则,客户端请求中的原始值将被发送。

此外,要设置一个多值header,可以多次使用header的名称,如 AddRequestHeadersIfNotPresent=X-Request-Color-1:blue,X-Request-Color-1:green。

AddRequestHeadersIfNotPresent 也支持URI变量,用于匹配路径或主机。URI变量可以在值中使用,并在运行时被扩展。下面的例子配置了一个使用变量的 AddRequestHeadersIfNotPresent GatewayFilter。

Example 17. application.yml

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_header_route
        uri: https://example.org
        predicates:
        - Path=/red/{segment}
        filters:
        - AddRequestHeadersIfNotPresent=X-Request-Red:Blue-{segment}

image.gif

6.3.AddRequestParameter

AddRequestParameter GatewayFilter Factory需要一个 name 和 value 参数。下面的例子配置了一个 AddRequestParameter GatewayFilter。

Example 18. application.yml

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

image.gif

这将为所有匹配的请求在下游请求的查询字符串中添加 red=blue。

AddRequestParameter 知道用于匹配路径或主机的URI变量。URI变量可以在值中使用,并在运行时被扩展。下面的例子配置了一个 AddRequestParameter GatewayFilter,它使用了一个变量。

Example 19. application.yml

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_parameter_route
        uri: https://example.org
        predicates:
        - Host: {segment}.myhost.org
        filters:
        - AddRequestParameter=foo, bar-{segment}

image.gif

6.4.AddResponseHeader

AddResponseHeader GatewayFilter 工厂需要一个 name 和 value 参数。下面的例子配置了一个 AddResponseHeader GatewayFilter。

Example 20. application.yml

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

image.gif

这将把 X-Response-Red:Blue header添加到所有匹配请求的下游响应的header中。

AddResponseHeader 知道用于匹配路径或主机的URI变量。URI变量可以在值中使用,并在运行时被扩展。下面的例子配置了一个 AddResponseHeader GatewayFilter,它使用了一个变量。

Example 21. application.yml

spring:
  cloud:
    gateway:
      routes:
      - id: add_response_header_route
        uri: https://example.org
        predicates:
        - Host: {segment}.myhost.org
        filters:
        - AddResponseHeader=foo, bar-{segment}

image.gif

6.5.CircuitBreaker

Spring Cloud CircuitBreaker GatewayFilter 工厂使用Spring Cloud CircuitBreaker API 将 Gateway 路由包裹在一个熔断器中。Spring Cloud CircuitBreaker 支持多个可与 Spring Cloud Gateway 一起使用的库。Spring Cloud 支持 Resilience4J 开箱即用。

要启用 Spring Cloud CircuitBreaker 过滤器,你需要添加 spring-cloud-starter-circuitbreaker-reactor-resilience4j 依赖。下面的例子配置了一个 Spring Cloud CircuitBreaker GatewayFilter。

Example 22. application.yml

spring:
  cloud:
    gateway:
      routes:
      - id: circuitbreaker_route
        uri: https://example.org
        filters:
        - CircuitBreaker=myCircuitBreaker

image.gif

要配置熔断器,请参阅你所使用的底层熔断器实现的配置。

    • Resilience4J 文档

    Spring Cloud CircuitBreaker 过滤器还可以接受一个可选的 fallbackUri 参数。目前,只支持 forward: 模式的URI。如果fallback被调用,请求将被转发到URI所匹配的控制器。下面的例子配置了这样一个fallback。

    Example 23. application.yml

    spring:
      cloud:
        gateway:
          routes:
          - id: circuitbreaker_route
            uri: lb://backing-service:8088
            predicates:
            - Path=/consumingServiceEndpoint
            filters:
            - name: CircuitBreaker
              args:
                name: myCircuitBreaker
                fallbackUri: forward:/inCaseOfFailureUseThis
            - RewritePath=/consumingServiceEndpoint, /backingServiceEndpoint

    image.gif

    也可以通过Java来实现相同的配置,如下。

    Example 24. Application.java

    @Bean
    public RouteLocator routes(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("circuitbreaker_route", r -> r.path("/consumingServiceEndpoint")
                .filters(f -> f.circuitBreaker(c -> c.name("myCircuitBreaker").fallbackUri("forward:/inCaseOfFailureUseThis"))
                    .rewritePath("/consumingServiceEndpoint", "/backingServiceEndpoint")).uri("lb://backing-service:8088")
            .build();
    }

    image.gif

    当熔断器 fallback 被调用时,这个例子转发到 /inCaseofFailureUseThis URI。请注意,这个例子还演示了(可选)Spring Cloud LoadBalancer 的负载均衡(由目标URI上的 lb 前缀定义)。

    CircuitBreaker 还支持 fallbackUri 中的URI变量。这允许更复杂的路由选项,比如使用 PathPattern 表达式 转发原始主机或URL路径的部分。

    在下面的例子中,调用 consumingServiceEndpoint/users/1 将被重定向到 inCaseOfFailureUseThis/users/1。

    Example 25. application.yml

    spring:
      cloud:
        gateway:
          routes:
          - id: circuitbreaker_route
            uri: lb://backing-service:8088
            predicates:
            - Path=/consumingServiceEndpoint/{*segments}
            filters:
            - name: CircuitBreaker
              args:
                name: myCircuitBreaker
                fallbackUri: forward:/inCaseOfFailureUseThis/{segments}

    image.gif

    一般情况下是使用 fallbackUri 来定义网关应用程序中的内部controller或handler。然而,你也可以将请求重新路由到外部应用程序的controller或handler,如下所示。

    Example 26. application.yml

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

    image.gif

    在这个例子中,网关应用程序中没有 fallback 端点或处理程序。然而,在另一个应用程序中有一个,在 localhost:9994 下注册。

    在请求被转发到 fallback 的情况下,Spring Cloud CircuitBreaker Gateway 过滤器也提供了造成这种情况的 Throwable。它作为 ServerWebExchangeUtils.CIRCUITBREAKER_EXECUTION_EXCEPTION_ATTR 属性被添加到 ServerWebExchange 中,在网关应用中处理 fallback 时可以使用。

    对于外部 controller/handler 的情况,可以添加带有异常细节的header。你可以在FallbackHeaders GatewayFilter Factory 部分找到更多关于这样做的信息。

    6.5.1. 熔断指定的状态码

    在某些情况下,你可能想根据它所包裹的路由返回的状态码来熔断。断路器配置对象需要一个状态码列表,如果返回这些代码将导致断路器熔断。当设置你想让断路器熔断的状态代码时,你可以使用一个带有状态码值的 int 或 HttpStatus 枚举的字符串表示。

    Example 27. application.yml

    spring:
      cloud:
        gateway:
          routes:
          - id: circuitbreaker_route
            uri: lb://backing-service:8088
            predicates:
            - Path=/consumingServiceEndpoint
            filters:
            - name: CircuitBreaker
              args:
                name: myCircuitBreaker
                fallbackUri: forward:/inCaseOfFailureUseThis
                statusCodes:
                  - 500
                  - "NOT_FOUND"

    image.gif

    Example 28. Application.java

    @Bean
    public RouteLocator routes(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("circuitbreaker_route", r -> r.path("/consumingServiceEndpoint")
                .filters(f -> f.circuitBreaker(c -> c.name("myCircuitBreaker").fallbackUri("forward:/inCaseOfFailureUseThis").addStatusCode("INTERNAL_SERVER_ERROR"))
                    .rewritePath("/consumingServiceEndpoint", "/backingServiceEndpoint")).uri("lb://backing-service:8088")
            .build();
    }

    image.gif

    6.6.CacheRequestBody

    有些情况下,有必要读取请求体。由于请求体只能被读取一次,我们需要缓存请求体。你可以使用 CacheRequestBody 过滤器来缓存请求体,然后再把它发送到下游,从 exchange 属性中获取请求体。

    下面显示了如何缓存请求体 GatewayFilter:

    @Bean
    public RouteLocator routes(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("cache_request_body_route", r -> r.path("/downstream/**")
                .filters(f -> f.prefixPath("/httpbin")
                    .cacheRequestBody(String.class).uri(uri))
            .build();
    }

    image.gif

    Example 29. application.yml

    spring:
      cloud:
        gateway:
          routes:
          - id: cache_request_body_route
            uri: lb://downstream
            predicates:
            - Path=/downstream/**
            filters:
            - name: CacheRequestBody
              args:
                bodyClass: java.lang.String

    image.gif

    CacheRequestBody 提取请求体并将其转换为一个 body 类(比如前面例子中定义的 java.lang.String)。然后,CacheRequestBody 把它放在 ServerWebExchange.getAttributes() 提供的属性中,其KEY值在 ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR 中定义。

    这个过滤器只对HTTP(包括HTTPS)请求起作用。

    6.7.DedupeResponseHeader

    DedupeResponseHeader GatewayFilter 工厂接受一个 name 参数和一个可选的 strategy 参数。name 可以包含一个以空格分隔的header名称列表。下面的例子配置了一个 DedupeResponseHeader GatewayFilter。

    Example 30. application.yml

    spring:
      cloud:
        gateway:
          routes:
          - id: dedupe_response_header_route
            uri: https://example.org
            filters:
            - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin

    image.gif

    在网关CORS逻辑和下游逻辑都添加了 Access-Control-Allow-Credentials 和 Access-Control-Allow-Origin 响应头的情况下,这将删除重复的值。

    DedupeResponseHeader 过滤器还接受一个可选的 strategy 参数。接受的值是 RETAIN_FIRST(默认)、RETAIN_LAST 和 RETAIN_UNIQUE。

    6.8.FallbackHeaders

    通过 FallbackHeaders 工厂,你可以在转发到外部应用程序中的 fallbackUri 的请求的header中添加Spring Cloud CircuitBreaker的执行异常细节,如以下场景。

    Example 31. application.yml

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

    image.gif

    在这个例子中,在运行断路器时发生执行异常后,请求被转发到运行在 localhost:9994 的应用程序中的 fallback 端点或 handler。带有异常类型、消息和(如果有)根本原因的异常类型和消息的 header 被 FallbackHeaders 过滤器添加到该请求中。

    你可以通过设置以下参数的值(显示为默认值)来覆盖配置中header的名称。

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

      关于断路器和网关的更多信息,请参见 Spring Cloud CircuitBreaker Factory 部分 。

      6.9.JsonToGrpc

      JSONToGRPCFilter GatewayFilter Factory 将一个JSON payload 转换为gRPC请求。

      该过滤器需要以下参数。

        • protoDescriptor: Proto描述文件。

        这个文件可以用 protoc 生成,并指定 --descriptor_set_out 标志。

        protoc --proto_path=src/main/resources/proto/ \
        --descriptor_set_out=src/main/resources/proto/hello.pb  \
        src/main/resources/proto/hello.proto

        image.gif

          • protoFile: Proto定义文件。
          • service: 处理请求的服务的全名称。
          • method: 处理该请求的服务中的方法名称。

          支持 streaming。

          application.yml.

          @Bean
          public RouteLocator routes(RouteLocatorBuilder builder) {
              return builder.routes()
                      .route("json-grpc", r -> r.path("/json/hello").filters(f -> {
                          String protoDescriptor = "file:src/main/proto/hello.pb";
                          String protoFile = "file:src/main/proto/hello.proto";
                          String service = "HelloService";
                          String method = "hello";
                          return f.jsonToGRPC(protoDescriptor, protoFile, service, method);
                      }).uri(uri))

          image.gif

          spring:
            cloud:
              gateway:
                routes:
                  - id: json-grpc
                    uri: https://localhost:6565/testhello
                    predicates:
                      - Path=/json/**
                    filters:
                      - name: JsonToGrpc
                        args:
                          protoDescriptor: file:proto/hello.pb
                          protoFile: file:proto/hello.proto
                          service: com.example.grpcserver.hello.HelloService
                          method: hello

          image.gif

          当通过网关向 /json/hello 发出请求时,该请求通过使用 hello.proto 中提供的定义进行转换,发送到 com.example.grpcserver.hello.HelloService/hello,返回的响应被转换为JSON。

          默认情况下,它通过使用默认的 TrustManagerFactory 创建一个 NettyChannel。然而,你可以通过创建一个 GrpcSslConfigurer 类型的bean来定制这个 TrustManager。

          @Configuration
          public class GRPCLocalConfiguration {
              @Bean
              public GRPCSSLContext sslContext() {
                  TrustManager trustManager = trustAllCerts();
                  return new GRPCSSLContext(trustManager);
              }
          }

          image.gif

          6.10.LocalResponseCache

          这个过滤器允许缓存响应体和header,遵循以下规则。

            • 它只能缓存无请求体的GET请求。
            • 它只对以下状态代码之一的响应进行缓存。HTTP 200(OK),HTTP 206(部分内容),或HTTP 301(永久移动)。
            • 如果 Cache-Control header不允许,响应数据就不会被缓存(请求中存在 no-store 或响应中存在 no-store 或 private)。
            • 如果响应已经被缓存,并且在 Cache-Control 头中用 no-cache 值执行一个新的请求,它将返回一个304(未修改)的无body的响应。

            这个过滤器(配置每个路由的本地响应缓存)只有在启用了本地响应全局缓存的情况下才可用。

            它接受第一个参数,用于覆盖缓存条目过期的时间(用 s 表示秒,用 m 表示分钟,用 h 表示小时),第二个参数用于设置该路由驱逐条目的最大缓存大小(KB、MB或GB)。

            下面的列表显示了如何添加本地响应缓存 GatewayFilter。

            @Bean
            public RouteLocator routes(RouteLocatorBuilder builder) {
                return builder.routes()
                    .route("rewrite_response_upper", r -> r.host("*.rewriteresponseupper.org")
                        .filters(f -> f.prefixPath("/httpbin")
                            .localResponseCache(Duration.ofMinutes(30), "500MB")
                        ).uri(uri))
                    .build();
            }

            image.gif

            或者,这样:

            application.yaml

            spring:
              cloud:
                gateway:
                  routes:
                  - id: resource
                    uri: http://localhost:9000
                    predicates:
                    - Path=/resource
                    filters:
                    - LocalResponseCache=30m,500MB

            image.gif

            这个过滤器还自动计算 HTTP Cache-Control header中的 max-age 值。只有在原始响应中存在 max-age 的情况下,才会用 timeToLive 配置参数中设置的秒数重写该值。在连续的调用中,这个值会以响应过期前的剩余秒数重新计算。

            6.11.MapRequestHeader

            MapRequestHeader GatewayFilter 工厂接受 fromHeader 和 toHeader 参数。它创建一个新的命名header(toHeader),并从传入的http请求的现有命名头(fromHeader)中提取值。如果输入的header不存在,过滤器没有任何影响。如果新的命名header信息已经存在,它的值就会被增加新的值。下面的例子配置了一个 MapRequestHeader。

            Example 32. application.yml

            spring:
              cloud:
                gateway:
                  routes:
                  - id: map_request_header_route
                    uri: https://example.org
                    filters:
                    - MapRequestHeader=Blue, X-Request-Red

            image.gif

            这将在下游请求中添加 X-Request-Red: 头,并从传入的HTTP请求的 Blue 头中更新数值。

            6.12.ModifyRequestBody

            你可以使用 ModifyRequestBody 过滤器,在网关向下游发送请求体之前对其进行修改。

            这个过滤器只能通过使用Java DSL来配置。

            下面显示了如何使用 GatewayFilter 修改请求体:

            @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;
                }
            }

            image.gif

            如果请求没有正文,RewriteFilter 将被传递为 null。应该返回 Mono.empty() 来指定请求中缺少的主体。

            6.13.ModifyResponseBody

            你可以使用 ModifyResponseBody 过滤器来修改响应体,然后再把它送回给客户端。

            这个过滤器只能通过使用Java DSL来配置。

            下面显示了如何使用 GatewayFilter 修改响应体 。

            @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();
            }

            image.gif

            如果响应没有正文,RewriteFilter 将被传递为 null。应该返回 Mono.empty() 来指定响应中缺少的主体。

            6.14.PrefixPath

            PrefixPath GatewayFilter 工厂需要一个 prefix 参数。下面的例子配置了一个 PrefixPath GatewayFilter。

            Example 33. application.yml

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

            image.gif

            这就把 /mypath 作为所有匹配请求的路径的前缀。因此,一个到 /hello 的请求会被发送到 /mypath/hello。

            6.15.PreserveHostHeader

            PreserveHostHeader GatewayFilter 工厂没有参数。这个过滤器设置一个请求属性(request attribute),路由过滤器(routing filter)会检查该属性,以确定是否应该发送原始的主机头,而不是由HTTP客户端确定的主机头。下面的例子配置了一个 PreserveHostHeader GatewayFilter。

            Example 34. application.yml

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

            image.gif

            6.16.RedirectTo

            RedirectTo GatewayFilter 工厂需要两个参数,status 和 url。status 参数应该是一个300系列的重定向 HTTP 状态码,如301。url 参数应该是一个有效的URL。这就是 Location header 的值。对于相对重定向,你应该使用 uri: no://op 作为路由定义的uri。下面的列表配置了一个 RedirectTo GatewayFilter。

            Example 35. application.yml

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

            image.gif

            这将发送一个带有 Location:https://acme.org header的302状态码的响应,以执行重定向。

            6.17.RemoveJsonAttributesResponseBody

            RemoveJsonAttributesResponseBody GatewayFilter 工厂接收了一个要搜索的属性名称(attribute name)集合,列表中的最后一个参数可以是一个布尔值,用来删除根级的属性(如果该参数未定义,那就是默认值 false)或递归(true)。它提供了一个方便的方法,通过删除属性来应用于JSON body内容的转换。

            下面的例子配置了一个 RemoveJsonAttributesResponseBody GatewayFilter。

            Example 36. application.yml

            spring:
              cloud:
                gateway:
                  routes:
                  - id: removejsonattributes_route
                    uri: https://example.org
                    filters:
                    - RemoveJsonAttributesResponseBody=id,color

            image.gif

            这从根层的JSON body中删除了属性 "id" 和 "color"。

            下面的例子配置了一个 RemoveJsonAttributesResponseBody GatewayFilter,它使用了可选的最后参数。

            Example 37. application.yml

            spring:
              cloud:
                gateway:
                  routes:
                  - id: removejsonattributes_recursively_route
                    uri: https://example.org
                    predicates:
                    - Path=/red/{segment}
                    filters:
                    - RemoveJsonAttributesResponseBody=id,color,true

            image.gif

            这将从任何级别的JSON body中移除属性 "id" 和 "color"。

            6.18.RemoveRequestHeader

            RemoveRequestHeader GatewayFilter 工厂需要一个 name 参数。它是要被删除的header的名称。下面配置了一个 RemoveRequestHeader GatewayFilter。

            Example 38. application.yml

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

            image.gif

            这在向下游发送之前删除了 X-Request-Foo 标头。

            6.19.RemoveRequestParameter

            RemoveRequestParameter GatewayFilter 工厂需要一个 name 参数。它是要删除的查询参数的名称。下面的例子配置了一个 RemoveRequestParameter GatewayFilter。

            Example 39. application.yml

            spring:
              cloud:
                gateway:
                  routes:
                  - id: removerequestparameter_route
                    uri: https://example.org
                    filters:
                    - RemoveRequestParameter=red

            image.gif

            这将在向下游发送之前删除 red 参数。

            6.20.RemoveResponseHeader

            RemoveResponseHeader GatewayFilter 工厂需要一个 name 参数。它是要被移除的 header 的名称。下面的列表配置了一个 RemoveResponseHeader GatewayFilter。

            Example 40. application.yml

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

            image.gif

            这将在响应返回到网关客户端之前从响应中删除 X-Response-Foo 头。

            要删除任何类型的敏感标头,你应该为任何你可能想这样做的路由配置这个过滤器。此外,你可以通过使用 spring.cloud.gateway.default-filters 配置一次此过滤器,并将其应用于所有路由。

            6.21.RequestHeaderSize

            RequestHeaderSize GatewayFilter 工厂接受 maxSize 和 errorHeaderName 参数。maxSize 参数是请求头(包括key和value)所允许的最大数据大小。errorHeaderName 参数设置包含错误信息的响应头的名称,默认为 "errorMessage"。下面的列表配置了一个 RequestHeaderSize GatewayFilter。

            Example 41. application.yml

            spring:
              cloud:
                gateway:
                  routes:
                  - id: requestheadersize_route
                    uri: https://example.org
                    filters:
                    - RequestHeaderSize=1000B

            image.gif

            如果任何请求头的大小超过1000字节,这将发送一个 431状态码的响应。

            6.22.RequestRateLimiter

            RequestRateLimiter GatewayFilter 工厂使用 RateLimiter 实现来确定是否允许当前请求继续进行。如果不允许,就会返回 HTTP 429 - Too Many Requests(默认)的状态。

            这个过滤器需要一个可选的 keyResolver 参数和特定于速率限制器的参数(在本节后面描述)。

            keyResolver 是一个实现了 KeyResolver 接口的Bean。在配置中,使用SpEL来引用Bean的名字。#{@myKeyResolver} 是一个SpEL表达式,它引用了一个名为 myKeyResolver 的bean。下面的列表显示了 KeyResolver 的接口。

            Example 42. KeyResolver.java

            public interface KeyResolver {
                Mono<String> resolve(ServerWebExchange exchange);
            }

            image.gif

            KeyResolver 接口让可插拔的策略导出限制请求的key。在未来的里程碑版本中,会有一些 KeyResolver 的实现。

            KeyResolver 的默认实现是 PrincipalNameKeyResolver,它从 ServerWebExchange 中检索 Principal 并调用 Principal.getName()。

            默认情况下,如果 KeyResolver 没有找到一个 key,请求会被拒绝。你可以通过设置 spring.cloud.gateway.filter.request-rate-limiter.deny-empty-key(true 或 false)和 spring.cloud.gateway.filter.request-rate-limiter.empty-key-status-code 属性来调整这种行为。

            RequestRateLimiter 不能用 "快捷方式" 来配置。下面的例子是无效的。

            Example 43. application.properties


            # 无效的快捷方式配置
            spring.cloud.gateway.routes[0].filters[0]=RequestRateLimiter=2, 2, #{@userkeyresolver}

            6.22.1. RedisRateLimiter

            Redis的实现是基于 Stripe 的工作。它需要使用 spring-boot-starter-data-redis-reactive Spring Boot Starter。

            使用的算法是 令牌桶算法。

            redis-rate-limiter.replenishRate 属性定义了每秒钟允许多少个请求(不算放弃的请求)。这是令牌桶被填充的速度。

            redis-rate-limiter.burstCapacity 属性是一个用户在一秒钟内允许的最大请求数(不算放弃的请求)。这是令牌桶可以容纳的令牌数量。将此值设置为零会阻止所有请求。

            redis-rate-limiter.requestedTokens 属性是指一个请求要花费多少令牌。这是为每个请求从桶中提取的令牌数量,默认为 1。

            一个稳定的速率是通过在 replenishRate 和 burstCapacity 中设置相同的值来实现的。可以通过设置高于补给率的 burstCapacity 来允许临时的突发。在这种情况下,速率限制器需要在突发之间允许一些时间(根据 replenishRate),因为连续两次突发会导致请求被放弃(HTTP 429 - Too Many Requests)。下面的列表配置了一个 redis-rate-limiter。

            低于 1个请求/s 的速率限制是通过将 replenishRate 设置为想要的请求数, requestTokens 设置为秒数,burstCapacity 设置为 replenishRate 和 requestTokens 的乘积来完成的。例如,设置 replenishRate=1,requestedTokens=60,burstCapacity=60,结果是1个请求/分钟的限制。

            Example 44. application.yml

            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
                        redis-rate-limiter.requestedTokens: 1

            image.gif

            下面的例子在Java中配置了一个 KeyResolver。

            Example 45. Config.java

            @Bean
            KeyResolver userKeyResolver() {
                return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));
            }

            image.gif

            这定义了每个用户的请求率限制为10。爆发20次是允许的,但是,在下一秒,只有10个请求可用。KeyResolver 是一个简单的,获得 user 请求参数。

            不建议在生产中使用这个方法

            你也可以把速率限制器定义为一个实现 RateLimiter 接口的bean。在配置中,你可以用SpEL来引用bean的名字。#{@myRateLimiter} 是一个SpEL表达式,它引用了一个名为 myRateLimiter 的 bean。下面的清单定义了一个速率限制器,它使用了前面清单中定义的 KeyResolver。

            Example 46. application.yml

            spring:
              cloud:
                gateway:
                  routes:
                  - id: requestratelimiter_route
                    uri: https://example.org
                    filters:
                    - name: RequestRateLimiter
                      args:
                        rate-limiter: "#{@myRateLimiter}"
                        key-resolver: "#{@userKeyResolver}"

            image.gif

            6.23.RewriteLocationResponseHeader

            RewriteLocationResponseHeader GatewayFilter 工厂修改 Location 响应头的值,通常是为了去掉后台的特定细节。它需要 stripVersionMode、locationHeaderName、hostValue 和 protocolsRegex 参数。下面的清单配置了一个 RewriteLocationResponseHeader GatewayFilter。

            Example 47. application.yml

            spring:
              cloud:
                gateway:
                  routes:
                  - id: rewritelocationresponseheader_route
                    uri: http://example.org
                    filters:
                    - RewriteLocationResponseHeader=AS_IN_REQUEST, Location, ,

            image.gif

            例如,对于一个 POST api.example.com/some/object/name 的请求, Location 响应头值 object-service.prod.example.net/v2/some/object/id 被改写为 api.example.com/some/object/id。

            stripVersionMode 参数有以下可能的值。NEVER_STRIP、AS_IN_REQUEST(默认)和 ALWAYS_STRIP。

              • NEVER_STRIP: 即使最初的请求路径不包含version,version也不会被剥离。
              • AS_IN_REQUEST: 只有当原始请求路径不包含version时,才会剥离version。
              • ALWAYS_STRIP: version 总是被剥离,即使原始请求路径包含version 。

              hostValue 参数,如果提供的话,将用于替换响应的 Location 头的 host:port 部分。如果没有提供,则使用 Host 请求头的值。

              protocolsRegex 参数必须是一个有效的 regex String,协议名称将与之匹配。如果没有匹配,过滤器不做任何事情。默认是 http|https|ftp|ftps。

              6.24.RewritePath

              RewritePath GatewayFilter 工厂接收一个路径 regexp 参数和一个 replacement 参数。这是用Java正则表达式来重写请求路径的一种灵活方式。下面的列表配置了一个 RewritePath GatewayFilter。

              Example 48. application.yml

              spring:
                cloud:
                  gateway:
                    routes:
                    - id: rewritepath_route
                      uri: https://example.org
                      predicates:
                      - Path=/red/**
                      filters:
                      - RewritePath=/red/?(?<segment>.*), /$\{segment}

              image.gif

              对于请求路径为 /red/blue 的情况,在进行下游请求之前将路径设置为 /blue。注意,由于YAML的规范,应该被替换成 应该被替换成 \。

              6.25.RewriteResponseHeader

              RewriteResponseHeader GatewayFilter 工厂接受 name、regexp 和 replacement 参数。它使用Java正则表达式,以一种灵活的方式重写响应头的值。下面的例子配置了一个 RewriteResponseHeader GatewayFilter。

              Example 49. application.yml

              spring:
                cloud:
                  gateway:
                    routes:
                    - id: rewriteresponseheader_route
                      uri: https://example.org
                      filters:
                      - RewriteResponseHeader=X-Response-Red, , password=[^&]+, password=***

              image.gif

              对于一个 /42?user=ford&password=omg!what&flag=true 的header值,在发出下游请求后,它被设置为 /42?user=ford&password=***&flag=true。因为YAML规范,你必须用 来表示\ 来表示 。

              6.26.SaveSession

              SaveSession GatewayFilter 工厂在转发下游调用之前强制进行 WebSession::save 操作。这在使用类似 Spring Session 的懒数据存储时特别有用,因为你需要确保在进行转发调用之前已经保存了Session状态。下面的例子配置了一个 SaveSession GatewayFilter。

              Example 50. application.yml

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

              image.gif

              如果你将 Spring Security 与 Spring Session 集成,并希望确保安全细节(security detail)已被转发到远程进程,这一点至关重要。

              6.27.SecureHeaders

              根据 这篇博客的建议,SecureHeaders GatewayFilter 工厂在响应中添加了一些头信息。

              以下header信息(显示为其默认值)被添加。

                • 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)

                要改变默认值,请在 spring.cloud.gateway.filter.secure-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.disable 属性,如下。

                  spring.cloud.gateway.filter.secure-headers.disable=x-frame-options,strict-transport-security

                  image.gif

                  需要使用 secure header 的小写全名来禁用它。

                  6.28.SetPath

                  SetPath GatewayFilter 工厂接受一个路径模板参数。它提供了一种简单的方法,通过允许模板化的路径段来操作请求路径。这使用了 Spring Framework 的URI模板。允许多个匹配段。下面的例子配置了一个 SetPath GatewayFilter。

                  Example 51. application.yml

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

                  image.gif

                  对于请求路径为 /red/blue 的情况,在进行下行请求之前,将路径设置为 /blue。

                  6.29.SetRequestHeader

                  SetRequestHeader GatewayFilter 工厂接受 name 和 value 参数。下面的列表配置了一个 SetRequestHeader GatewayFilter。

                  Example 52. application.yml

                  spring:
                    cloud:
                      gateway:
                        routes:
                        - id: setrequestheader_route
                          uri: https://example.org
                          filters:
                          - SetRequestHeader=X-Request-Red, Blue

                  image.gif

                  这 GatewayFilter 会替换(而不是添加)所有给定名称的 header 信息。 因此,如果下游服务器以 X-Request-Red:1234 响应,它将被替换为 X-Request-Red:Blue,这就是下游服务会收到的。

                  SetRequestHeader 知道用于匹配路径或主机的URI变量。URI变量可以在值中使用,并在运行时被扩展。下面的例子配置了一个 SetRequestHeader GatewayFilter,它使用了一个变量。

                  Example 53. application.yml

                  spring:
                    cloud:
                      gateway:
                        routes:
                        - id: setrequestheader_route
                          uri: https://example.org
                          predicates:
                          - Host: {segment}.myhost.org
                          filters:
                          - SetRequestHeader=foo, bar-{segment}

                  image.gif

                  6.30.SetResponseHeader

                  SetResponseHeader GatewayFilter 工厂接受 name 和 value 参数。下面的列表配置了一个 SetResponseHeader GatewayFilter。

                  Example 54. application.yml

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

                  image.gif

                  这个 GatewayFilter 会替换(而不是添加)所有带有给定名称的头信息。 因此,如果下游服务器以 X-Response-Red:1234 响应,它将被替换为 X-Response-Red:Blue,这就是网关客户端将收到的内容。

                  SetResponseHeader 知道用于匹配路径或主机的URI变量。URI变量可以在值中使用,并将在运行时被扩展。下面的例子配置了一个 SetResponseHeader GatewayFilter,它使用了一个变量。

                  Example 55. application.yml

                  spring:
                    cloud:
                      gateway:
                        routes:
                        - id: setresponseheader_route
                          uri: https://example.org
                          predicates:
                          - Host: {segment}.myhost.org
                          filters:
                          - SetResponseHeader=foo, bar-{segment}

                  image.gif

                  6.31.SetStatus

                  SetStatus GatewayFilter 工厂只接受一个参数,即 status。它必须是一个有效的Spring HttpStatus。它可以是 404 的int值或枚举的字符串表示: NOT_FOUND。下面的列表配置了一个 SetStatus GatewayFilter。

                  Example 56. application.yml

                  spring:
                    cloud:
                      gateway:
                        routes:
                        - id: setstatusstring_route
                          uri: https://example.org
                          filters:
                          - SetStatus=UNAUTHORIZED
                        - id: setstatusint_route
                          uri: https://example.org
                          filters:
                          - SetStatus=401

                  image.gif

                  在这两种情况下,响应的HTTP状态被设置为401。

                  你可以配置 SetStatus GatewayFilter,使其在响应中的头中返回代理请求的原始HTTP状态代码。如果配置了以下属性,该头会被添加到响应中。

                  Example 57. application.yml

                  spring:
                    cloud:
                      gateway:
                        set-status:
                          original-status-header-name: original-http-status

                  image.gif

                  6.32.StripPrefix

                  StripPrefix GatewayFilter 工厂需要一个参数,即 parts。parts 参数表示在向下游发送请求之前要从路径中剥离的部分的数量。下面的列表配置了一个 StripPrefix GatewayFilter。

                  Example 58. application.yml

                  spring:
                    cloud:
                      gateway:
                        routes:
                        - id: nameRoot
                          uri: https://nameservice
                          predicates:
                          - Path=/name/**
                          filters:
                          - StripPrefix=2

                  image.gif

                  当通过网关向 /name/blue/red 发出请求时,向 nameservice 发出的请求看起来像 nameservice/red。

                  6.33.Retry

                  Retry GatewayFilter 工厂支持以下参数。

                    • retries: 应该尝试的重试次数。
                    • statuses: 应该重试的HTTP状态代码,用 org.springframework.http.HttpStatus 表示。
                    • methods: 应该重试的HTTP方法,用 org.springframework.http.HttpMethod 来表示。
                    • series: 要重试的状态代码系列,用 org.springframework.http.HttpStatus.Series 表示。
                    • exceptions: 抛出的异常的列表,应该重试。
                    • backoff: 为重试配置的指数式backoff。重试是在 backoff 间隔 firstBackoff * (factor ^ n) 之后进行的,其中 n 是迭代次数。如果配置了 maxBackoff,应用的最大 backoff 时间被限制在 maxBackoff。如果 basedOnPreviousValue 为 true,则通过使用 prevBackoff * factor 来计算backoff。

                    如果启用,为 Retry filter 配置的默认值如下。

                      • retries: 三次
                      • series: 5XX系列
                      • methods: GET 请求
                      • exceptions: IOException 和 TimeoutException
                      • backoff: disabled

                      下面配置了一个 Retry GatewayFilter。

                      Example 59. application.yml

                      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
                                  methods: GET,POST
                                  backoff:
                                    firstBackoff: 10ms
                                    maxBackoff: 50ms
                                    factor: 2
                                    basedOnPreviousValue: false

                      image.gif

                      当使用带有 forward: 前缀的URL的 retry filter 时,应仔细编写目标端点,以便在出现错误时,它不会做任何可能导致响应被发送到客户端并提交的事情。例如,如果目标端点是一个 @Controller,目标controller方法不应该返回带有错误状态码的 ResponseEntity。相反,它应该抛出一个 Exception 或发出一个错误信号(例如,通过 Mono.error(ex) 返回值),retry filter 可以被配置为通过重试来处理。

                      当对任何带有body的HTTP方法使用 retry filter 时,body将被缓存,网关将变得内存受限。body被缓存在 ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR 定义的请求属性(request attribute)中。该对象的类型是 org.springframework.core.io.buffer.DataBuffer。

                      一个简化的 "快捷" 方式可以用一个 status 和 method 来添加。

                      以下两个例子是等同的。

                      Example 60. application.yml

                      spring:
                        cloud:
                          gateway:
                            routes:
                            - id: retry_route
                              uri: https://example.org
                              filters:
                              - name: Retry
                                args:
                                  retries: 3
                                  statuses: INTERNAL_SERVER_ERROR
                                  methods: GET
                                  backoff:
                                    firstBackoff: 10ms
                                    maxBackoff: 50ms
                                    factor: 2
                                    basedOnPreviousValue: false
                            - id: retryshortcut_route
                              uri: https://example.org
                              filters:
                              - Retry=3,INTERNAL_SERVER_ERROR,GET,10ms,50ms,2,false

                      image.gif

                      6.34.RequestSize

                      当请求的大小超过允许的限制时,RequestSize GatewayFilter 工厂可以限制请求到达下游服务。该过滤器需要一个 maxSize 参数。maxSize 是一个 DataSize 类型,所以值可以定义为一个数字,后面有一个可选的 DataUnit 后缀,如 'KB' 或’MB'。默认是 'B',表示字节。它是以字节为单位定义的请求的可允许的大小限制。下面的列表配置了一个 RequestSize GatewayFilter。

                      Example 61. application.yml

                      spring:
                        cloud:
                          gateway:
                            routes:
                            - id: request_size_route
                              uri: http://localhost:8080/upload
                              predicates:
                              - Path=/upload
                              filters:
                              - name: RequestSize
                                args:
                                  maxSize: 5000000

                      image.gif

                      RequestSize GatewayFilter 工厂将响应状态设置为 413 Payload Too Large,当请求由于大小而被拒绝时,会有一个额外的头 errorMessage。下面的例子显示了这样一个 errorMessage。

                      errorMessage : Request size is larger than permissible limit. Request size is 6.0 MB where permissible limit is 5.0 MB

                      image.gif

                      如果在路由定义中没有提供filter参数,默认请求大小被设置为5MB。

                      6.35.SetRequestHostHeader

                      在某些情况下,host 头可能需要被重写。在这种情况下,SetRequestHostHeader GatewayFilter 工厂可以将现有的 host header 替换成指定的值。该过滤器需要一个 host 参数。下面的列表配置了一个 SetRequestHostHeader GatewayFilter。

                      Example 62. application.yml

                      spring:
                        cloud:
                          gateway:
                            routes:
                            - id: set_request_host_header_route
                              uri: http://localhost:8080/headers
                              predicates:
                              - Path=/headers
                              filters:
                              - name: SetRequestHostHeader
                                args:
                                  host: example.org

                      image.gif

                      SetRequestHostHeader GatewayFilter 工厂将 host 头的值替换为 example.org。

                      6.36.TokenRelay

                      Token Relay是指OAuth2消费者作为客户端,将传入的令牌转发给传出的资源请求。消费者可以是一个纯粹的客户端(如SSO应用程序)或一个资源服务器。

                      Spring Cloud Gateway 可以将 OAuth2 访问令牌转发到它所代理的服务的下游。为了在网关中添加这一功能,你需要像这样添加 TokenRelayGatewayFilterFactory。

                      App.java

                      @Bean
                      public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
                          return builder.routes()
                                  .route("resource", r -> r.path("/resource")
                                          .filters(f -> f.tokenRelay())
                                          .uri("http://localhost:9000"))
                                  .build();
                      }

                      image.gif

                      或者,这样。

                      application.yaml

                      spring:
                        cloud:
                          gateway:
                            routes:
                            - id: resource
                              uri: http://localhost:9000
                              predicates:
                              - Path=/resource
                              filters:
                              - TokenRelay=

                      image.gif

                      它将(除了登录用户和抓取令牌之外)把认证令牌传递给下游的服务(在这里是 /resource)。

                      要为 Spring Cloud Gateway 启用这个功能,需要添加以下依赖

                        • org.springframework.boot:spring-boot-starter-oauth2-client

                        它是如何工作的? {githubmaster}/src/main/java/org/springframework/cloud/gateway/security/TokenRelayGatewayFilterFactory.java[filter]从当前认证的用户中提取一个访问令牌,并将其放在下游请求的请求头中。

                        完整的工作样本见 该项目。

                        只有当适当的 spring.security.oauth2.client.* 属性被设置时, TokenRelayGatewayFilterFactory Bean才会被创建,这将触发 ReactiveClientRegistrationRepository Bean的创建。

                        TokenRelayGatewayFilterFactory 使用的 ReactiveOAuth2AuthorizedClientService 的默认实现使用了一个内存数据存储。如果你需要一个更强大的解决方案,你将需要提供你自己的实现 ReactiveOAuth2AuthorizedClientService。

                        6.37. 默认 Filter

                        要添加一个filter并将其应用于所有路由,可以使用 spring.cloud.gateway.default-filters。这个属性需要一个filter的列表。下面的列表定义了一组默认filter。

                        Example 63. application.yml

                        spring:
                          cloud:
                            gateway:
                              default-filters:
                              - AddResponseHeader=X-Response-Default-Red, Default-Blue
                              - PrefixPath=/httpbin

                        image.gif



                        文章下方有交流学习区!一起学习进步!也可以前往官网,加入官方微信交流群你的支持和鼓励是我创作的动力❗❗❗

                        官网:Doker 多克; 官方旗舰店:首页-Doker 多克 多克创新科技企业店-淘宝网 全品优惠

                        相关实践学习
                        基于Redis实现在线游戏积分排行榜
                        本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
                        云数据库 Redis 版使用教程
                        云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
                        目录
                        相关文章
                        |
                        6天前
                        |
                        负载均衡 Java API
                        Java一分钟之-Spring Cloud OpenFeign:声明式服务调用
                        【6月更文挑战第9天】Spring Cloud OpenFeign是声明式服务调用库,简化了微服务间调用。通过动态代理,它允许开发者用Java接口调用HTTP服务,支持服务发现、负载均衡。本文介绍了OpenFeign的基本概念,展示了如何添加依赖、开启客户端和定义服务接口。还讨论了接口调用失败、超时重试和日志配置等问题及其解决方案,并提供了自定义Feign配置的代码示例。通过学习,读者可以更好地在微服务架构中使用OpenFeign进行服务通信。
                        158 4
                        |
                        1天前
                        |
                        Java 数据库 开发者
                        深入解析 Spring Cloud Seata:分布式事务的全面指南
                        深入解析 Spring Cloud Seata:分布式事务的全面指南
                        11 1
                        |
                        1天前
                        |
                        监控 Java API
                        深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
                        深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
                        5 0
                        深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
                        |
                        1天前
                        |
                        Java Nacos 数据格式
                        Spring Cloud Nacos 详解:服务注册与发现及配置管理平台
                        Spring Cloud Nacos 详解:服务注册与发现及配置管理平台
                        13 3
                        |
                        1天前
                        |
                        负载均衡 Java API
                        Spring Cloud Gateway 详解:构建高效的API网关解决方案
                        Spring Cloud Gateway 详解:构建高效的API网关解决方案
                        5 0
                        |
                        3天前
                        |
                        负载均衡 前端开发 Java
                        OpenFeign:Spring Cloud声明式服务调用组件
                        该文本是关于OpenFeign在Spring Cloud中的使用的问答总结。涉及的问题包括:OpenFeign是什么,Feign与OpenFeign的区别,如何使用OpenFeign进行远程服务调用,OpenFeign的超时控制以及日志增强。OpenFeign被描述为Spring官方的声明式服务调用和负载均衡组件,它支持使用注解进行接口定义和服务调用,如@FeignClient和@EnableFeignClients。OpenFeign与Feign的主要区别在于OpenFeign支持Spring MVC注解。超时控制通过Ribbon进行设置,默认超时时间为1秒。
                        |
                        4天前
                        |
                        Java 应用服务中间件 nginx
                        【Azure Spring Apps】Spring App部署上云遇见 502 Bad Gateway nginx
                        在部署Azure Spring App后,用户遇到502 Bad Gateway错误,问题源于Nginx。解决方案是检查并关闭Spring App的ingress-to-app TLS配置,因为若未启用HTTPS访问,Nginx通过HTTPS访问应用会导致此错误。
                        |
                        5天前
                        |
                        Java API 开发者
                        Java一分钟之-Spring Cloud Gateway:API网关
                        【6月更文挑战第10天】Spring Cloud Gateway是Spring Cloud生态中的API网关组件,基于Spring Framework 5、Reactor和Spring Boot 2.0,支持响应式编程。它提供路由转发、过滤器链(包括预处理、路由和后处理)和断言功能。快速入门涉及添加相关依赖和配置路由规则。常见问题包括路由冲突、过滤器顺序和性能瓶颈。通过动态路由和过滤器示例,展示了其灵活性。Spring Cloud Gateway是微服务架构的有力工具,可提升系统稳定性和开发效率。
                        111 0
                        |
                        6天前
                        |
                        监控 Java UED
                        Java一分钟之-Spring Cloud Netflix Hystrix:容错管理
                        【6月更文挑战第9天】Spring Cloud Hystrix是用于微服务容错管理的库,通过断路器模式防止服务雪崩。本文介绍了Hystrix的基本概念,如断路器、线程隔离和fallback机制,并展示了如何快速上手,包括添加依赖、启用注解和编写Hystrix命令。此外,还讨论了常见问题(如断路器打开、资源泄漏和不当的Fallback策略)及其解决方案。通过自定义Hystrix指标监控,可以进一步优化系统性能。理解Hystrix工作原理并适时调整配置,对于构建健壮的微服务至关重要。
                        113 3
                        |
                        6天前
                        |
                        缓存 负载均衡 Java
                        Java一分钟之-Spring Cloud Netflix Ribbon:客户端负载均衡
                        【6月更文挑战第9天】Spring Cloud Netflix Ribbon是客户端负载均衡器,用于服务间的智能路由。本文介绍了Ribbon的基本概念、快速入门步骤,包括添加依赖、配置服务调用和使用RestTemplate。此外,还讨论了常见问题,如服务实例选择不均、超时和重试设置不当、服务列表更新不及时,并提供了相应的解决策略。最后,展示了如何自定义负载均衡策略。理解并正确使用Ribbon能提升微服务架构的稳定性和效率。
                        75 3