H5W3
当前位置:H5W3 > 其他技术问题 > 正文

请教一个 Spring Cloud Gateway 的问题 ,在已有路由规则下,怎么实现部分接口不走该路由规则?

问题如下:

我有一个需求,我所负责的是一个网关模块,由于历史原因,导致现在需要进行部分重构,将原有的网关替换成 Spring Cloud Gateway 。

主要是缩短链路,原有的链路:a-service -> b-service -> c-service

改变链路为:a-service -> c-service

新老接口都有统一的路径前缀:/proxy/${appName}/${serverName}

存在的问题:

  1. 由于需要尽快上线,老接口的路由规则不能改变也就是继续走 gateway-service -> otherGateway-service -> app-service,但是新接口就要走新链路 gateway-service -> app-service 。
  2. 这里我做了一个白名单,把旧的接口路径放到了白名单中。
  3. 我配置了路由规则为:
routes:
  - id: app-service
    uri: http://localhost
    predicates:
      - Path=/proxy/app/**
    filters:
       - StripPrefix=1 
  1. 由于新老接口 uri 路径一致,我想通过白名单判断,如果在白名单中不使用路由规则,继续走老链路。如果不在白名单中就使用路由规则走新链路。

请问该怎么实现?

回答:

其实呢,看了几遍,总感觉怪怪的,觉得题主描述的问题不是很清楚。就是解决题主最终的业务问题,和题主描述的解决方案不一定是最匹配的,比较想明白原始问题以及场景,没准也更好的解决办法

不过有一点我感觉可能看懂了,就是如果只是仅仅针对spring cloud gatewaypredicate的设置,以达到类似接口路径黑名单的路由效果(我觉得这里是黑名单才对吧,不是说在名单中就不使用路由规则么),倒是可以解决

我们知道predicates下面配置的predicate是并集的关系,新老接口uri路径一致,所以只要在题主原来的路由配置中新增一个类似的黑名单predicate就可以了

只是spring cloud gateway中内置的predicate好像没有找到上面的效果(当然没准是我没看到更多的PathRoutePredicateFactory的用法)

但是我们可以自定义一个RoutePredicateFactory,也是非常简单的,比如取名叫BlackListUriRoutePredicateFactory

@Component
public class BlackListUriRoutePredicateFactory extends AbstractRoutePredicateFactory<BlackListUriRoutePredicateFactory.Config> {

    public BlackListUriRoutePredicateFactory() {
        super(Config.class);
    }
    
    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("uris");
    }
    
    @Override
    public ShortcutType shortcutType() {
        return ShortcutConfigurable.ShortcutType.GATHER_LIST;
    }
    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
        List<String> uris = config.getUris();
        return new GatewayPredicate() {
            @Override
            public boolean test(ServerWebExchange exchange) {
                String path = exchange.getRequest().getURI().getRawPath();
                return !uris.contains(path);
            }
        };
     }
     
     @Data
     static class Config {
         private List<String> uris;
     }
}

里面核心一点就是这个逻辑啦
image.png

反正就是把配置的接口路径拿出来contains一把,因为是黑名单,所以前面加个!

然后配置的时候也很简单,按照自定义RoutePredicateFactory的要求做配置就可以了,类似下面这样。
image.png

此时访问/proxy/vcs/console_haha1或者/proxy/vcs/console_haha2将不会被路由规则匹配到

至于题主说的什么链路选择,这也是我之前觉得怪的地方。。。如果后续还有补充再看看吧

2021-02-22更新补充

评论里题主有更新了问题,关键就是这里,现在题主的打算就是新网关架在老网关之前,然后依照新网关的配置做路由分流
image.png

这不就简单了么,也不用黑名单了,也不用写我那个自定义Predicate了,直接配置两个路由就可以了啊
image.png

因为spring cloud gateway路由匹配机制本身就这样,满足Predicate就能匹配

  • 所以直接在老网关的路由配置中配置那些固定的老接口地址
  • 新网关里的路由配置就是原路由规则
  • 由于老接口既满足老网关路由配置也满足新网关的里的路由配置,所以要给新网关里加个order,以防跑错

这下应该满足了叭,不过这么看起来问题描述真的很关键哦

本文地址:H5W3 » 请教一个 Spring Cloud Gateway 的问题 ,在已有路由规则下,怎么实现部分接口不走该路由规则?

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址