带base-path的Spring WebFlux网关请求转发至订单微服务配置问题
解决Spring WebFlux API网关保留base-path时路由转发失效问题
方案1:使用Spring Cloud Gateway专属的base-path配置(推荐)
Spring Cloud Gateway提供了适配路由逻辑的专属base-path配置,替代WebFlux全局前缀更合理:
- 修改网关配置文件,替换base-path配置项:
server: port: 8081 spring: cloud: gateway: base-path: /api-gateway
- 保留原有的
RouteLocatorBean配置无需修改:
@Bean RouteLocator customRouteLocator(RouteLocatorBuilder routeBuilder) { return routeBuilder.routes() .route("route_id", route -> route .path("/v1/order-card/**") .filters(f -> f .rewritePath("/v1/order-card/(?<RID>.*)", "/service-order/v1/order/${RID}")) .uri("http://localhost:8080")) .build(); }
原理:spring.cloud.gateway.base-path会自动从请求路径中剥离前缀,路由匹配和路径重写均基于剥离后的路径,完全适配你原本的路由逻辑。
方案2:继续使用spring.webflux.base-path(不推荐)
若必须保留WebFlux全局前缀配置,需调整路由的路径匹配和重写规则,此时路由需匹配完整的原始请求路径:
修改RouteLocator Bean,将base-path纳入匹配和重写规则:
@Bean RouteLocator customRouteLocator(RouteLocatorBuilder routeBuilder) { return routeBuilder.routes() .route("route_id", route -> route .path("/api-gateway/v1/order-card/**") .filters(f -> f .rewritePath("/api-gateway/v1/order-card/(?<RID>.*)", "/service-order/v1/order/${RID}")) .uri("http://localhost:8080")) .build(); }
原理:使用spring.webflux.base-path时,WebFlux不会自动剥离前缀,路由需匹配包含base-path的完整请求路径,重写规则也需对应替换前缀部分。
验证:发送请求localhost:8081/api-gateway/v1/order-card/93c0ea08-617e-11ed-b819-00155d0f6513,网关会正确转发至Order微服务的/service-order/v1/order/93c0ea08-617e-11ed-b819-00155d0f6513端点。
内容的提问来源于stack exchange,提问作者Alex Grimaldo
相关产品推荐
相关产品推荐

