调用db-service时遇java.net.UnknownHostException异常求助
解决Eureka服务调用时的
java.net.UnknownHostException: db-service异常 你遇到的这个问题核心原因很明确——你的RestTemplate没有开启服务发现与负载均衡能力,我来给你详细拆解:
问题根源
当你用http://db-service/rest/db/xxx这种服务名格式调用Eureka注册的服务时,原生的RestTemplate并不认识这个服务名,它会把db-service当成普通域名去DNS解析,自然就会抛出未知主机的异常。
而直接用http://localhost:8300/rest/db/xxx能成功,是因为你直接指定了服务的具体IP和端口,跳过了服务名解析的步骤。
正确解决方案
你其实已经写出了正确的配置,只需要确保给RestTemplate的Bean加上@LoadBalanced注解,让它具备服务名解析能力:
@Configuration public class Config { @Bean @LoadBalanced // 关键注解:开启负载均衡与Eureka服务名解析 public RestTemplate restTemplate() { return new RestTemplate(); } }
之后在业务代码中正常注入这个RestTemplate,用服务名调用就可以正常工作了:
@Autowired RestTemplate restTemplate; ResponseEntity<List<String>> quoteResponse = restTemplate.exchange( "http://db-service/rest/db/" + userName, HttpMethod.GET, null, new ParameterizedTypeReference<List<String>>() {} );
原理补充
加上@LoadBalanced注解后,Spring Cloud会自动给RestTemplate添加一个拦截器。这个拦截器会在请求发送前,从Eureka注册中心获取db-service对应的所有服务实例信息,把服务名替换成具体的IP+端口,同时还能自动实现多实例的负载均衡。
内容的提问来源于stack exchange,提问作者Prakash
相关产品推荐
相关产品推荐

