我们在二十四、springCloudAlibaba-gateway整合nacos搭建了gateway的网关案例,在此基础上,来试用下内置的过滤器工厂。
1、内置过滤器工厂
参考:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories
其实就是对请求进行过滤,比如加请求头,加参数,重定向等,官网都介绍的清清楚楚了,不会英语的可以借助翻译工具,这里试用几个。
2、简单体验下
这里体验下两个The AddRequestHeader GatewayFilter Factory和The AddRequestParameter GatewayFilter Factory 也就是添加请求头和参数,我们的配置文件变为
#gateway配置
gateway:
#路由规则
routes:
- id: order_route # 路由的唯一标识
uri: lb://order-service #需要转发的地址.lb本地负载均衡策略
#断言规则 用于路由规则的匹配
predicates:
- Path=/order-service/**
#- Query=green,hel.
#- MyCustomize=test
#- After=2023-11-13T21:05:39.811+08:00[Asia/Shanghai]
#匹配请求http://localhost:8088/order-service/order/add
#过滤器 用于过滤请求
filters:
- StripPrefix=1 #转发之前去掉第一层路径
- AddRequestHeader=X-Request-red, blue
- AddRequestParameter=red, blue
#http://localhost:8010/order/add
#- id: stock_route
然后修改下调用的add方法,返回一下
@RequestMapping("/add")
public String add(HttpServletRequest request){
//1、获取请求头
String str = request.getHeader("X-Request-red");
//2、获取参数
String red = request.getParameter("red");
//String msg = stockService.reduce();
return "新增订单成功:header="+str+";参数red="+red;
}
请求http://localhost:8088/order-service/order/add 成功返回了结果
新增订单成功:header=blue;参数red=blue
3、自定义过滤器
跟自定义路由断言工厂一样,我们随便参考一个来实现即可,这里参考的是一个重定向过滤器RedirectTo,IDEA查看源码
可以看到也是约定大于配置的,跟自定义路由断言工厂差不多,大都是那几个步骤
- 1、由于是约定大于配置,所以我们的类结尾应该是GatewayFilterFactory结尾,比如这里我自定义的断言类是MyCustomizeGatewayFilterFactory
- 2、必须继承AbstractGatewayFilterFactory
- 3、必须声明内部静态类,用来接收配置中的属性
- 4、需要结合shortcutFieldOrder进行属性绑定
- 5、通过apply进行业务处理
- 6、必须为bean
@Component
public class MyCustomizeGatewayFilterFactory extends AbstractGatewayFilterFactory<MyCustomizeGatewayFilterFactory.Config> {
public MyCustomizeGatewayFilterFactory() {
super(MyCustomizeGatewayFilterFactory.Config.class);
}
public List<String> shortcutFieldOrder() {
return Arrays.asList("key", "value");
}
public GatewayFilter apply(MyCustomizeGatewayFilterFactory.Config config) {
return new GatewayFilter() {
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//将配置的key value配置在请求头中
ServerHttpRequest request = exchange.getRequest().mutate().header(config.getKey(), new String[]{config.getValue()}).build();
return chain.filter(exchange.mutate().request(request).build());
}
};
}
public static class Config {
String key;
String value;
public Config() {
}
public String getKey() {
return key;
}
public String getValue() {
return value;
}
public void setKey(String key) {
this.key = key;
}
public void setValue(String value) {
this.value = value;
}
}
}
注:这里用exchange.getRequest().getHeaders().set();是设置不了值的。
我们使用下
#gateway配置
gateway:
#路由规则
routes:
- id: order_route # 路由的唯一标识
uri: lb://order-service #需要转发的地址.lb本地负载均衡策略
#断言规则 用于路由规则的匹配
predicates:
- Path=/order-service/**
#- Query=green,hel.
#- MyCustomize=test
#- After=2023-11-13T21:05:39.811+08:00[Asia/Shanghai]
#匹配请求http://localhost:8088/order-service/order/add
#过滤器 用于过滤请求
filters:
- StripPrefix=1 #转发之前去掉第一层路径
- AddRequestHeader=X-Request-red, blue
- AddRequestParameter=red, blue
- MyCustomize=from,suibibk.com
#http://localhost:8010/order/add
#- id: stock_route
请求就会发现请求头里面加上了from,值是suibibk.com
4、全局过滤器
官方文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#global-filters
就是不需要单个路由配置,全部请求都会生效的,下面自定义一个
@Component
public class MyFilter implements GlobalFilter {
Logger logger = LoggerFactory.getLogger(MyFilter.class);
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//1、记录日志
logger.info("日志"+exchange.getRequest().getPath().value());
return chain.filter(exchange);
}
}
运行,可以看到每个请求都打印了日志
5、日志
加上启动参数
-Dreactor.netty.http.server.accessLogEnabled=true
然后配合日志文件即可!
ok!