Spring Cloud Gateway路由转发返回空响应问题排查
初始配置存在的两个核心错误
1. 路由目标URI缺失HTTP协议前缀
Spring Cloud Gateway的uri配置必须传入符合标准URI规范的地址,必须显式声明协议类型。初始配置里写的uri: localhost:5861/没有加http://前缀,网关无法将其识别为合法的HTTP服务地址,转发请求时无法正确构造发往后端的请求报文,直接导致响应为空。
2. 路径匹配规则和后端实际接口不匹配,未做路径裁剪
初始配置的路径断言是Path=/product-service/**,Spring Cloud Gateway默认不会裁剪请求路径,会把访问网关的完整路径直接转发给后端:
- 访问网关的地址是
http://localhost:5860/product-service/product时,按照默认转发逻辑,后端收到的请求路径会是/product-service/product - 但后端微服务实际提供的接口路径是
/product/,后端根本不存在/product-service/product这个接口,自然无法返回正常业务数据。
你给出的可正常运行的配置刚好修复了这两个问题:一方面给uri补上了http://前缀,另一方面把路径断言改成了Path=/product,直接和后端接口路径对齐,所以转发后可以拿到正常响应。
如果你后续需要保留
/服务名/**的前缀路由规则(比如网关层统一用服务名做路由区分),不需要把断言改成和后端路径一致,只要给对应路由添加StripPrefix过滤器裁掉前缀即可,配置示例如下:spring: cloud: gateway: routes: - id: product_service uri: http://localhost:5861/ predicates: - Path=/product-service/** filters: - StripPrefix=1加上这个配置后,访问
/product-service/product时,网关会自动把第一段路径/product-service裁掉,转发给后端的路径就是/product,和后端接口匹配,同样可以正常返回响应。
内容的提问来源于stack exchange,提问作者Emin Bilgic
相关产品推荐
相关产品推荐

