微服务UserService调用DepartmentService报Servlet.service I/O错误如何解决
问题排查与解决方案
1. 检查DepartmentService基础配置
- 确认DepartmentService的
spring.application.name配置值为DEPARTMENT-SERVICE,大小写必须和RestTemplate调用URL中的服务名完全一致,Eureka服务名匹配为大小写敏感。 - 打开Eureka控制台
http://localhost:8761,确认DEPARTMENT-SERVICE实例已经成功注册到注册中心。 - 直接通过IP+端口调用DepartmentService的接口验证可用性,比如访问
http://localhost:[DepartmentService服务端口]/departments/2,确认接口可以正常返回数据,排除服务本身故障的可能性。
2. 修正UserService的配置错误
你当前UserService的application.yml存在缩进错误,instance节点错误归到了eureka.client.service-url层级下,正确的配置格式如下:
server: port: 9092 spring: application: name: USER-SERVICE eureka: client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:8761/eureka/ instance: hostname: localhost
该缩进错误会导致Eureka实例配置不生效,影响服务发现的地址解析逻辑。
3. 检查依赖与版本兼容性
如果你使用的是Spring Cloud 2020.0及以上版本(Ilford版本),官方已经默认移除了Ribbon组件,@LoadBalanced注解需要配合Spring Cloud LoadBalancer依赖才能实现服务名解析,需要确认项目中已引入对应依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
缺少该依赖会导致RestTemplate无法将服务名解析为实际的IP+端口,最终抛出连接超时错误。
4. 快速验证定位问题
可以先将RestTemplate调用的URL替换为DepartmentService的IP+端口直接调用,如果调用成功即可确认问题出在服务发现或负载均衡组件层面,再针对性排查上面的配置和依赖问题即可。
内容的提问来源于stack exchange,提问作者Rafael Martin
相关产品推荐
相关产品推荐

