作者:大叔丶你好哇塞 | 来源:互联网 | 2023-10-11 16:35
Gateway全局过滤器文章目录Gateway全局过滤器概述组合使用GlobalFilter和GatewayFilterLoadBalancerClientReactiveLoad
Gateway全局过滤器
文章目录
- Gateway全局过滤器
- 概述
- 组合使用GlobalFilter和GatewayFilter
- LoadBalancerClient
- ReactiveLoadBalancerClientFilter
概述
全局过滤器GlobalFilte
接口与 GatewayFilter
具有相同的签名,这些特定的过滤器有条件的应用到所有的路由上。
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.0.RC1/reference/html/#global-filters
组合使用GlobalFilter和GatewayFilter
当请求进来的时候,过滤器Web处理器将会将所有的GlobalFilter
实例和所有特定的GatewayFilter
路由实例添加到过滤器filter链中,该组合的过滤器按org.springframework.core.Ordered
接口排序,通过实现getOrder()
方法来设置。
由于Spring Cloud Gateway 区分了过滤器逻辑执行器的"前"阶段和"后"阶段,因此优先级最高的过滤器在pre
阶段中处于第一个,而在post
阶段处于最后一个。
CustomGlobalFilter.java
public class CustomGlobalFilter implements GlobalFilter,Ordered {&#64;Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {return chain.filter(exchange);}&#64;Overridepublic int getOrder() {return 0;}
}
注意&#xff1a;数值越小&#xff0c;越靠前执行。
LoadBalancerClient
将LoadBalancerClientFilter
在交换属性查找一个URI ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR
。如果url有一个lb
方案&#xff08;即lb://myservice
&#xff09;&#xff0c;它将使用Spring Cloud LoadBalancerClient
将名称&#xff08;myservice
在前面的示例中&#xff09;解析为实际的主机和端口&#xff0c;并在同一属性中替换URI。未经修改的原始url将附加到ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR
属性中的列表。过滤器还将在ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR
属性中查找是否相等lb
&#xff0c;然后应用相同的规则
application.yaml
spring:cloud:gateway:routes:- id: myRouteuri: lb://servicepredicates:- Path&#61;/service/**
上面的介绍难以理解&#xff0c;其实通过代码可以看出&#xff0c;就是使用lb
来指定是否使用ribbon负载均衡。可以发现&#xff0c;这里Gateway也是使用ribbon来实现负载均衡的。
默认情况下&#xff0c;当一个服务示例不能被LoadBalancer
发现,将会返回503
, 我们可以配置spring.cloud.gateway.loadbalancer.use404 &#61; false
来使得Gateway返回404
.
我们建议使用ReactiveLoadBalancerClientFilter
。您可以通过设置spring.cloud.loadbalancer.ribbon.enabled
的值为false
来使用ReactiveLoadBalancerClientFilter
.
ReactiveLoadBalancerClientFilter
如上&#xff0c;见识使用这个&#xff0c;只需要将spring.cloud.loadbalancer.ribbon.enabled
设置为false就可以了。