我们在二十四、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
@Componentpublic 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
就是不需要单个路由配置,全部请求都会生效的,下面自定义一个
@Componentpublic class MyFilter implements GlobalFilter {Logger logger = LoggerFactory.getLogger(MyFilter.class);@Overridepublic 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!
