上一节学习了GatewayFilter。
回忆一下一个关键点:
GateWayFilterFactory的本质就是:针对配置进行解析,为指定的路由,添加Filter,以便对请求报文进行处理。
GlobalFilter又是啥?先看一下接口定义
public interface GlobalFilter {
Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}
再看一下GatewayFilter
public interface GatewayFilter extends ShortcutConfigurable {
Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}
可以看到GatewayFilter和GlobalFilter方法签名是一模一样的,那为啥又要整一个GlobalFilter出来?
GatewayFilter的作用主要是,基于配置文件或者代码,就是routes那个配置,解析出配置,然后进行报文处理。这个Filter是跟某个route强行绑定的。
GlobalFilter,是直接强制加载的,不属于某个指定的route。而这个filter需不需要处理,是通过在filter方法中来进行判断的。如果不需要自己处理,就直接丢给链条中下个filter。
请求的处理逻辑,可以看以下代码
FilteringWebHandler.java
@Override
public Mono<Void> handle(ServerWebExchange exchange) {
Route route = exchange.getRequiredAttribute(GATEWAY_ROUTE_ATTR);
List<GatewayFilter> gatewayFilters = route.getFilters();
List<GatewayFilter> combined = new ArrayList<>(this.globalFilters);
combined.addAll(gatewayFilters);
// TODO: needed or cached?
AnnotationAwareOrderComparator.sort(combined);
if (logger.isDebugEnabled()) {
logger.debug("Sorted gatewayFilterFactories: " + combined);
}
return new DefaultGatewayFilterChain(combined).filter(exchange);
}
代码解析:
@Bean
public GlobalFilter customFilter() {
return new CustomGlobalFilter();
}
public class CustomGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("custom global filter");
return chain.filter(exchange);
}
@Override
public int getOrder() {
return -1;
}
}
处理URL格式为:forward:///localendpoint,这种将会被转发到forward后面的地址
3.2 The LoadBalancerClient Filter
没看到源码,本地是 SpringCloud 2021.0.1版本
3.3 The ReactiveLoadBalancerClientFilter
如果URL有⼀个 lb scheme (如 lb://myservice ),它将使⽤Spring Cloud ReactorLoadBalancer 将名称(在前⼀个示例中为 myservice )解析为实际主机和端⼝,并替换URI
spring:
cloud:
gateway:
routes:
- id: myRoute
uri: lb://service
predicates:
- Path=/service/**
如果URL具有http 或https 模式,则会运⾏Netty Routing Filter。它使⽤Netty HttpClient 发出下游代理请求。
响应放在ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR exchange属性中。
从ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR exchange属性如果有值,此filter就执行,用于写响应报文到缓存。
如果 ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR exchange属性中存在 Route 对象RouteToRequestUrlFilter 将运⾏。它基于请求URI创建⼀个新的URI,使⽤Route对象的uri属性进⾏更新。新的URI被放置在 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR exchange属性中。如果该URI有⼀个前缀scheme,例如lb:ws://serviceid,则会从该URI中剥离该 lb scheme,并将其放置在ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR 中,以便稍后在过滤器链中使⽤。
如果 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR exchange属性中有 ws 、 wss scheme,则Websocket Routing Filter将被运⾏。它使⽤Spring Web Socket基础模块将Websocket转发到下游。
URI前缀为 lb 的Websockets可以被负载均衡,如 lb:ws://serviceid
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/**
要启⽤⽹关指标,请将 spring-boot-starter-actuator 添加为项⽬依赖项。然后,默认情况下,只要属性 spring.cloud.gateway.metrics.enabled 未设置为 false ,⽹关指标过滤器就会运⾏。此过滤器添加名为 spring.cloud.gateway.requests 的计时器指标,并带有以下标记