SpringCloudGateway中文文档六章(3.1.0)

SpringCloudGateway中文文档六章(3.1.0)

2023年7月4日发(作者:)

SpringCloudGateway中⽂⽂档六章(3.1.0)Spring Cloud yFilter⼯⼚路由过滤器允许以某种⽅式修改传⼊的 HTTP 请求或传出的 HTTP 应答。路由过滤器的范围是特定的路由。Spring Cloud Gateway 包含许多内置的 GatewayFilter ⼯⼚。uestHeader GatewayFilterFactoryAddRequestHeader GatewayFilterFactory拥有name、value两个参数。以下⽰例配置⼀个AddRequestHeader GatewayFilter:⽰例 ing: cloud: gateway: routes: - id: add_request_header_route uri: filters: - AddRequestHeader=X-Request-red, blue该配置向所有匹配请求的Header中添加X-Request-red参数,参数值为:blue。可以配合path或host中使⽤URI 变量。以下⽰例配置AddRequestHeader GatewayFilter使⽤变量:⽰例 ing: cloud: gateway: routes: - id: add_request_header_route uri: predicates: - Path=/red/{segment} filters: - AddRequestHeader=X-Request-Red, Blue-{segment}uestParameter GatewayFilterFactoryAddRequestParameter GatewayFilterFactory 拥有name、value两个参数。以下⽰例配置⼀个AddRequestParameter GatewayFilter:⽰例 ing: cloud: gateway: routes: - id: add_request_parameter_route uri: filters: - AddRequestParameter=red, blue这将添加red=blue到所有匹配请求的请求的查询字符串中。可以配合path或host中使⽤URI 变量。以下⽰例配置AddRequestHeader GatewayFilter使⽤变量:⽰例 ing: cloud: gateway: routes: - id: add_request_parameter_route uri: predicates: - Host: {segment}. filters: - AddRequestParameter=foo, bar-{segment}ponseHeader GatewayFilterFactoryAddResponseHeader GatewayFilterFactory 拥有name、value两个参数。以下⽰例配置⼀个AddResponseHeader GatewayFilter:⽰例 ing: cloud: gateway: routes: - id: add_response_header_route uri: filters: - AddResponseHeader=X-Response-Red, Blue这会将X-Response-Red:Blue标头添加到所有匹配请求的响应Header中。可以配合path或host中使⽤URI 变量。以下⽰例配置AddRequestHeader GatewayFilter使⽤变量:⽰例 ing: cloud: gateway: routes: - id: add_response_header_route uri: predicates: - Host: {segment}. filters: - AddResponseHeader=foo, bar-{segment}ResponseHeader GatewayFilterFactoryDedupeResponseHeader GatewayFilter Factory接受⼀个name参数和⼀个可选strategy参数。name可以包含以空格分隔的标题名称列表。以下⽰例配置了⼀个DedupeResponseHeader GatewayFilter:⽰例 ing: cloud: gateway: routes: - id: dedupe_response_header_route uri: filters: - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin这将删除Access-Control-Allow-Credentials、Access-Control-Allow-Origin的重复值过滤器DedupeResponseHeader还接受⼀个可选strategy参数。值可以为:RETAIN_FIRST(默认)RETAIN_LAST、 和RETAIN_UNIQUE。 Cloud CircuitBreaker GatewayFilterFactorySpring Cloud CircuitBreaker GatewayFilterFactory使⽤ Spring Cloud CircuitBreaker API 将⽹关路由包装在断路器中。SpringCloud CircuitBreaker ⽀持多个可与 Spring Cloud Gateway ⼀起使⽤的库。Spring Cloud 开箱即⽤地⽀持 Resilience4J。要启⽤ Spring Cloud CircuitBreaker 过滤器,您需要放置spring-cloud-starter-circuitbreaker-reactor-resilience4j在类路径中。以下⽰例配置 Spring Cloud CircuitBreaker GatewayFilter:⽰例 ing: cloud: gateway: routes: - id: circuitbreaker_route uri: filters: - CircuitBreaker=myCircuitBreaker要配置断路器,请参阅您正在使⽤的底层断路器实现的配置。Spring Cloud CircuitBreaker 过滤器也可以接受⼀个可选fallbackUri参数。⽬前,仅forward:⽀持。如果调⽤了fallback,则将请求转发到URI匹配的控制器。以下⽰例配置了这样的fallback:⽰例 ing: 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下⾯为在 Java 中实现的例⼦:例 @Beanpublic RouteLocator routes(RouteLocatorBuilder builder) { return () .route("circuitbreaker_route", r -> ("/consumingServiceEndpoint") .filters(f -> tBreaker(c -> ("myCircuitBreaker").fallbackUri("forward:/inCaseOfFailureUseThis")) .rewritePath("/consumingServiceEndpoint", "/backingServiceEndpoint")).uri("lb://backing-service:8088") .build();}此⽰例在断路器fallback时转发到/inCaseofFailureUseThis。请注意,此⽰例还演⽰了(可选)Spring Cloud LoadBalancer 负载平衡(由lb⽬标 URI 上的前缀定义)。主要场景是使⽤fallbackUri定义⽹关应⽤程序中的内部控制器或处理程序。但是,您也可以将请求重新路由到外部应⽤程序中的控制器或处理程序,如下所⽰:⽰例 ing: cloud: gateway: routes: - id: ingredients uri: lb://ingredients predicates: - Path=//ingredients/** filters: - name: CircuitBreaker args: name: fetchIngredients fallbackUri: forward:/fallback - id: ingredients-fallback uri: localhost:9994 predicates: - Path=/fallback在此⽰例中,⽹关应⽤程序中没有fallback端点或处理程序。但是,在另⼀个应⽤程序中有⼀个,在localhost:9994.在请求被转发到回退的情况下,Spring Cloud CircuitBreaker Gateway 过滤器还提供了Throwable导致它的原因。它被添加到ServerWebExchange作为TBREAKER_EXECUTION_EXCEPTION_ATTR在⽹关应⽤程序中处理回退时可以使⽤的属性。对于外部控制器/处理程序场景,可以添加带有异常详细信息的标头。您可以在FallbackHeaders GatewayFilter Factory 部分找到更多信息。6.5.1. 在状态代码上使断路器跳闸在某些情况下,您可能希望根据从其包裹的路由返回的状态代码来触发断路器。断路器配置对象采⽤状态代码列表,如果返回将导致断路器跳闸。在设置要使断路器跳闸的状态代码时,您可以使⽤带有状态代码值的整数或HttpStatus枚举的字符串表⽰形式。⽰例 ing: 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"例 @Beanpublic RouteLocator routes(RouteLocatorBuilder builder) { return () .route("circuitbreaker_route", r -> ("/consumingServiceEndpoint") .filters(f -> tBreaker(c -> ("myCircuitBreaker").fallbackUri("forward:/inCaseOfFailureUseThis").addStatusCode("INTERNAL_SERVER_ERROR")) .rewritePath("/consumingServiceEndpoint", "/backingServiceEndpoint")).uri("lb://backing-service:8088") .build();}ckHeaders GatewayFilterFactory⼯⼚允许您在转发到外部应⽤程序中FallbackHeaders的请求的标头中添加 Spring Cloud CircuitBreaker 执⾏异常详细信息,如以下所⽰:fallbackUri⽰例 ing: cloud: gateway: routes: - id: ingredients uri: lb://ingredients predicates: - Path=//ingredients/** filters: - name: CircuitBreaker args: name: fetchIngredients fallbackUri: forward:/fallback - id: ingredients-fallback uri: localhost:9994 predicates: - Path=/fallback filters: - name: FallbackHeaders args: executionExceptionTypeHeaderName: Test-Header在此⽰例中,在运⾏断路器时发⽣执⾏异常后,请求将被转发到fallback运⾏在 上的应⽤程序中的端点或处理程序localhost:9994。具有异常类型、消息和(如果可⽤)根本原因异常类型和消息的标头由FallbackHeaders过滤器添加到该请求。您可以通过设置以下参数的值(显⽰为默认值)来覆盖配置中标头的名称:executionExceptionTypeHeaderName( “Execution-Exception-Type”)executionExceptionMessageHeaderName( “Execution-Exception-Message”)rootCauseExceptionTypeHeaderName( “Root-Cause-Exception-Type”)rootCauseExceptionMessageHeaderName( “Root-Cause-Exception-Message”)有关断路器和⽹关的更多信息,请参阅Spring Cloud CircuitBreaker Factory 部分。uestHeader GatewayFilterFactoryMapRequestHeader GatewayFilter⼯⼚接受fromHeader和toHeader参数。它创建⼀个新的命名标头 (toHeader ),并从传⼊的 http请求中现有的命名标头 (fromHeader ) 中提取值。如果输⼊标头不存在,则过滤器没有影响。如果新的命名标头已经存在,则其值将使⽤新值进⾏扩充。以下⽰例配置了⼀个MapRequestHeader:⽰例 ing: cloud: gateway: routes: - id: map_request_header_route uri: filters: - MapRequestHeader=Blue, X-Request-Red这会将X-Request-Red:标头添加到下游请求,其中包含来⾃传⼊ HTTP 请求Blue标头的更新值。Path GatewayFilterFactoryPrefixPath GatewayFilter拥有prefix⼀个参数参数。以下⽰例配置了⼀个PrefixPath GatewayFilter:⽰例 ing: cloud: gateway: routes: - id: prefixpath_route uri: filters: - PrefixPath=/mypath这将所有匹配请求路径的增加/mypath前缀。因此,/hello将向/mypath/hello发送请求。veHostHeader GatewayFilterFactoryPreserveHostHeader GatewayFilterFactory没有参数。此过滤器设置路由过滤器检查的请求属性,以确定是否应发送原始主机头,⽽不是由 HTTP 客户端确定的主机头。以下⽰例配置了⼀个PreserveHostHeader GatewayFilter:⽰例 ing: cloud: gateway: routes: - id: preserve_host_route uri: filters: - tRateLimiter GatewayFilterFactoryRequestRateLimiter GatewayFilterFactory使⽤实现RateLimiter来确定是否允许当前请求继续。如果不是,则返回(默认情况下)HTTP 429 - Too Many Requests 状态。此过滤器采⽤可选keyResolver参数和特定于速率限制器的参数(本节稍后描述)。keyResolver是实现KeyResolver接⼝的bean。在配置中,使⽤ SpEL 按名称引⽤ bean。 #{@myKeyResolver}是⼀个引⽤名为 的bean 的 SpEL 表达式myKeyResolver。以下清单显⽰了该KeyResolver界⾯:⽰例 blic interface KeyResolver { Mono resolve(ServerWebExchange exchange);}该KeyResolver接⼝让可插拔策略派⽣出限制请求的密钥。在未来的⾥程碑版本中,将会有⼀些KeyResolver实现。默认的KeyResolver实现是PrincipalNameKeyResolver,它从ServerWebExchange和调⽤中检索e()取得Principal。默认情况下,如果KeyResolver找不到密钥,则拒绝请求。您可以通过设置-empty-key(true或false) 和-key-status-code属性来调整此⾏为。不能使⽤RequestRateLimiter“快捷⽅式”表⽰法进⾏配置。以下⽰例⽆效:⽰例 ties# ⽆效的快捷⽅式配置[0].filters[0]=RequestRateLimiter=2, 2, #{@userkeyresolver}6.10.1. The Redis RateLimiterRedis 的实现基于在Stripe完成的⼯作。它需要使⽤spring-boot-starter-data-redis-reactiveSpring Boot 启动器。使⽤的算法是令牌桶算法。该ishRate属性是您希望每秒允许⽤户执⾏多少请求,⽽不会丢弃任何请求。这是令牌桶被填充的速率。该apacity属性是允许⽤户在⼀秒钟内执⾏的最⼤请求数。这是令牌桶可以容纳的令牌数量。将此值设置为零会阻⽌所有请求。该tedTokens属性是请求花费多少令牌。这是每个请求从存储桶中获取的令牌数,默认为ishRate通过在和中设置相同的值来实现稳定的速率burstCapacity。burstCapacity通过设置⾼于可以允许临时突发replenishRate。在这种情况下,需要允许速率限制器在突发之间有⼀段时间(根据replenishRate),因为两个连续的突发将导致请求被丢弃(HTTP 429 - Too Many Requests)。以下清单配置了⼀个redis-rate-limiter:下⾯的速率限制1 request/s是通过设置replenishRate所需的请求数、requestedTokens以秒为单位的时间跨度以及 和burstCapacity的乘积来实现的replenishRate,requestedTokens例如设置replenishRate=1,requestedTokens=60并将burstCapacity=60导致 的限制1 request/min。⽰例 ing: cloud: gateway: routes: - id: requestratelimiter_route uri: filters: - name: RequestRateLimiter args: ishRate: 10 apacity: 20 tedTokens: 1以下⽰例在 Java 中配置 KeyResolver:⽰例 33. @BeanKeyResolver userKeyResolver() { return exchange -> (uest().getQueryParams().getFirst("user"));}这定义了每个⽤户 10 的请求速率限制。允许 20 个突发,但是在下⼀秒,只有 10 个请求可⽤。这KeyResolver是⼀个获取user请求参数的简单⽅法(注意,不建议在⽣产环境中这样做)。您还可以将速率限制器定义为实现RateLimiter接⼝的 bean。在配置中,您可以使⽤ SpEL 按名称引⽤ bean。 #{@myRateLimiter}是⼀个 SpEL 表达式,它引⽤了⼀个名为 的 bean myRateLimiter。下⾯的清单定义了⼀个使⽤KeyResolver前⾯清单中定义的速率限制器:⽰例 ing: cloud: gateway: routes: - id: requestratelimiter_route uri: filters: - name: RequestRateLimiter args: rate-limiter: "#{@myRateLimiter}" key-resolver: "#{@userKeyResolver}"ctTo GatewayFilterFactoryRedirectTo GatewayFilterFactory有两个参数,status和url。status 参数应为300 系列重定向 HTTP 代码,例如 301。url参数应为有效 URL。这是Location标头的值。对于相对重定向,您应该使⽤uri: no://op路由定义的 uri。以下清单配置了⼀个RedirectToGatewayFilter:⽰例 ing: cloud: gateway: routes: - id: prefixpath_route uri: filters: - RedirectTo=302, yFilterRemoveRequestHeaderFactoryRemoveRequestHeader GatewayFilterFactory接受⼀个name参数。它是要删除的标头的名称。以下配置了⼀个RemoveRequestHeader GatewayFilter:⽰例 ing: cloud: gateway: routes: - id: removerequestheader_route uri: filters: - RemoveRequestHeader=X-Request-Foo这会在将X-Request-Foo标头发送到下游之前将其删除。ResponseHeader GatewayFilterFactoryRemoveResponseHeader GatewayFilterFactory接受⼀个name参数。它是要删除的标头的名称。以下配置了⼀个RemoveResponseHeader GatewayFilter:⽰例 ing: cloud: gateway: routes: - id: removeresponseheader_route uri: filters: - RemoveResponseHeader=X-Response-Foo这将X-Response-Foo在返回给⽹关客户端之前从响应中删除标头。要删除任何类型的敏感标头,您应该为您可能想要这样做的任何路由配置此过滤器。此外,您可以通过使⽤配置此过滤器⼀次t-filters并将其应⽤于所有路由。RequestParameter GatewayFilterFactoryRemoveRequestParameter GatewayFilter⼯⼚接受⼀个name参数。它是要删除的查询参数的名称。以下⽰例配置了⼀个RemoveRequestParameter GatewayFilter:⽰例 ing: cloud: gateway: routes: - id: removerequestparameter_route uri: filters: - RemoveRequestParameter=red这将在将red参数发送到下游之前将其删除。ePath GatewayFilterFactoryRewritePath GatewayFilterFactor接受⼀个regexp参数和⼀个replacement参数。这使⽤ Java 正则表达式以灵活的⽅式重写请求路径。以下清单配置了⼀个RewritePath GatewayFilter:⽰例 ing: cloud: gateway: routes: - id: rewritepath_route uri: predicates: - Path=/red/** filters: - RewritePath=/red/?(?.*), /${segment}对于 的请求路径/red/blue,这会将路径设置为/blue在发出下游请求之前。请注意,由于 YAML 规范,应将其替换为。eLocationResponseHeader GatewayFilterFactoryRewriteLocationResponseHeader GatewayFilter⼯⼚修改响应头的值,Location通常是为了摆脱后端特定的细节。它需要stripVersionMode、locationHeaderName、hostValue和protocolsRegex参数。以下配置了⼀个RewriteLocationResponseHeaderGatewayFilter:⽰例 ing: cloud: gateway: routes: - id: rewritelocationresponseheader_route uri: filters: - RewriteLocationResponseHeader=AS_IN_REQUEST, Location, ,例如,对于 的请求, 的响应头值被重写为。POST /some/object//v2/some/object//some/object/id该stripVersionMode参数具有以下可能的值:NEVER_STRIP、AS_IN_REQUEST(默认)和ALWAYS_STRIP。NEVER_STRIP:版本不会被剥离,即使原始请求路径不包含版本。AS_IN_REQUEST仅当原始请求路径不包含版本时,才会剥离版本。ALWAYS_STRIP版本总是被剥离,即使原始请求路径包含版本。该hostValue参数(如果提供)⽤于替换host:port响应Location标头的部分。如果未提供,Host则使⽤请求标头的值。该protocolsRegex参数必须是有效的正则表达式String,协议名称与之匹配。如果不匹配,过滤器什么也不做。默认值为http|https|ftp|eResponseHeader GatewayFilterFactoryRewriteResponseHeader GatewayFilterFactory采⽤name、regexp和replacement参数。它使⽤ Java 正则表达式以灵活的⽅式重写响应标头值。以下⽰例配置了⼀个RewriteResponseHeader GatewayFilter:⽰例 ing: cloud: gateway: routes: - id: rewriteresponseheader_route uri: filters: - RewriteResponseHeader=X-Response-Red, , password=[^&]+, password=***对于/42?user=ford&password=omg!what&flag=true的标头值,在发出下游请求后将其设置为/42?user=ford&password=***&flag=true 。由于 YAML 规范,您必须使⽤ 表⽰。ssion GatewayFilterFactorySaveSession GatewayFilter在将呼叫转发到重定向之前强制执⾏WebSession::save操作。当使⽤带有惰性数据存储的Spring Session之类的东西时,这特别有⽤,并且您需要确保在进⾏转发调⽤之前已保存会话状态。以下⽰例配置了⼀个:SaveSession GatewayFilter⽰例 ing: cloud: gateway: routes: - id: save_session uri: predicates: - Path=/foo/** filters: - SaveSession如果您将Spring Security与 Spring Session 集成并希望确保安全详细信息已转发到远程进程,这很关键。Headers GatewayFilterFactorySecureHeaders GatewayFilter factory 会在响应中添加⼀些标头.添加了以下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)要更改默认值,请在-headers命名空间中设置适当的属性。以下属性可⽤:xss-protection-headerstrict-transport-securityx-frame-optionsx-content-type-optionsreferrer-policycontent-security-policyx-download-optionsx-permitted-cross-domain-policies要禁⽤默认值,请e使⽤逗号分隔值设置属性。以下⽰例显⽰了如何执⾏此操作:e=x-frame-options,h GatewayFilterFactorySetPath GatewayFilterFactory采⽤路径参数template。它通过允许路径的模板化提供了⼀种操作请求路径的简单⽅法。 SpringFramework 的 URI 模板。允许多个匹配段。以下⽰例配置了⼀个SetPath GatewayFilter:⽰例 ing: cloud: gateway: routes: - id: setpath_route uri: predicates: - Path=/red/{segment} filters: - SetPath=/{segment}对于 的请求路径/red/blue,这会将路径设置为/blue在发出下游请求之前。uestHeader GatewayFilterFactorySetRequestHeader GatewayFilterFactory接受name和value参数。以下配置了⼀个SetRequestHeader GatewayFilter:⽰例 ing: cloud: gateway: routes: - id: setrequestheader_route uri: filters: - SetRequestHeader=X-Request-Red, Blue这GatewayFilter将替换(⽽不是添加)具有给定名称的所有标题。因此,如果下游服务器以 响应X-Request-Red:1234,这将被替换X-Request-Red:Blue为下游服务将接收的内容。SetRequestHeader知道⽤于匹配路径或主机的 URI 变量。URI 变量可以在值中使⽤并在运⾏时扩展。以下⽰例配置SetRequestHeaderGatewayFilter使⽤变量的 an:⽰例 ing: cloud: gateway: routes: - id: setrequestheader_route uri: predicates: - Host: {segment}. filters: - SetRequestHeader=foo, bar-{segment}ponseHeader GatewayFilterFactorySetResponseHeader GatewayFilterFactory接受name和value参数。以下配置了⼀个SetResponseHeader GatewayFilter:⽰例 ing: cloud: gateway: routes: - id: setresponseheader_route uri: filters: - SetResponseHeader=X-Response-Red, Blue此 GatewayFilter ⽤给定名称替换(⽽不是添加)所有Headers。因此,如果下游服务器以 响应 ,则将其X-Response-Red:1234替换为X-Response-Red:BlueSetResponseHeader可以在host或则path中使⽤URI 变量,并将在运⾏时扩展。以下⽰例配置SetResponseHeader GatewayFilter使⽤变量:⽰例 ing: cloud: gateway: routes: - id: setresponseheader_route uri: predicates: - Host: {segment}. filters: - SetResponseHeader=foo, bar-{segment}tus GatewayFilterFactorySetStatus GatewayFilterFactory 有⼀个参数status. 它必须是有效的 Spring HttpStatus。它可以是整数值404或枚举的字符串表⽰形式:NOT_FOUND。以下配置了⼀个SetStatus GatewayFilter:⽰例 ing: cloud: gateway: routes: - id: setstatusstring_route uri: filters: - SetStatus=BAD_REQUEST - id: setstatusint_route uri: filters: - SetStatus=401⽆论哪种情况,响应的 HTTP 状态都设置为 401。您可以将其配置为SetStatus GatewayFilter在响应的标头中从代理请求返回原始 HTTP 状态代码。如果配置了以下属性,则标头将添加到响应中:⽰例 ing: cloud: gateway: set-status: original-status-header-name: refix GatewayFilterFactoryStripPrefix GatewayFilter⼯⼚采⽤⼀个参数,parts. 该parts参数指⽰在将请求发送到下游之前要从请求中剥离的路径中的部分数。以下清单配置了⼀个StripPrefix GatewayFilter:⽰例 ing: cloud: gateway: routes: - id: nameRoot uri: nameservice predicates: - Path=/name/** filters: - StripPrefix=2当通过⽹关向发出请求时/name/blue/red,向 发出的请求nameservice看起来像nameservice/red。 GatewayFilterFactoryRetry GatewayFilter⼯⼚⽀持以下参数:retries:应该尝试的重试次数。statuses:应该重试的HTTP状态码,⽤ 表⽰atus。methods:应该重试的HTTP⽅法,⽤ 表⽰thod。series:要重试的⼀系列状态码,⽤ 表⽰。exceptions:应重试的抛出异常列表。backoff:为重试配置的指数退避。重试在 的退避间隔后执⾏firstBackoff * (factor ^ n),其中n是迭代。如果maxBackoff已配置,则应⽤的最⼤退避限制为maxBackoff. 如果basedOnPreviousValue为真,则使⽤ 计算退避prevBackoff * factor。Retry如果启⽤,则为过滤器配置以下默认值:retries: 三倍series: 5XX 系列methods: 获取⽅法exceptions:IOException和TimeoutExceptionbackoff: 禁⽤以下配置了 Retry GatewayFilter:⽰例 ing: cloud: gateway: routes: - id: retry_test uri: localhost:8080/flakey predicates: - Host=*. filters: - name: Retry args: retries: 3 statuses: BAD_GATEWAY methods: GET,POST backoff: firstBackoff: 10ms maxBackoff: 50ms factor: 2 basedOnPreviousValue: false使⽤带有forward:前缀 URL的重试过滤器时,应仔细编写⽬标端点,以便在发⽣错误时不会执⾏任何可能导致将响应发送到客户端并提交的操作。例如,如果⽬标端点是带注释的控制器,则⽬标控制器⽅法不应返回ResponseEntity错误状态代码。相反,它应该抛出Exception或发出错误信号(例如,通过(ex)返回值),重试过滤器可以配置为通过重试来处理。将重试过滤器与任何带有正⽂的 HTTP ⽅法⼀起使⽤时,正⽂将被缓存,并且⽹关将受到内存限制。正⽂缓存在由定义的请求属性_REQUEST_BODY_ATTR中。对象的类型是ffer。可以使⽤单个statusand来添加简化的“快捷⽅式”表⽰法method。下⾯两个例⼦是等价的:⽰例 ing: cloud: gateway: routes: - id: retry_route uri: 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: filters: - Retry=3,INTERNAL_SERVER_ERROR,GET,10ms,50ms,2,tSize GatewayFilterFactory当请求⼤⼩⼤于允许的限制时,RequestSize GatewayFilteFactory可以限制请求到达下游服务。过滤器接受⼀个maxSize参数。maxSize是⼀个DataSize类型,值可以定义为⼀个数字,后跟⼀个可选的DataUnit后缀,例如“KB”或“MB”。的默认值为字节“B”。它是以字节为单位定义的请求的允许⼤⼩限制。以下配置了⼀个RequestSize GatewayFilter:⽰例 ing: cloud: gateway: routes: - id: request_size_route uri: localhost:8080/upload predicates: - Path=/upload filters: - name: RequestSize args: maxSize: 5000000当请求因⼤⼩⽽被拒绝时,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如果未在路由定义中作为过滤器参数提供,则默认请求⼤⼩设置为 5 MB。uestHostHeader GatewayFilterFactory在某些情况下,可能需要覆盖主机标头。SetRequestHostHeader GatewayFilterFactory可以⽤指定的值替换现有的主机头。过滤器接受⼀个host参数。以下配置了⼀个SetRequestHostHeader GatewayFilter:⽰例 ing: cloud: gateway: routes: - id: set_request_host_header_route uri: localhost:8080/headers predicates: - Path=/headers filters: - name: SetRequestHostHeader args: host: 将主机头的SetRequestHostHeader GatewayFilter值替换为.6.28.修改请求体GatewayFilterFactory您可以使⽤ModifyRequestBody过滤器在⽹关将请求主体发送到下游之前对其进⾏修改。只能使⽤ Java DSL 配置此过滤器。以下显⽰了如何修改请求正⽂GatewayFilter:@Beanpublic RouteLocator routes(RouteLocatorBuilder builder) { return () .route("rewrite_request_obj", r -> ("*.") .filters(f -> Path("/httpbin") .modifyRequestBody(, , ATION_JSON_VALUE, (exchange, s) -> return (new Hello(rCase())))).uri(uri)) .build();}static class Hello { String message; public Hello() { } public Hello(String message) { e = message; } public String getMessage() { return message; } public void setMessage(String message) { e = message; }}如果请求没有正⽂,RewriteFilter则将通过null。()应返回以在请求中分配缺少的正⽂。6.29.修改响应体GatewayFilterFactory您可以使⽤ModifyResponseBody过滤器在将响应正⽂发送回客户端之前对其进⾏修改。只能使⽤ Java DSL 配置此过滤器。以下显⽰了如何修改响应正⽂GatewayFilter:@Beanpublic RouteLocator routes(RouteLocatorBuilder builder) { return () .route("rewrite_response_upper", r -> ("*.") .filters(f -> Path("/httpbin") .modifyResponseBody(, , (exchange, s) -> (rCase()))).uri(uri)) .build();}如果响应没有正⽂,RewriteFilter则将通过null。()应返回以在响应中分配缺少的正⽂。6.30.令牌中继GatewayFilterFactory令牌中继是 OAuth2 消费者充当客户端并将传⼊令牌转发给传出资源请求的地⽅。消费者可以是纯客户端(如 SSO 应⽤程序)或资源服务器。Spring Cloud Gateway 可以将 OAuth2 访问令牌向下游转发到它所代理的服务。要将此功能添加到⽹关,您需要添加TokenRelayGatewayFilterFactory如下内容:@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return () .route("resource", r -> ("/resource") .filters(f -> elay()) .uri("localhost:9000")) .build();}或这个ring: cloud: gateway: routes: - id: resource uri: localhost:9000 predicates: - Path=/resource filters: - TokenRelay=并且它将(除了登录⽤户并获取令牌之外)将⾝份验证令牌传递给下游的服务(在这种情况下 /resource)。要为 Spring Cloud Gateway 启⽤此功能,请添加以下依赖项:spring-boot-starter-oauth2-client它是如何⼯作的?{githubmaster}/src/main/java/org/springframework/cloud/gateway/security/[filter] 从当前经过⾝份验证的⽤户中提取访问令牌,并将其放⼊下游请求的请求标头中。有关完整的⼯作⽰例,请参阅此项⽬。仅当设置了将触发创建beanTokenRelayGatewayFilterFactory的适当属性时才会创建bean。.*ReactiveClientRegistrationRepositoryReactiveOAuth2AuthorizedClientServiceused by 的默认实现使⽤TokenRelayGatewayFilterFactory内存数据存储。ReactiveOAuth2AuthorizedClientService 如果您需要更强⼤的解决⽅案,您将需要提供⾃⼰的实现。equestBody GatewayFilterFactory有⼀定的情况需要读取body。由于请求体流只能读取⼀次,所以我们需要缓存请求体。您可以使⽤CacheRequestBody过滤器在请求正⽂发送到下游之前缓存请求正⽂并从 exchagne 属性获取正⽂。以下显⽰了如何缓存请求正⽂GatewayFilter:@Beanpublic RouteLocator routes(RouteLocatorBuilder builder) { return () .route("cache_request_body_route", r -> ("/downstream/**") .filters(f -> Path("/httpbin") .cacheRequestBody().uri(uri)) .build();}⽰例 ing: cloud: gateway: routes: - id: cache_request_body_route uri: lb://downstream predicates: - Path=/downstream/** filters: - name: CacheRequestBody args: bodyClass: CacheRequestBody将提取请求正⽂并将其转换为正⽂类(例如)。然后将其放置在ributes()中,定义的键为_REQUEST_BODY_ATTR。此过滤器仅适⽤于 http 请求(包括 https)6.32.默认过滤器要添加过滤器并将其应⽤于所有路由,您可以使⽤t-filters. 此属性采⽤过滤器列表。以下清单定义了⼀组默认过滤器:⽰例 ing: cloud: gateway: default-filters: - AddResponseHeader=X-Response-Default-Red, Default-Blue - PrefixPath=/httpbin

发布者:admin,转转请注明出处:http://www.yc00.com/news/1688419796a135675.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信