近期开始使用spring cloud开发项目,发现一个问题,追查了很久才找到原因,记录一下同时希望能对遇到同样问题的人有些帮助。
异常提示:
org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://xxxx-server/user/login": xxxx-server: 未知的名称或服务; nested exception is java.net.UnknownHostException: xxxx-server: 未知的名称或服务 |
问题场景:
部署环境:N个服务提供者、1个注册中心、1个网关(Zuul)、N个手机端。容器外部署网关后,网关通过服务ID负载均衡请求服务实例(从注册中心获取服务ID对应实例ip:port)。docker集群环境下运行正常(同一个宿主机),独立部署则报错(centos系统)。 |
排查:
RestTemplate创建时必须添加@LoadBalanced否则无法转换(百度一下原理)。项目源码使用maven管理,基础模块中包含如下:@Bean() @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } 理应能够转换,一定是某个模块中创建了RestTemplate并放入了spring的对象池中。 |
结果:
在一个半废弃的模块中如下代码: @Bean(name = "xxxxTemplate") public RestTemplate restTemplate(RestTemplateBuilder builder) { return builder.build(); } 增加@LoadBalanced注解。 @Bean(name = "xxxxTemplate") @LoadBalanced public RestTemplate restTemplate(RestTemplateBuilder builder) { return builder.build(); } OK,正常。 |