java - 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属性似乎也无法解决这个问题;目前我们发现无法设置此路线的顺序/优先级。这是故意的吗?
解决方案
更具体的路由应该首先出现在路由配置中,通用的在最后。
例如: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}
推荐阅读
- hyperledger-fabric - 在 Hyper Ledger Fabric 中创建计划交易
- django - 如何配置 IIS 以运行 FastCGI 应用程序
- javascript - mapStateToProps 未定义的状态值?
- c# - 在下拉菜单选择更改时从数据库中获取值
- angular - Ionic 4/ Angular 6 - 从 app.component 获取生命周期钩子之外的数据
- scala - 带有前缀的scala组合
- javascript - 在同一元素 ImmutableJS 中连接 2 个句子
- android - 在项目目录下找不到应用程序 build.gradle 文件
- c - 按类型限制多对多的资源访问
- wordpress - Google App Engine - PHP - 从 Composer 提供静态文件 - WordPress