Spring Cloud Gateway 中的路由顺序

问题描述 投票:0回答:3

我们正在使用

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

RouteDefinition{id='CompositeDiscoveryClient_ms-1400133464', predicates=[PredicateDefinition{name='Path', args={pattern=/yambas/rest/apps/*/models/ms/**}}], filters=[FilterDefinition{name='RewritePath', args={regexp=/yambas/rest/apps/(?<remaining>.*), replacement=/ms/apps/${remaining}}}], uri=lb://ms, order=0}

还有更一般的一个,只有在找到其他路线时才会触发:

RouteDefinition{id='CompositeDiscoveryClient_yambas-1171178634', predicates=[PredicateDefinition{name='Path', args={pattern=/yambas/rest/**}}], filters=[], uri=lb://yambas, order=0}

因此,当调用

/yambas/rest/apps/bla/models/ms
时,应使用第一个路由,而当调用
/yambas/rest/apps/bla/models/otherms/*
时,应使用第二个(后备)。

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

java spring spring-boot spring-cloud spring-cloud-gateway
3个回答
8
投票

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

例如:

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}

3
投票

看来我们设置顺序的方式错误 - 将较低优先级路由设置为顺序 1,将较高优先级路由设置为 0 即可使其工作。

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


0
投票

关于路由顺序,在Spring Cloud Gateway中Filter有推荐的顺序范围吗?.

有回答

TL;博士
该顺序基于

org.springframework.core.Ordered
接口,较低的值具有较高的优先级,正如@andreas 所提到的。

© www.soinside.com 2019 - 2024. All rights reserved.