Spring Cloud Gateway路由问题:URL服务名重复的解决需求
问题描述
我正尝试在项目中使用Spring Cloud Gateway实现API网关服务,现有名为admin的服务,网关路由配置如下:
spring: application: name: gateway cloud: gateway: discovery: locator: enabled: true lower-case-service-id: true routes: - id: admin_route uri: lb://admin predicates: - Path=/admin/**
编译成功但存在URL重复问题:
- 无需网关时,admin服务的API可正常访问:
http://localhost:<ADMIN_PORT>/admin/system/employee/check - 通过网关访问时,必须重复
admin才能调用:http://localhost:<GATEWAY_PORT>/admin/admin/system/employee/check
补充说明:admin服务的application.yml配置了servlet.context-path=/admin,且不能移除该配置(内部调用依赖)。需要实现:网关URL http://localhost:<GATEWAY_PORT>/admin/system/employee/check 直接路由到admin服务的http://localhost:<ADMIN_PORT>/admin/system/employee/check,且路由时保留/admin前缀。
解决方案
问题根源在于Spring Cloud Gateway的Path=/admin/**断言会自动移除匹配到的/admin前缀,再转发到目标服务,但admin服务本身依赖/admin作为context-path,因此转发路径必须包含该前缀才能匹配接口。以下两种方案均可解决:
方案一:使用RewritePath过滤器
修改网关路由配置,添加RewritePath过滤器保留完整路径结构:
spring: application: name: gateway cloud: gateway: discovery: locator: enabled: true lower-case-service-id: true routes: - id: admin_route uri: lb://admin predicates: - Path=/admin/** filters: - RewritePath=/admin/(?<remaining>.*), /admin/${remaining}
该规则会将请求路径/admin/xxx重写为/admin/xxx,确保转发到admin服务时路径包含/admin前缀,完美匹配服务的context-path。
方案二:使用StripPrefix + PrefixPath组合过滤器
先移除网关匹配的前缀,再给转发路径添加/admin前缀:
spring: application: name: gateway cloud: gateway: discovery: locator: enabled: true lower-case-service-id: true routes: - id: admin_route uri: lb://admin predicates: - Path=/admin/** filters: - StripPrefix=1 - PrefixPath=/admin
StripPrefix=1:移除请求路径中的第一个前缀(即/admin),得到/system/employee/checkPrefixPath=/admin:给路径添加/admin前缀,最终转发路径为/admin/system/employee/check,匹配admin服务的context-path
两种方案均可实现需求,可根据个人习惯选择。
内容的提问来源于stack exchange,提问作者Sobhan
相关产品推荐
相关产品推荐

