Spring Cloud Gateway集成Eureka使用lb://服务名路由返回404问题求助
问题根因与解决办法
常见原因1:服务名匹配异常
Eureka默认将注册的服务名转为大写存储,Spring Cloud LoadBalancer默认大小写敏感,若业务服务的spring.application.name和网关lb://后的服务名大小写不匹配,会导致路由无法找到对应实例。
解决办法
- 核对业务服务的
spring.application.name配置,确保与lb://MY-SERVICE的服务名完全一致 - 若需要兼容小写服务名,可在网关添加如下配置:
spring: cloud: loadbalancer: ribbon: enabled: false # 兼容旧版本无Ribbon依赖的场景 discovery: client: lower-case-service-id: true # 开启小写服务名匹配
常见原因2:Eureka实例注册信息错误
业务服务注册到Eureka时,若端口、IP配置异常,会导致网关拉取到错误的实例地址,触发404。
解决办法
- 打开Eureka控制台,找到
MY-SERVICE服务的实例列表,点击实例的status链接,确认跳转的地址端口是否为4001 - 若端口错误,删除业务服务中手动配置的
eureka.instance.non-secure-port,让Eureka自动识别服务启动端口即可。
常见原因3:自动路由与自定义路由冲突
你当前配置了spring.cloud.gateway.discovery.locator.enabled=true,该参数会开启网关自动根据服务名生成路由规则,可能和你手动配置的自定义路由产生优先级冲突,导致路径匹配异常。
解决办法
将网关配置中的spring.cloud.gateway.discovery.locator.enabled改为false,禁用自动路由规则即可。
常见原因4:负载均衡依赖缺失
Spring Cloud 2020.0(Ilford)及以上版本移除了默认的Ribbon依赖,若未手动引入Spring Cloud LoadBalancer,lb://协议的路由会出现寻址异常。
解决办法
在网关的项目依赖中添加负载均衡组件:
<!-- Maven依赖示例 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
常见原因5:上下文路径不匹配
若业务服务配置了server.servlet.context-path(Spring MVC)或spring.webflux.base-path(WebFlux),会导致转发的路径和业务服务实际监听的路径不匹配。
解决办法
根据业务服务的上下文路径配置,调整路由的路径过滤器,示例如下:
spring: cloud: gateway: routes: - id: my-service-route uri: lb://MY-SERVICE predicates: - Path=/api/my/service/** filters: - StripPrefix=0 # 保留完整路径转发,若需要截断前缀可调整为对应数值
内容的提问来源于stack exchange,提问作者Rafael Bandeira Rodrigues
相关产品推荐
相关产品推荐

