Spring 云网关中的路由顺序
Route order in Spring Cloud Gateway
我们正在使用 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 属性似乎也无法解决这个问题;目前我们发现无法设置此顺序/路由优先级。这是故意的吗?
看来我们设置顺序的方式有误 - 将优先级较低的路由设置为顺序 1,将较高的路由设置为 0 使其工作。
@spencergibb 绝对值得在文档中提及。
更具体的路由应该首先出现在路由配置中,一般的路由出现在最后。
例如: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}
我们正在使用 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 属性似乎也无法解决这个问题;目前我们发现无法设置此顺序/路由优先级。这是故意的吗?
看来我们设置顺序的方式有误 - 将优先级较低的路由设置为顺序 1,将较高的路由设置为 0 使其工作。
@spencergibb 绝对值得在文档中提及。
更具体的路由应该首先出现在路由配置中,一般的路由出现在最后。
例如: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}