个人随笔
目录
二十七、springCloudAlibaba-gateway内置过滤器工厂、自定义过滤器工厂、全局过滤器、日志
2023-11-14 21:35:59

我们在二十四、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 也就是添加请求头和参数,我们的配置文件变为

  1. #gateway配置
  2. gateway:
  3. #路由规则
  4. routes:
  5. - id: order_route # 路由的唯一标识
  6. uri: lb://order-service #需要转发的地址.lb本地负载均衡策略
  7. #断言规则 用于路由规则的匹配
  8. predicates:
  9. - Path=/order-service/**
  10. #- Query=green,hel.
  11. #- MyCustomize=test
  12. #- After=2023-11-13T21:05:39.811+08:00[Asia/Shanghai]
  13. #匹配请求http://localhost:8088/order-service/order/add
  14. #过滤器 用于过滤请求
  15. filters:
  16. - StripPrefix=1 #转发之前去掉第一层路径
  17. - AddRequestHeader=X-Request-red, blue
  18. - AddRequestParameter=red, blue
  19. #http://localhost:8010/order/add
  20. #- id: stock_route

然后修改下调用的add方法,返回一下

  1. @RequestMapping("/add")
  2. public String add(HttpServletRequest request){
  3. //1、获取请求头
  4. String str = request.getHeader("X-Request-red");
  5. //2、获取参数
  6. String red = request.getParameter("red");
  7. //String msg = stockService.reduce();
  8. return "新增订单成功:header="+str+";参数red="+red;
  9. }

请求http://localhost:8088/order-service/order/add 成功返回了结果

  1. 新增订单成功:header=blue;参数red=blue

3、自定义过滤器

跟自定义路由断言工厂一样,我们随便参考一个来实现即可,这里参考的是一个重定向过滤器RedirectTo,IDEA查看源码

可以看到也是约定大于配置的,跟自定义路由断言工厂差不多,大都是那几个步骤

  • 1、由于是约定大于配置,所以我们的类结尾应该是GatewayFilterFactory结尾,比如这里我自定义的断言类是MyCustomizeGatewayFilterFactory
  • 2、必须继承AbstractGatewayFilterFactory
  • 3、必须声明内部静态类,用来接收配置中的属性
  • 4、需要结合shortcutFieldOrder进行属性绑定
  • 5、通过apply进行业务处理
  • 6、必须为bean
  1. @Component
  2. public class MyCustomizeGatewayFilterFactory extends AbstractGatewayFilterFactory<MyCustomizeGatewayFilterFactory.Config> {
  3. public MyCustomizeGatewayFilterFactory() {
  4. super(MyCustomizeGatewayFilterFactory.Config.class);
  5. }
  6. public List<String> shortcutFieldOrder() {
  7. return Arrays.asList("key", "value");
  8. }
  9. public GatewayFilter apply(MyCustomizeGatewayFilterFactory.Config config) {
  10. return new GatewayFilter() {
  11. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  12. //将配置的key value配置在请求头中
  13. ServerHttpRequest request = exchange.getRequest().mutate().header(config.getKey(), new String[]{config.getValue()}).build();
  14. return chain.filter(exchange.mutate().request(request).build());
  15. }
  16. };
  17. }
  18. public static class Config {
  19. String key;
  20. String value;
  21. public Config() {
  22. }
  23. public String getKey() {
  24. return key;
  25. }
  26. public String getValue() {
  27. return value;
  28. }
  29. public void setKey(String key) {
  30. this.key = key;
  31. }
  32. public void setValue(String value) {
  33. this.value = value;
  34. }
  35. }
  36. }

注:这里用exchange.getRequest().getHeaders().set();是设置不了值的。

我们使用下

  1. #gateway配置
  2. gateway:
  3. #路由规则
  4. routes:
  5. - id: order_route # 路由的唯一标识
  6. uri: lb://order-service #需要转发的地址.lb本地负载均衡策略
  7. #断言规则 用于路由规则的匹配
  8. predicates:
  9. - Path=/order-service/**
  10. #- Query=green,hel.
  11. #- MyCustomize=test
  12. #- After=2023-11-13T21:05:39.811+08:00[Asia/Shanghai]
  13. #匹配请求http://localhost:8088/order-service/order/add
  14. #过滤器 用于过滤请求
  15. filters:
  16. - StripPrefix=1 #转发之前去掉第一层路径
  17. - AddRequestHeader=X-Request-red, blue
  18. - AddRequestParameter=red, blue
  19. - MyCustomize=from,suibibk.com
  20. #http://localhost:8010/order/add
  21. #- id: stock_route

请求就会发现请求头里面加上了from,值是suibibk.com

4、全局过滤器

官方文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#global-filters

就是不需要单个路由配置,全部请求都会生效的,下面自定义一个

  1. @Component
  2. public class MyFilter implements GlobalFilter {
  3. Logger logger = LoggerFactory.getLogger(MyFilter.class);
  4. @Override
  5. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  6. //1、记录日志
  7. logger.info("日志"+exchange.getRequest().getPath().value());
  8. return chain.filter(exchange);
  9. }
  10. }

运行,可以看到每个请求都打印了日志

5、日志

加上启动参数

  1. -Dreactor.netty.http.server.accessLogEnabled=true

然后配合日志文件即可!
ok!

 52

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2