当前位置: 首页 > 科技观察

SpringCloudGateway核心全局过滤器

时间:2023-03-16 17:35:14 科技观察

概述GlobalFilter接口与GatewayFilter具有相同的签名。这些是有条件地应用于所有路由的特殊过滤器。此接口及其用法可能会在未来的里程碑版本中发生变化。GlobalFilter拦截合约和Web请求的链式处理可用于实现横切和应用程序无关的需求,例如Security、Timeout等。publicinterfaceGlobalFilter{/***处理Web请求并(可选)委托通过给定的GatewayFilterChain到下一个webfilter。*@paramexchange当前服务器交换*@paramchain提供了一种委托给下一个过滤器的方法*@return{@codeMono}指示请求处理何时完成*/Monofilter(ServerWebExchangeexchange,GatewayFilterChain链);组合全局过滤器和网关过滤器当请求匹配路由时,过滤网络处理程序将GlobalFilter的所有实例和GatewayFilter的所有路由特定实例添加到过滤器链。组合过滤器链由org.springframework.core.Ordered接口排序,您可以通过实现getOrder()方法来设置。由于SpringCloudGateway区分过滤器逻辑执行的“前”和“后”阶段(请参阅工作原理),优先级最高的过滤器是“前”阶段中的第一个过滤器,也就是“后”阶段中的第一个过滤器的最后一个过滤器。下面的代码清单配置过滤器链:("自定义全局过滤器");返回chain.filter(exchange);}@OverridepublicintgetOrder(){返回-1;}}ForwardRoutingFilterForwardRoutingFilter在交换属性ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR中查找URI。如果URL是转发模式(例如forward:///xxxx),它将使用SpringDispatcherHandler来处理请求。请求URL中的路径部分被转发URL中的路径覆盖。未修改的原始URL附加到具有ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR属性的ServerWebExchangeUtils中的列表。负载平衡过滤器ReactiveLoadBalancerClientFilter在名为ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR的交换属性中查找URI。如果URL具有lb模式(例如lb://myservice),它会使用SpringCloudReactorLoadBalancer将名称(在本例中为myservice)解析为实际主机和端口,并替换相同属性中的URI。未修改的原始URL使用GATEWAY_ORIGINAL_REQUEST_URL_ATTR属性附加到ServerWebExchangeUtils中的列表。筛选器还会在ServerWebExchangeUtils中查找GATEWAY_SCHEME_PREFIX_ATTR属性以查看它是否等于lb。如果相等,则应用相同的规则。下面的代码清单配置了一个ReactiveLoadBalancerClientFilter:spring:cloud:gateway:routes:-id:myRouteuri:lb://servicepredicates:-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中,则使用http或https方案运行Netty路由过滤器GATEWAY_REQUEST_URL_ATTR交换属性。它使用NettyHttpClient进行下游代理请求。响应放置在ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR交换属性中,稍后在过滤器中使用。(还有一个实验性的WebClientHttpRoutingFilter执行相同的功能,但不需要Netty。)如果服务器在ServerWebExchangeUtils中有NettyHttpClientResponse,则Netty写响应过滤器运行NettyWriteResponseFilter.CLIENT_RESPONSE_ATTR交换属性。它在所有其他过滤器完成后运行,并将代理响应写回网关客户端响应。(还有一个实验性的WebClientWriteResponseFilter做同样的事情,但不需要Netty。)如果ServerWebExchangeUtils中有路由对象,则RouteToRequestUrl过滤器。GATEWAY_ROUTE_ATTR交换属性,运行RouteToRequestUrlFilter。它根据请求的URI创建一个新的URI,但使用路由对象的URI属性更新它。新的URI位于ServerWebExchangeUtils.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路由过滤器运行。它使用SpringWebSocket基础结构向下游转发WebSocket请求。您可以在URI前添加lb,例如lb:ws://serviceid,以对websocket进行负载均衡。spring:cloud:gateway:routes:#SockJSroute-id:websocket_sockjs_routeuri:http://localhost:3001predicates:-Path=/websocket/info/**#NormalWebsocketroute-id:websocket_routeuri:ws://localhost:3001predicates:-Path=/websocket/**以上Gateway中提供的几个核心全局过滤器,任何路由都会被过滤器执行。