有效性
Spring Cloud Gateway 2.0.0.RELEASE
调试方法
新建一个GlobalFilter,在filter中加断点即可调试filter,通过chain参数可以查看其它的filter及执行顺序(order)
filters(按执行顺序)
1. AdaptCachedBodyGlobalFilter
核心代码
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE + 1000;
}
public static final String CACHED_REQUEST_BODY_KEY = "cachedRequestBody";
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
Flux body = exchange.getAttributeOrDefault(CACHED_REQUEST_BODY_KEY, null);
if (body != null) {
ServerHttpRequestDecorator decorator = new ServerHttpRequestDecorator(exchange.getRequest()) {
@Override
public Flux getBody() {
return body;
}
};
return chain.filter(exchange.mutate().request(decorator).build());
}
return chain.filter(exchange);
}
提供替换request 的 body的能力
2.NettyWriteResponseFilter
核心代码
public static final int WRITE_RESPONSE_FILTER_ORDER = -1;
public int getOrder() {
return WRITE_RESPONSE_FILTER_ORDER;
}
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return chain.filter(exchange).then(Mono.defer(() -> {
//见 后文的 NettyRoutingFilter
HttpClientResponse clientResponse = exchange.getAttribute(CLIENT_RESPONSE_ATTR);
ServerHttpResponse response = exchange.getResponse();
NettyDataBufferFactory factory = (NettyDataBufferFactory) response.bufferFactory();
final Flux body = clientResponse.receive()
.map(factory::wrap);
MediaType contentType = response.getHeaders().getContentType();
return (isStreamingMediaType(contentType) ?
response.writeAndFlushWith(body.map(Flux::just)) : response.writeWi