一、概述

GlobalFilter接口具有与GatewayFilter相同的签名。这些是有条件地应用于所有路由的特殊过滤器。

二、组合式全局过滤器和网关过滤器排序

当请求与路由匹配时,过滤web处理程序会将GlobalFilter的所有实例和GatewayFilter的所有路由特定实例添加到过滤器链中。这个组合过滤器链由org.springframework.core.Ordered接口排序,您可以通过实现getOrder()方法来设置该接口,值越小,越先执行。

由于Spring Cloud Gateway区分了过滤器逻辑执行的“pre” 和 “post” 阶段(请参阅其工作原理),优先级最高的过滤器是“pre”阶段的第一个,“post”的最后一个。

以下列表配置过滤器链:

示例63. ExampleConfiguration.java

@Bean

public GlobalFilter customFilter() {

return new CustomGlobalFilter();

}

public class CustomGlobalFilter implements GlobalFilter, Ordered {

@Override

public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {

log.info("custom global filter");

return chain.filter(exchange);

}

@Override

public int getOrder() {

return -1;

} #值越小,越先执行

}

三、 Gateway Metrics Filter

要启用网关指标,请添加spring-bootstarter执行器作为项目依赖项。然后,默认情况下,只要spring.cloud.gateway.metrics.enabled属性未设置为false,网关度量过滤器就会运行。此筛选器添加了一个名为spring.cloud.gateway.requests的计时器度量,并带有以下标记:

routeId:路由 ID。

routeUri:API 路由到的 URI。

outcome:结果,按 HttpStatus.Series 分类。

status:返回给客户端的请求的 HTTP 状态。

httpStatusCode:返回到客户端的请求的 HTTP 状态。

httpMethod:用于请求的 HTTP 方法。

此外,通过spring.cloud.gateway.metrics.tags.path.enabled属性(默认为false),您可以使用路径标记激活额外的指标:

path:请求的路径。

这些指标可以从/actuator/metrics/spring.cloud.gateway.requests中获取,并可以与Prometheus轻松集成以创建Grafana仪表板。

四、本地响应缓存过滤器

如果LocalResponseCache的关联属性已启用(spring.cloud.gateway.filter.localresponse-cache.enabled),则LocalResponceCache将运行,并使用咖啡因为满足以下条件的所有响应激活本地缓存:

请求是一个脱胎换骨的GET。

响应具有以下状态代码之一:HTTP 200(正常)、HTTP 206(部分内容)或HTTP 301(永久移动)。

HTTP Cache-Control标头允许缓存(这意味着它没有以下任何值:请求中没有存储,响应中没有存储或私有)。

它接受两个配置参数:

spring.cloud.gateway.filter.local-response-cache.size:设置缓存的最大大小以清除此路由的条目(以KB、MB和GB为单位)。

spring.cloud.gateway.filter.local-response-cache.timeToLive:设置缓存项的过期时间(以秒表示,以分钟表示,以小时表示)。

如果未配置这些参数,但启用了全局筛选器,则默认情况下,它会为缓存的响应配置5分钟的生存时间。

此筛选器还实现了HTTP Cache-Control中max-age 值的自动计算。如果原始响应中存在max-age,则使用timeToLive配置参数中设置的秒数重写该值。在随后的调用中,该值将根据响应到期前剩余的秒数重新计算。

五、转发路由过滤器

ForwardRoutingFilter在交换属性ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR中查找URI。如果URL具有转发方案(例如forward:///localendpoint),它使用SpringDispatcherHandler来处理请求。请求URL的路径部分被转发URL中的路径覆盖。未修改的原始URL将附加到ServerWebExchangeUtils.GATEWAY_original_REQUEST_URL_ATTR属性的列表中。

六、 网络路由过滤器

如果位于ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR交换属性中的URL具有http或https方案,则运行Netty路由筛选器。它使用Netty HttpClient发出下游代理请求。响应被放入ServerWebExchangeUtils.CLIENT_response_ATTR交换属性中,以便在稍后的筛选器中使用。(还有一个实验性的WebClientHttpRoutingFilter,它执行相同的功能,但不需要Netty。)

七、网络写入响应过滤器

如果ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR交换属性中存在Netty HttpClientResponse,则运行NettyWriteResponseFilter。它在所有其他筛选器完成后运行,并将代理响应写回网关客户端响应。(还有一个实验性WebClientWriteResponseFilter,它执行相同的功能,但不需要Netty。)

八、反应式负载均衡器客户端过滤器

ReactiveLoadBalancerClientFilter在名为ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR的交换属性中查找URI。如果URL具有lb方案(例如lb://myservice),则使用Spring Cloud ReactorLoadBalancer将名称(在本例中为myservice)解析为实际主机和端口,并替换同一属性中的URI。未修改的原始URL将附加到ServerWebExchangeUtils.GATEWAY_original_REQUEST_URL_ATTR属性的列表中。过滤器还查看ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR属性,以查看其是否等于lb。如果是,则应用相同的规则。以下列表配置ReactiveLoadBalancerClientFilter:

spring:

cloud:

gateway:

routes:

- id: myRoute

uri: lb://service

predicates:

- Path=/service/**

九、路由到请求网址过滤器

如果ServerWebExchangeUtils.GATEWAY_Route_ATTR交换属性中有Route对象,则RouteToRequestUrlFilter将运行。它基于请求URI创建一个新的URI,但使用Route对象的URI属性进行更新。新URI放置在ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR交换属性中。

如果URI具有方案前缀,例如lb:ws://serviceid,则会从URI中剥离lb方案,并将其放置在ServerWebExchangeUtils.GATEWAY_scheme_prefix_ATTR中,以便稍后在筛选器链中使用。

十、Websocket 路由过滤器

如果位于ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR交换属性中的URL具有ws或wss方案,则会运行websocket路由筛选器。它使用Spring WebSocket基础设施将WebSocket请求转发到下游。

您可以通过在URI前面加上lb(例如lb:ws://serviceid)来负载平衡websockets。

以下清单配置 websocket 路由筛选器:

spring:

cloud:

gateway:

routes:

# SockJS route

- id: websocket_sockjs_route

uri: http://localhost:3001

predicates:

- Path=/websocket/info/**

# Normal Websocket route

- id: websocket_route

uri: ws://localhost:3001

predicates:

- Path=/websocket/**

官网:spring-cloud-gateway

欢迎来到Doker,欢迎点赞和评论!或者加微信进入技术群聊!

推荐阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: