Spring Cloud Gateway集成OpenAPI Swagger失效问题求助
问题原因
你加了UI服务的Path=/**路由后,Swagger UI需要的静态资源(比如/swagger-ui/开头的js、css文件)、网关自己的API文档接口(/v3/api-docs、/v3/api-docs/swagger-config),还有下游DEMO服务的API文档接口(/service-1-aug/v3/api-docs),全被网关转发到UI服务(localhost:3000)去了。但UI服务根本没有这些资源和接口,自然就加载失败了。核心就是/**这个路径会匹配所有请求,把原本该网关自己处理或者转发给DEMO服务的请求都截胡了。
解决办法
办法一:给UI路由加排除规则,放过Swagger相关路径
修改UI路由的predicates,排除掉Swagger相关的所有路径,这样这些请求就不会被转发到UI服务了:
spring: cloud: gateway: routes: - id: DEMO-SERVICE uri: http://localhost:8083 predicates: - Path=/service-1-aug/** - id: UI uri: http://localhost:3000 predicates: - Path=/** - "!Path=/swagger-ui/**" - "!Path=/v3/api-docs/**" - "!Path=/service-1-aug/v3/api-docs/**"
办法二:调整路由顺序,利用网关自身接口优先级
Spring Cloud Gateway自己的接口(比如Swagger的那些页面和接口)优先级比路由转发高,但为了保险,还是把DEMO服务的路由放在UI路由前面,同时可以给UI路由加个路径重写的过滤器:
spring: cloud: gateway: routes: - id: DEMO-SERVICE uri: http://localhost:8083 predicates: - Path=/service-1-aug/** - id: UI uri: http://localhost:3000 predicates: - Path=/** filters: - RewritePath=/(?<segment>.*), /$\{segment}
要是还是有静态资源被转发的问题,建议结合办法一的排除规则一起用。
办法三:给UI服务限定具体路径(最稳妥)
如果你的UI服务有固定的路径前缀(比如/ui/),直接把UI路由的path改成这个前缀,别用/**兜底:
spring: cloud: gateway: routes: - id: DEMO-SERVICE uri: http://localhost:8083 predicates: - Path=/service-1-aug/** - id: UI uri: http://localhost:3000 predicates: - Path=/ui/** filters: - RewritePath=/ui/(?<segment>.*), /$\{segment}
这种方式不会影响其他服务和Swagger,最安全。
验证步骤
- 启动网关、DEMO-SERVICE和UI服务
- 访问
http://localhost:8085/swagger-ui.html,检查是否能正常加载网关和DEMO服务的Swagger文档 - 访问UI服务的对应路径(比如
http://localhost:8085或者http://localhost:8085/ui/xxx),确认UI服务能正常访问
内容的提问来源于stack exchange,提问作者Thejas
相关产品推荐
相关产品推荐

