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} to indicate when request processing is complete */Mono 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 Monofilter(ServerWebExchange exchange, GatewayFilterChain chain){ log.info("custom global filter"); return chain.filter(exchange); }
@Overridepublic int getOrder(){ return -1; }}
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配置。
如果URL位于ServerWebExchangeUtils中,则运行Netty路由过滤器GATEWAY_REQUEST_URL_ATTR交换属性具有http或https方案。它使用Netty HttpClient来发出下游代理请求。响应被放在ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR交换属性,稍后在过滤器中使用。(还有一个实验性的WebClientHttpRoutingFilter,它执行相同的功能,但不需要Netty。)
如果服务器ServerWebExchangeUtils中有Netty HttpClientResponse,则运行NettyWriteResponseFilter.CLIENT_RESPONSE_ATTR交换属性。它在所有其他过滤器完成之后运行,并将代理响应写回网关客户端响应。(还有一个实验性的WebClientWriteResponseFilter,它可以执行相同的功能,但不需要Netty。)
如果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,稍后在过滤器链中使用。
如果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中提供的几个核心全局过滤器,任何路由都会被过滤器执行。
文章题目:SpringCloudGateway核心全局过滤器
文章路径:http://www.shufengxianlan.com/qtweb/news31/392731.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联