Spring Cloud Gateway 中的路由顺序

Posted

技术标签:

【中文标题】Spring Cloud Gateway 中的路由顺序【英文标题】:Route order in Spring Cloud Gateway 【发布时间】:2019-09-23 18:02:36 【问题描述】:

我们正在使用RouteDefinitionLocator 的实现以编程方式实现路由。我们有两个服务应该在同一个路由路径上注册,如果另一个不存在,其中一个作为后备服务。具体路径的首选路线是:

RouteDefinitionid='CompositeDiscoveryClient_ms-1400133464', predicates=[PredicateDefinitionname='Path', args=pattern=/yambas/rest/apps/*/models/ms/**], filters=[FilterDefinitionname='RewritePath', args=regexp=/yambas/rest/apps/(?<remaining>.*), replacement=/ms/apps/$remaining], uri=lb://ms, order=0

还有更通用的,只有在找到其他路线时才会触发:

RouteDefinitionid='CompositeDiscoveryClient_yambas-1171178634', predicates=[PredicateDefinitionname='Path', args=pattern=/yambas/rest/**], filters=[], uri=lb://yambas, order=0

因此,当调用/yambas/rest/apps/bla/models/ms 时,应该使用第一个路由,当调用/yambas/rest/apps/bla/models/otherms/* 时,应该使用第二个(fallback)。

问题是,即使是路线上的 order 属性似乎也不能解决这个问题;目前我们发现无法设置此路线的顺序/优先级。这是故意的吗?

【问题讨论】:

它们都是0序,这意味着它是随机的。下单了没有反映?你用的是什么版本? 嗨,Spencer,我尝试将第一个设置为 50,第二个设置为 0 - 然后它找不到/yambas/rest/apps/bla/models/ms 的任何路线 【参考方案1】:

更具体的路由应该首先出现在路由配置中,通用的在最后。

例如:http://gateway-url/v1/accounts/** 总是匹配 route-id-1 而 http://gateway-url/v1/** 匹配 route-id-2

spring:
  cloud:
    gateway:
      routes:
      - id: route-id-1
        uri: http://www.someurl.com
        order: 0
        predicates:
        - Path=/v1/accounts/** #<--
        filters:
        - RewritePath=/v1/accounts/(?<segment>.*), /$\segment
      - id: route-id-2
        uri: http://www.someurl1.com
        order: 1
        predicates:
        - Path=/v1/** #<--
        filters:
        - RewritePath=/v1/(?<segment>.*), /$\segment
        

【讨论】:

【参考方案2】:

似乎我们设置顺序的方式错误 - 将优先级较低的路由设置为顺序 1,将优先级较高的路由设置为 0 才能正常工作。

@spencergibb 绝对值得在文档中提及。

【讨论】:

以上是关于Spring Cloud Gateway 中的路由顺序的主要内容,如果未能解决你的问题,请参考以下文章

spring cloud gateway 某些路由中跳过全局过滤器

Spring Cloud Gateway 2 断言

Spring Cloud Gateway 5 权重路由

spring cloud gateway网关路由分配

Spring Cloud Gateway 和 DiscoveryClient 路由

Spring Cloud Gateway整合Nacos实现服务路由及集群负载均衡