SpringCloudAlibaba - Gateway 自定义过滤器工厂
前言
Gateway
中的过滤器可以为路由添加业务逻辑,修改请求以及响应
环境
Spring Cloud Hoxton.SR9 + Spring Cloud Alibaba 2.2.6.RELEASE
Gateway过滤器的生命周期
pre
:Gateway
转发请求之前post
:Gateway
转发请求之后
过滤器工厂
内置过滤器工厂
AddRequestHeader GatewayFilter Factory
示例,为原始请求添加请求参数foo=bar
gateway:
discovery:
locator:
# 让gateway通过服务发现组件找到其他的微服务
enabled: true
routes:
- id: user-center
uri: lb://user-center
predicates:
- Path=/**
filters:
- AddRequestParameter=foo, bar
- 输入日志
自定义过滤器工厂
自定义过滤器工厂 - 实现方式
- 实现自定义过滤器工厂有两种方式
继承 AbstractGatewayFilterFactory
继承 AbstractNameValueGatewayFilterFactory
自定义过滤器工厂 - 具体实例
- 实现自定义过滤器工厂 - 日志打印
application.yml
gateway:
discovery:
locator:
# 让gateway通过服务发现组件找到其他的微服务
enabled: true
routes:
- id: user-center
uri: lb://user-center
predicates:
- Path=/**
filters:
- PreLog=参数1,参数2
PreLogGatewayFilterFactory.java
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractNameValueGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
/**
* 自定义过滤器工厂 - 日志打印
* 必须以GatewayFilterFactory结尾
*/
@Slf4j
@Component
public class PreLogGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {
@Override
public GatewayFilter apply(NameValueConfig config) {
return ((exchange, chain) -> {
log.info("自定义过滤器工厂 - 日志打印参数:{},{}", config.getName(), config.getValue());
// 修改请求
ServerHttpRequest modifiedRequest = exchange.getRequest()
.mutate()
.build();
// 修改exchange
ServerWebExchange modifiedExchange = exchange.mutate()
.request(modifiedRequest)
.build();
// 传递给下一个过滤器处理
return chain.filter(modifiedExchange);
});
}
}
- 访问
GATEWAY_URL/**
自定义过滤器工厂- 核心API
exchange.getRequest().mutate().xxx // 修改request
exchange.mutate().xxx // 修改exchange
chain.filter(exchange) // 传递给下一个过滤器处理
exchange.getResponse() // 拿到响应