Spring Cloud Gateway的application.yaml路由配置失效排查求助
问题排查:Spring Cloud Gateway Java配置转YAML失效
问题背景
使用Java配置类实现的Spring Cloud Gateway路由可正常工作:
@Configuration public class Config { @Bean public RouteLocator routeLocator(RouteLocatorBuilder builder) { return builder.routes() .route("customer-service", r -> r .path("/api/customers/{customerId}") .or() .path("/api/customers") .uri("http://localhost:8082") ) .route("order-service", r -> r .path("/api/orders") .or() .path("/api/orders/**") .or() .path("/api/customers/{customerId}/orders") .or() .path("/api/customers/{customerId}/orders/**") .uri("http://localhost:8081") ) .build(); } }
转换为以下YAML配置后无法正常工作,预期两种配置效果等价:
spring: cloud: gateway: routes: - id: customer-service uri: http://localhost:8082 predicates: - Path=/api/customers/{customerId} - Path=/api/customers - id: order-service uri: http://localhost:8081 predicates: - Path=/api/orders - Path=/api/orders/** - Path=/api/customers/{customerId}/orders - Path=/api/customers/{customerId}/orders/**
核心问题
Spring Cloud Gateway的配置规则存在关键差异:
- Java代码中
.or()表示多个Path断言为**逻辑或(OR)**关系,只要请求匹配其中任意一个路径就会触发路由。 - YAML配置里的
predicates列表默认是**逻辑与(AND)**关系,要求请求同时匹配所有断言才会触发路由。
你原YAML配置将多个Path断言放在列表中,相当于要求请求同时匹配所有路径,这显然无法实现,最终导致路由失效。
正确的YAML配置
Path断言支持在单个表达式中用逗号分隔多个路径,以此实现逻辑或的效果,与Java代码的.or()完全等价。修改后的配置如下:
spring: cloud: gateway: routes: - id: customer-service uri: http://localhost:8082 predicates: - Path=/api/customers/{customerId},/api/customers - id: order-service uri: http://localhost:8081 predicates: - Path=/api/orders,/api/orders/**,/api/customers/{customerId}/orders,/api/customers/{customerId}/orders/**
内容的提问来源于stack exchange,提问作者Janek1010
相关产品推荐
相关产品推荐

