Spring Cloud Gateway核心全局过滤器

开发 前端
如果URL位于ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR交换属性有ws或wss方案,websocket路由过滤器运行。它使用Spring WebSocket基础设施向下游转发WebSocket请求。

概述

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

在未来的里程碑版本中,此接口及其使用可能会发生更改。

GlobalFilter拦截式的契约,Web请求的链式处理,可用于实现横切、应用程序无关的需求,如Security、Timeout等。​

public interface GlobalFilter {
/** * 处理Web请求并(可选地)通过给定的GatewayFilterChain委托给下一个webfilter。 * @param exchange the current server exchange * @param chain provides a way to delegate to the next filter * @return {@code Mono<Void>} to indicate when request processing is complete */Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}

组合全局过滤器和网关过滤器

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

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

下面的代码清单配置了过滤器链:​

@Beanpublic GlobalFilter customFilter(){  return new CustomGlobalFilter();}
public class CustomGlobalFilter implements GlobalFilter, Ordered {
@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain){ log.info("custom global filter"); return chain.filter(exchange); }
@Overridepublic int getOrder(){ return -1; }}

Forward Routing Filter

ForwardRoutingFilter在交换属性ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR中查找URI。如果URL是前向模式(例如forward:///xxxx),它会使用Spring DispatcherHandler来处理请求。请求URL中的路径部分被前向URL中的路径覆盖。未修改的原始URL被附加到ServerWebExchangeUtils中的列表中ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR属性。

负载均衡过滤器

ReactiveLoadBalancerClientFilter在名为ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR的exchange属性中查找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/**

默认情况下,当ReactorLoadBalancer找不到服务实例时,会返回503。通过设置spring.cloud.gateway.loadbalancer.use404=true,可以配置网关返回404。

从ReactiveLoadBalancerClientFilter返回的ServiceInstance的isSecure值覆盖了向网关发出的请求中指定的方案。例如,如果请求通过HTTPS进入网关,但ServiceInstance表明它不安全,则下游请求将通过HTTP发出。相反的情况也可以适用。但是,如果在网关配置中为路由指定了GATEWAY_SCHEME_PREFIX_ATTR,前缀将被删除,并且从路由URL得到的方案将覆盖ServiceInstance配置。

Netty路由过滤器

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

Netty写响应过滤器

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

RouteToRequestUrl过滤器

如果ServerWebExchangeUtils中有路由对象。GATEWAY_ROUTE_ATTR交换属性,运行RouteToRequestUrlFilter。它根据请求的URI创建一个新的URI,但使用路由对象的URI属性进行更新。新的URI放置在ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR交换属性'。

如果URI中有一个模式前缀,例如lb:ws://serviceid,则从URI中剥离lb模式,放在ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR,稍后在过滤器链中使用。

WebSocket过滤器

如果URL位于ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR交换属性有ws或wss方案,websocket路由过滤器运行。它使用Spring WebSocket基础设施向下游转发WebSocket请求。

你可以在URI前加上lb,例如lb:ws://serviceid,对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/**

以上在Gateway中提供的几个核心全局过滤器,任何路由都会被过滤器执行。

责任编辑:武晓燕 来源: 实战案例锦集
相关推荐

2023-04-14 09:01:25

2023-07-24 08:00:56

客户端访问指定

2021-01-14 08:13:39

Spring Clou应用内置过滤器

2017-05-04 22:30:17

Zuul过滤器微服务

2024-04-03 08:08:15

谓词网关开发

2017-04-12 14:43:01

Spring ClouZuul过滤器

2023-02-15 08:12:19

http超时过滤器

2017-09-15 23:29:53

Spring Clou微服务架构过滤器

2021-07-05 15:22:03

Servlet过滤器客户端

2024-01-05 09:04:35

隆过滤器数据结构哈希函数

2022-02-16 23:58:41

Spring过滤器验证码

2009-07-08 15:30:56

Servlet过滤器

2009-09-29 13:55:23

Hibernate设置

2009-07-08 16:07:04

Servlet过滤器配

2011-06-29 16:14:59

Qt 事件 过滤器

2009-07-14 09:09:08

Swing模型过滤器

2022-02-21 23:58:49

Spring过滤器顺序值

2009-07-08 17:33:37

Servlet过滤器

2009-09-25 15:19:44

Hibernate过滤

2017-07-18 14:10:31

大数据Apache Flum过滤器
点赞
收藏

51CTO技术栈公众号