Spring Boot 2.5.4集成Eureka调用服务报未知主机错误如何解决
Spring Boot Eureka 服务名调用失败解决方案
核心根因
你使用的Spring Boot 2.5.4对应Spring Cloud 2020.0.x(Ilford)及以上版本,该版本默认移除了Ribbon组件,@LoadBalanced注解需要依赖spring-cloud-starter-loadbalancer才能实现服务名解析和负载均衡,缺少该依赖时,RestTemplate会直接把服务名当做普通域名发起DNS解析,自然会抛出No such host is known错误。
修复步骤
- 步骤1:调用方引入负载均衡依赖
在调用方(pluralsight-tollrate-billboard)项目的依赖管理文件中添加Spring Cloud LoadBalancer依赖:
Maven配置(pom.xml):
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> <!-- 版本与你项目使用的Spring Cloud主版本保持一致即可 --> </dependency>
Gradle配置(build.gradle):
implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer'
- 步骤2:检查负载均衡开关配置
确认调用方配置文件中不存在以下配置,如果存在请删除或设为true:
# 该配置会关闭负载均衡自动配置 # spring.cloud.loadbalancer.enabled=false
- 步骤3:无侵入验证服务发现状态
无需额外编写查询接口,直接在调用方启动类实现CommandLineRunner接口,启动时自动打印已发现的服务列表:
@SpringBootApplication @EnableEurekaClient @EnableDiscoveryClient public class PluralsightEurekaTollrateBillboardApplication implements CommandLineRunner { @Autowired private DiscoveryClient discoveryClient; public static void main(String[] args) { SpringApplication.run(PluralsightEurekaTollrateBillboardApplication.class, args); } @Override public void run(String... args) throws Exception { // 打印所有已发现的服务名 System.out.println("已发现服务列表:" + discoveryClient.getServices()); // 打印目标服务的实例信息 System.out.println("目标服务实例:" + discoveryClient.getInstances("pluralsight-toll-service")); } }
打印结果包含目标服务实例即可正常调用,若存在注册延迟问题可在调用方配置文件添加以下配置缩短注册表拉取间隔:
# 调整为5秒拉取一次服务注册表,测试环境可使用,生产环境按需调整 eureka.client.registry-fetch-interval-seconds=5
注意事项
调用时使用的服务名必须与下游服务spring.application.name配置完全一致,大小写敏感,避免拼写错误。
内容的提问来源于stack exchange,提问作者Kris Swat
相关产品推荐
相关产品推荐

