概述
GlobalFilter接口与GatewayFilter具有相同的签名。这些是特殊的过滤器,有条件地应用于所有路由。
在未来的里程碑版本中,此接口及其使用可能会发生更改。
GlobalFilter拦截式的契约,Web请求的链式处理,可用于实现横切、应用程序无关的需求,如Security、Timeout等。
组合全局过滤器和网关过滤器
当请求匹配路由时,过滤web处理程序将GlobalFilter的所有实例和GatewayFilter的所有特定路由实例添加到过滤器链中。这个组合过滤器链是由org.springframework.core.Ordered接口排序的,你可以通过实现getOrder()方法来设置它。
由于Spring Cloud Gateway区分了过滤器逻辑执行的“前”和“后”阶段(参见它的工作原理),优先级最高的过滤器是“前”阶段的第一个过滤器,是“后”阶段的最后一个过滤器。
下面的代码清单配置了过滤器链:
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:
默认情况下,当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进行负载均衡。
以上在Gateway中提供的几个核心全局过滤器,任何路由都会被过滤器执行。