设计与绘制一个网站首页,网站开发 8g和16g,百度域名注册官网,网站优化主要怎么做SpringCloudGateway-核心之Filter-自定义全局Filter-自定义局部Filter介绍
核心之Filter 路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。 路由过滤器的范围仅限于特定路由。 Spring Cloud Gateway 包含许多内置的 GatewayFilter Factory。 AddRequestHead…SpringCloudGateway-核心之Filter-自定义全局Filter-自定义局部Filter介绍
核心之Filter 路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。 路由过滤器的范围仅限于特定路由。 Spring Cloud Gateway 包含许多内置的 GatewayFilter Factory。 AddRequestHeader网关过滤器工厂 AddRequestHeader GatewayFilter Factory 采用名称和值参数。 例子这会将X-Request-Foo:Bar标头添加到所有匹配请求的下游请求标头中。
spring:cloud:gateway:routes:- id: add_request_header_routeuri: https://example.orgfilters:- AddRequestHeaderX-Request-Foo, Bar
AddRequestHeader 知道用于匹配路径或主机的 URI 变量。URI 变量可以在值中使用并将在运行时扩展。
spring:cloud:gateway:routes:- id: add_request_header_routeuri: https://example.orgpredicates:- Path/foo/{segment}filters:- AddRequestHeaderX-Request-Foo, Bar-{segment}添加请求参数网关过滤器工厂 AddRequestHeader GatewayFilter Factory 采用名称和值参数。 例子这将添加foobar到所有匹配请求的下游请求的查询字符串中。
spring:cloud:gateway:routes:- id: add_request_parameter_routeuri: https://example.orgfilters:- AddRequestParameterfoo, barAddRequestParameter 知道用于匹配路径或主机的 URI 变量。URI 变量可以在值中使用并将在运行时扩展。
spring:cloud:gateway:routes:- id: add_request_parameter_routeuri: https://example.orgpredicates:- Host: {segment}.myhost.orgfilters:- AddRequestParameterfoo, bar-{segment}
添加响应头网关过滤器工厂 AddResponseHeader GatewayFilter Factory 采用名称和值参数。 例子这会将X-Response-Foo:Bar标头添加到所有匹配请求的下游响应标头中。
spring:cloud:gateway:routes:- id: add_response_header_routeuri: https://example.orgfilters:- AddResponseHeaderX-Response-Foo, BarAddResponseHeader 知道用于匹配路径或主机的 URI 变量。URI 变量可以在值中使用并将在运行时扩展。
spring:cloud:gateway:routes:- id: add_response_header_routeuri: https://example.orgpredicates:- Host: {segment}.myhost.orgfilters:- AddResponseHeaderfoo, bar-{segment}
DedupeResponseHeader 网关过滤器工厂 DedupeResponseHeader GatewayFilter Factory 采用一个name参数和一个可选strategy参数。name可以包含标头名称列表以空格分隔。 例子当网关 CORS 逻辑和下游都添加重复值Access-Control-Allow-Credentials和响应标头时这将删除它们。Access-Control-Allow-Origin
DedupeResponseHeader 过滤器还接受可选strategy参数。接受的值为RETAIN_FIRST默认、RETAIN_LAST和RETAIN_UNIQUE。
spring:cloud:gateway:routes:- id: dedupe_response_header_routeuri: https://example.orgfilters:- DedupeResponseHeaderAccess-Control-Allow-Credentials Access-Control-Allow-Origin
Hystrix 网关过滤器工厂 Hystrix是 Netflix 的一个库它实现了断路器模式。Hystrix GatewayFilter 允许您在网关路由中引入断路器保护您的服务免受级联故障的影响并允许您在出现下游故障时提供回退响应。 要在项目中启用 Hystrix GatewayFilters请添加spring-cloud-starter-netflix-hystrix来自Spring Cloud Netflix 的依赖项。 Hystrix GatewayFilter Factory 需要一个name参数即HystrixCommand.spring:cloud:gateway:routes:- id: hystrix_routeuri: https://example.orgfilters:- HystrixmyCommandName
这将剩余的过滤器包装在HystrixCommandwith command name中myCommandName。Hystrix 过滤器还可以接受可选fallbackUri参数。目前仅forward:支持方案 URI。如果调用后备请求将转发到与 URI 匹配的控制器。spring:cloud:gateway:routes:- id: hystrix_routeuri: lb://backing-service:8088predicates:- Path/consumingserviceendpointfilters:- name: Hystrixargs:name: fallbackcmdfallbackUri: forward:/incaseoffailureusethis- RewritePath/consumingserviceendpoint, /backingserviceendpoint
/incaseoffailureusethis当 Hystrix 回退被调用时这将转发到URI。lb请注意此示例还通过目标 URI 上的前缀演示可选Spring Cloud Netflix Ribbon 负载平衡。主要场景是使用fallbackUri网关应用程序内的内部控制器或处理程序。但是也可以将请求重新路由到外部应用程序中的控制器或处理程序如下所示spring:cloud:gateway:routes:- id: ingredientsuri: lb://ingredientspredicates:- Path//ingredients/**filters:- name: Hystrixargs:name: fetchIngredientsfallbackUri: forward:/fallback- id: ingredients-fallbackuri: http://localhost:9994predicates:- Path/fallback
在此示例中网关应用程序中没有fallback端点或处理程序但是另一个应用程序中有一个端点或处理程序在http://localhost:9994.如果请求被转发到回退Hystrix Gateway 过滤器还会提供Throwable导致该请求的原因。它被添加到ServerWebExchange作为 ServerWebExchangeUtils.HYSTRIX_EXECUTION_EXCEPTION_ATTR在网关应用程序中处理回退时可以使用的属性。对于外部控制器/处理程序场景可以添加包含异常详细信息的标头。您可以在FallbackHeaders GatewayFilter Factory 部分找到更多信息。Hystrix 设置例如超时可以使用全局默认值进行配置也可以使用应用程序属性按路由进行配置如Hystrix wiki中所述。要为上面的示例路由设置 5 秒超时将使用以下配置应用程序.yml。 hystrix.command.fallbackcmd.execution.isolation.thread.timeoutInMilliseconds : 5000FallbackHeaders GatewayFilter 工厂 AddRequestHeader GatewayFilter Factory 采用名称和值参数。 例子工厂FallbackHeaders允许您在转发到外部应用程序的请求的标头中添加 Hystrix 执行异常详细信息fallbackUri
spring:cloud:gateway:routes:- id: ingredientsuri: lb://ingredientspredicates:- Path//ingredients/**filters:- name: Hystrixargs:name: fetchIngredientsfallbackUri: forward:/fallback- id: ingredients-fallbackuri: http://localhost:9994predicates:- Path/fallbackfilters:- name: FallbackHeadersargs:executionExceptionTypeHeaderName: Test-Header
在此示例中在运行 时发生执行异常后HystrixCommand请求将被转发到fallback在 上运行的应用程序中的端点或处理程序localhost:9994。带有异常类型、消息以及如果可用根本原因异常类型和消息的标头将由过滤器添加到该请求中FallbackHeaders。
通过设置下面列出的参数值及其默认值可以在配置中覆盖标头的名称
executionExceptionTypeHeaderName( Execution-Exception-Type)
executionExceptionMessageHeaderName( Execution-Exception-Message)
rootCauseExceptionTypeHeaderName( Root-Cause-Exception-Type)
rootCauseExceptionMessageHeaderName( Root-Cause-Exception-Message)MapRequestHeader网关过滤器工厂 MapRequestHeader GatewayFilter Factory 采用“fromHeader”和“toHeader”参数。它创建一个新的命名标头 (toHeader)并从传入的 http 请求中的现有命名标头 (fromHeader) 中提取该值。如果输入标头不存在则过滤器没有影响。如果新的命名标头已经存在那么它的值将使用新值进行扩充。 例子这会将X-Request-Foo:values标头添加到下游请求其中包含来自传入 http 请求Bar标头的更新值。
spring:cloud:gateway:routes:- id: map_request_header_routeuri: https://example.orgfilters:- MapRequestHeaderBar, X-Request-Foo
PrefixPath 网关过滤器工厂 PrefixPath GatewayFilter Factory 采用单个prefix参数。 例子这将/mypath作为所有匹配请求的路径的前缀。因此请求/hello, 将被发送至/mypath/hello。
spring:cloud:gateway:routes:- id: prefixpath_routeuri: https://example.orgfilters:- PrefixPath/mypath
PreserveHostHeader 网关过滤器工厂 PreserveHostHeader GatewayFilter Factory 没有参数。该过滤器设置一个请求属性路由过滤器将检查该属性以确定是否应发送原始主机标头而不是由 http 客户端确定的主机标头。 例子这会将X-Request-Foo:Bar标头添加到所有匹配请求的下游请求标头中。
AddRequestHeader 知道用于匹配路径或主机的 URI 变量。URI 变量可以在值中使用并将在运行时扩展。
spring:cloud:gateway:routes:- id: preserve_host_routeuri: https://example.orgfilters:- PreserveHostHeader
RequestRateLimiter网关过滤器工厂 RequestRateLimiter GatewayFilter Factory 使用RateLimiter实现来确定是否允许当前请求继续。如果不是HTTP 429 - Too Many Requests则返回状态默认情况下。 该过滤器采用可选keyResolver参数和特定于速率限制器的参数见下文。 keyResolver是一个实现该接口的bean KeyResolver。在配置中使用 SpEL 按名称引用 bean。#{myKeyResolver}是引用名为 的 bean 的 SpEL 表达式myKeyResolver。 例子这会将X-Request-Foo:Bar标头添加到所有匹配请求的下游请求标头中。
AddRequestHeader 知道用于匹配路径或主机的 URI 变量。URI 变量可以在值中使用并将在运行时扩展。
spring:cloud:gateway:routes:- id: requestratelimiter_routeuri: https://example.orgfilters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 10redis-rate-limiter.burstCapacity: 20
重定向到网关过滤器工厂 RedirectTo GatewayFilter Factory 采用status和url参数。状态应该是 300 系列重定向 http 代码例如 301。 url 应该是有效的 url。这将是标头的值Location。 例子这会将X-Request-Foo:Bar标头添加到所有匹配请求的下游请求标头中。
AddRequestHeader 知道用于匹配路径或主机的 URI 变量。URI 变量可以在值中使用并将在运行时扩展。
spring:cloud:gateway:routes:- id: prefixpath_routeuri: https://example.orgfilters:- RedirectTo302, https://acme.org
RemoveHopByHopHeadersFilter网关过滤器工厂 RemoveHopByHopHeadersFilter GatewayFilter Factory 从转发的请求中删除标头。删除的默认标头列表来自IETF。 默认删除的标头是 联系 活着 代理认证 代理授权 TE 预告片 传输编码 升级 要更改此设置请将该spring.cloud.gateway.filter.remove-non-proxy-headers.headers属性设置为要删除的标头名称列表。 例子这会将X-Request-Foo:Bar标头添加到所有匹配请求的下游请求标头中。
AddRequestHeader 知道用于匹配路径或主机的 URI 变量。URI 变量可以在值中使用并将在运行时扩展。
spring:cloud:gateway:routes:- id: removerequestheader_routeuri: https://example.orgfilters:- RemoveRequestHeaderX-Request-Foo
删除请求头网关过滤器工厂 RemoveRequestHeader GatewayFilter Factory 采用一个name参数。它是要删除的标头的名称。 例子X-Request-Foo这将在向下游发送之前删除标头。
spring:cloud:gateway:routes:- id: removeresponseheader_routeuri: https://example.orgfilters:- RemoveResponseHeaderX-Response-Foo
删除响应头网关过滤器工厂 RemoveResponseHeader GatewayFilter Factory 采用一个name参数。它是要删除的标头的名称。 例子X-Response-Foo这将在响应返回到网关客户端之前从响应中删除标头。要删除任何类型的敏感标头您应该为您可能想要执行此操作的任何路由配置此过滤器。此外您可以在使用后配置此过滤器spring.cloud.gateway.default-filters 并将其应用于所有路由。
spring:cloud:gateway:routes:- id: removeresponseheader_routeuri: https://example.orgfilters:- RemoveResponseHeaderX-Response-Foo
RewritePath 网关过滤器工厂 RewritePath GatewayFilter Factory 采用路径regexp参数和replacement参数。这使用 Java 正则表达式来灵活地重写请求路径。 例子这会将X-Request-Foo:Bar标头添加到所有匹配请求的下游请求标头中。
AddRequestHeader 知道用于匹配路径或主机的 URI 变量。URI 变量可以在值中使用并将在运行时扩展。
spring:cloud:gateway:routes:- id: rewriteresponseheader_routeuri: https://example.orgfilters:- RewriteResponseHeaderX-Response-Foo, , password[^], password***
RewriteLocationResponseHeader 网关过滤器工厂 RewriteLocationResponseHeader GatewayFilter Factory 修改响应标头的值Location通常是为了删除后端特定的详细信息。它需要stripVersionMode、locationHeaderName、hostValue和protocolsRegex参数。 例子例如对于请求响应标头值将被重写为。POST https://api.example.com/some/object/nameLocationhttps://object-service.prod.example.net/v2/some/object/idhttps://api.example.com/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|ftps.
spring:cloud:gateway:routes:- id: rewriteresponseheader_routeuri: https://example.orgfilters:- RewriteResponseHeaderX-Response-Foo, , password[^], password***
RewriteResponseHeader 网关过滤器工厂 RewriteResponseHeader GatewayFilter Factory 采用name、regexp和replacement参数。它使用 Java 正则表达式以灵活的方式重写响应标头值。 例子对于标头值它将在发出下游请求后/42?userfordpasswordomg!whatflagtrue设置为。/42?userfordpassword***flagtrue请使用$\表示$因为 YAML 规范。
spring:cloud:gateway:routes:- id: rewriteresponseheader_routeuri: https://example.orgfilters:- RewriteResponseHeaderX-Response-Foo, , password[^], password***
保存会话网关过滤器工厂 SaveSession GatewayFilter Factory在将调用转发到下游之前WebSession::save强制执行操作。当使用带有惰性数据存储的Spring Session之类的东西时这特别有用并且需要确保在进行转发调用之前已保存会话状态。 例子如果您正在将Spring Security与 Spring Session 集成并且希望确保安全详细信息已转发到远程进程那么这一点至关重要。
spring:cloud:gateway:routes:- id: save_sessionuri: https://example.orgpredicates:- Path/foo/**filters:- SaveSession
自定义全局Filter 该GlobalFilter接口具有与 相同的签名GatewayFilter。这些是有条件地应用于所有路由的特殊过滤器。 组合的全局过滤器和网关过滤器排序 当请求传入并与路由匹配时过滤 Web 处理程序会将所有实例GlobalFilter以及所有特定于路由的实例添加GatewayFilter到过滤器链中。这个组合的过滤器链是通过org.springframework.core.Ordered接口排序的可以通过实现getOrder()方法来设置。 由于 Spring Cloud Gateway 区分过滤器逻辑执行的“前”和“后”阶段请参阅它是如何工作的具有最高优先级的过滤器将是“前”阶段中的第一个和“后”阶段中的最后一个。 “-阶段。 Bean
public GlobalFilter customFilter() {return CustomGlobalFilter();
}public class CustomGlobalFilter implements GlobalFilter, Ordered {Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info(custom global filter);return chain.filter(exchange);}Overridepublic int getOrder() {return -1;}
}前向路由过滤器 在交换属性中查找ForwardRoutingFilterURI ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR。如果url有forwardscheme即forward:///localendpoint它将使用SpringDispatcherHandler来处理请求。请求 URL 的路径部分将被转发 URL 中的路径覆盖。未修改的原始 url 将附加到属性中的列表中ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR。 LoadBalancer客户端过滤器 在交换属性中查找LoadBalancerClientFilterURI ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR。如果 url 有一个lb方案即lb://myservice它将使用 Spring CloudLoadBalancerClient将名称myservice在前面的示例中解析为实际的主机和端口并替换相同属性中的 URI。未修改的原始 url 将附加到属性中的列表中ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR。过滤器还将查看ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR属性以查看它是否相等lb然后应用相同的规则。 spring:cloud:gateway:routes:- id: myRouteuri: lb://servicepredicates:- Path/service/**反应式负载均衡器客户端过滤器 在交换属性中查找ReactiveLoadBalancerClientFilterURI ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR。如果 url 有一个lb方案即lb://myservice它将使用 Spring CloudReactorLoadBalancer将名称myservice在前面的示例中解析为实际的主机和端口并替换相同属性中的 URI。未修改的原始 url 将附加到属性中的列表中ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR。过滤器还将查看ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR属性以查看它是否相等 lb然后应用相同的规则。 spring:cloud:gateway:routes:- id: myRouteuri: lb://servicepredicates:- Path/service/**Netty路由过滤器 如果交换属性中的 urlServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR具有httporhttps方案则 Netty 路由过滤器将运行。它使用 NettyHttpClient发出下游代理请求。响应被放入ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR交换属性中以供稍后的过滤器使用。有一个实验WebClientHttpRoutingFilter可以实现同样的功能但是不需要netty Netty写响应过滤器 如果交换属性中NettyWriteResponseFilter有 Netty则运行。它在所有其他过滤器完成后运行并将代理响应写回网关客户端响应。有一个实验可以实现同样的功能但是不需要nettyHttpClientResponseServerWebExchangeUtils.CLIENT_RESPONSE_ATTRWebClientWriteResponseFilter RouteToRequestUrl过滤器 如果交换属性中RouteToRequestUrlFilter有对象则运行。它基于请求 URI 创建一个新的 URI但使用对象的 URI 属性进行更新。新的 URI 被放置在交换属性中。RouteServerWebExchangeUtils.GATEWAY_ROUTE_ATTRRouteServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR 如果 URI 具有方案前缀例如lb:ws://serviceid则该lb方案将从 URI 中剥离并放置在 中ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR以便稍后在过滤器链中使用。 Websocket路由过滤器 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR如果交换属性中的 url具有ws或wss方案则 Websocket 路由过滤器将运行。它使用 Spring Web Socket 基础设施向下游转发 Websocket 请求。 spring:cloud:gateway:routes:# SockJS route- id: websocket_sockjs_routeuri: http://localhost:3001predicates:- Path/websocket/info/**# Normwal Websocket route- id: websocket_routeuri: ws://localhost:3001predicates:- Path/websocket/**网关指标过滤器 要启用 Gateway Metrics请添加 spring-boot-starter-actuator 作为项目依赖项。然后默认情况下只要该属性spring.cloud.gateway.metrics.enabled未设置为 网关指标筛选器就会运行false。此过滤器添加一个名为“gateway.requests”的计时器指标并带有以下标签 routeId: 路线编号 routeUriAPI 将路由到的 URI outcome按HttpStatus.Series分类的结果 status请求返回给客户端的Http Status httpStatusCode请求返回给客户端的Http Status httpMethod: 请求使用的Http方法 然后可以从中获取这些指标/actuator/metrics/gateway.requests并可以轻松地与 Prometheus 集成以创建Grafana 仪表板。 将交换标记为已路由 网关路由后ServerWebExchange它将通过添加gatewayAlreadyRouted 交换属性来将该交换标记为“已路由”。一旦请求被标记为已路由其他路由过滤器将不会再次路由该请求实质上会跳过该过滤器。您可以使用一些方便的方法将交换标记为已路由或检查交换是否已被路由。 ServerWebExchangeUtils.isAlreadyRouted获取一个ServerWebExchange对象并检查它是否已被“路由” ServerWebExchangeUtils.setAlreadyRouted获取一个ServerWebExchange对象并将其标记为“已路由” 自定义局部Filter Spring Cloud Gateway 提供了一种强大的机制允许开发者自定义过滤器以满足特定的路由和请求处理需求。局部过滤器GatewayFilter是作用在特定路由上的过滤器可以通过配置文件或代码方式实现绑定。 具体实现 实现GatewayFilter接口 要创建一个局部过滤器首先需要实现org.springframework.cloud.gateway.filter.GatewayFilter接口并重写其filter方法。 import org.reactivestreams.Publisher;import org.springframework.cloud.gateway.filter.GatewayFilter;import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.core.Ordered;import org.springframework.web.server.ServerWebExchange;public class CustomGatewayFilter implements GatewayFilter, Ordered {private int order; // 用于指定过滤器执行顺序// 构造函数中可以设置order值public CustomGatewayFilter(int order) {this.order order;}Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 在这里添加你的前置逻辑比如修改请求头、参数等// ...return chain.filter(exchange).then(Mono.fromRunnable(() - {// 在这里添加你的后置逻辑如响应后处理}));}Overridepublic int getOrder() {return this.order;}}注册并应用到路由上 在Spring Boot应用中通过配置或者编程方式将自定义的局部过滤器应用到指定的路由上。 配置方式 在application.yml或application.properties中进行配置 spring:cloud:gateway:routes:- id: my_routeuri: http://localhost:8081predicates:- Path/my-service/**filters:- name: CustomGatewayFilter # 过滤器名称可以根据Bean名称自动注入args:order: 1 # 如果过滤器实现了Ordered接口可传递order值通过实现RouteLocator接口或者使用RouteLocatorBuilder来自定义路由时加入过滤器 import org.springframework.cloud.gateway.route.RouteLocator;import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;Configurationpublic class GatewayConfig {Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route(custom_route, r - r.path(/my-service/**).filters(f - f.filter(new CustomGatewayFilter(1))).uri(http://localhost:8081)).build();}}这样当请求匹配到/my-service/**这个路径模式的路由时将会触发我们自定义的CustomGatewayFilter进行处理。