个人随笔
目录
二十六、springCloudAlibaba-gateway自定义路由断言工厂
2023-11-13 22:21:14

在上一篇二十五、springCloudAlibaba-gateway的内置路由断言工厂 我们介绍了内置的路由断言工厂,这里我们来实时自定义断言工厂

1、实现思路

我们在IDEA中连按两下Shift键搜索QueryRoute就可以看到Query断言工厂怎么实现的,我们拷贝一份参考实现即可。

2、实现步骤

  • 1、由于是约定大于配置,所以我们的类结尾应该是RoutePredicateFactory结尾,比如这里我自定义的断言类是MyCustomizeRoutePredicateFactory
  • 2、必须继承AbstractRoutePredicateFactory
  • 3、必须声明内部静态类,用来接收配置中的属性
  • 4、需要结合shortcutFieldOrder进行属性绑定
  • 5、通过apply进行逻辑判断,true为匹配成功,false为匹配失败
  • 6、必须为bean

3和4其实就是接收配置中的green位置和hel.位置的属性值

  1. predicates:
  2. - Query=green,hel.

3、代码如下

  1. //
  2. // Source code recreated from a .class file by IntelliJ IDEA
  3. // (powered by FernFlower decompiler)
  4. //
  5. package com.suibibk.springCloud.gateway;
  6. import java.util.Arrays;
  7. import java.util.Iterator;
  8. import java.util.List;
  9. import java.util.function.Predicate;
  10. import javax.validation.constraints.NotEmpty;
  11. import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
  12. import org.springframework.cloud.gateway.handler.predicate.GatewayPredicate;
  13. import org.springframework.stereotype.Component;
  14. import org.springframework.util.StringUtils;
  15. import org.springframework.validation.annotation.Validated;
  16. import org.springframework.web.server.ServerWebExchange;
  17. @Component
  18. public class MyCustomizeRoutePredicateFactory extends AbstractRoutePredicateFactory<MyCustomizeRoutePredicateFactory.Config> {
  19. public static final String PARAM_KEY = "param";
  20. public static final String REGEXP_KEY = "regexp";
  21. public MyCustomizeRoutePredicateFactory() {
  22. super(Config.class);
  23. }
  24. public List<String> shortcutFieldOrder() {
  25. return Arrays.asList("param", "regexp");
  26. }
  27. public Predicate<ServerWebExchange> apply(final Config config) {
  28. return new GatewayPredicate() {
  29. public boolean test(ServerWebExchange exchange) {
  30. //如果参数中有我们配置的参数
  31. if(exchange.getRequest().getQueryParams().containsKey(config.getParam())){
  32. return true;
  33. }else{
  34. return false;
  35. }
  36. }
  37. };
  38. }
  39. @Validated
  40. public static class Config {
  41. private @NotEmpty String param;
  42. private String regexp;
  43. public Config() {
  44. }
  45. public String getParam() {
  46. return this.param;
  47. }
  48. public Config setParam(String param) {
  49. this.param = param;
  50. return this;
  51. }
  52. public String getRegexp() {
  53. return this.regexp;
  54. }
  55. public Config setRegexp(String regexp) {
  56. this.regexp = regexp;
  57. return this;
  58. }
  59. }
  60. }

逻辑很简单,只要参数中有我在断言里面配置的key就通过

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

我们测试http://localhost:8088/order-service/order/add?test=helo 正常返回,但是去掉test或则改为test1就报404了。

4、总结

参考,拷贝,修改来实现!

 39

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


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

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