在Spring Cloud Gateway中路由订单

kognpnkq  于 2022-11-23  发布在  Spring
关注(0)|答案(2)|浏览(137)

我们正在使用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/*时,应当使用第二路由(回退)。
问题是,即使是route的 order 属性似乎也不能解决这个问题;目前我们无法建立此路线的顺序/优先级。2这是意向吗?

hs1ihplo

hs1ihplo1#

在路由配置中,更具体的路由应该首先出现,一般路由应该出现在最后。
例如: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}
35g0bw71

35g0bw712#

看起来我们设置顺序的方式是错误的--将优先级较低的路由设置为顺序1,将优先级较高的路由设置为0,这样就可以正常工作。
@spencergibb,这绝对值得在文档中提及。

相关问题