Spring Cloud Gateway返回404错误求助
Spring Cloud Gateway 访问PRODUCT-SERVICE返回404的排查与解决
针对你遇到的网关返回404但直接访问服务正常的问题,结合你的配置,从以下几个方向逐一排查:
1. 确认服务发现状态
- 打开Eureka控制台(
http://localhost:8761),检查API-GATEWAY和PRODUCT-SERVICE是否都已成功注册,且PRODUCT-SERVICE的实例状态为UP。 - 查看网关启动日志,确认是否有拉取
PRODUCT-SERVICE实例的记录(比如类似Fetching instance list for service PRODUCT-SERVICE的日志)。如果没有,可在application.properties中添加:
缩短实例拉取间隔,确保网关及时获取服务实例。eureka.client.registry-fetch-interval-seconds=5
2. 解决路由配置冲突
你同时启用了服务发现自动路由和手动路由,可能导致匹配逻辑冲突:
- 自动路由模式下,网关会生成
/小写服务名/**的路由规则(因为你设置了lowerCaseServiceId=true),此时访问http://localhost:9090/product-service/products/**应该能转发到服务。 - 建议先关闭自动路由,专注调试手动路由,在
application.properties中修改:
重启网关后,测试访问spring.cloud.gateway.discovery.locator.enabled=falsehttp://localhost:9090/products/你的接口路径。
3. 修正路由路径与前缀处理
如果PRODUCT-SERVICE的接口本身没有/products前缀(比如接口是/getAll),需要添加过滤器去掉网关路径中的前缀:
修改application.yml:
spring: cloud: gateway: routes: - id: PRODUCT-SERVICE uri: lb://PRODUCT-SERVICE predicates: - Path=/products/** filters: - StripPrefix=1
这样网关会把/products/getAll转发为/getAll到目标服务。
4. 验证服务名大小写匹配
lb://PRODUCT-SERVICE中的服务名必须和Eureka中注册的名称完全一致(大小写敏感),检查PRODUCT-SERVICE的spring.application.name是否确实为PRODUCT-SERVICE,如果是小写的product-service,则需要同步修改网关中的uri为lb://product-service。
5. 检查路由是否生效
利用你配置的Actuator端点,查看当前网关的路由配置:
访问http://localhost:9090/actuator/gateway/routes,检查返回的JSON中是否包含你的PRODUCT-SERVICE路由,且规则与配置一致。
6. 排查依赖兼容性
你的Spring Boot 3.2.7和Spring Cloud 2023.0.2版本匹配正常,但注意:
- 不要同时引入
spring-boot-starter-web和spring-boot-starter-webflux,当前只引入webflux是正确的(Gateway基于WebFlux实现)。 - 暂时移除自定义的
ServiceDiscovery依赖,确认它不会干扰Eureka客户端的正常工作。
按照以上步骤逐一验证,应该能解决404问题。
内容的提问来源于stack exchange,提问作者Pranjal Katyayan
相关产品推荐
相关产品推荐

