我有一个简单的设置,包括Eureka服务注册服务器,公共API服务和使用RestTemplate从公共API调用的服务。 Eureka告诉我服务已成功注册,但是当我调用服务时
@Service
public class MyServiceService {
@Autowired
private RestTemplate restTemplate;
private final String serviceUrl;
public MyServiceService() {
this.serviceUrl = "http://MY-SERVICE";
}
public Map<String, String> getTest() {
Map<String, String> vars = new HashMap<>();
vars.put("id", "1");
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
return restTemplate.postForObject(serviceUrl+"/test", "", Map.class, vars);
}
}
我收到以下异常
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed;
nested exception is org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://MY-SERVICE/test": MY-SERVICE;
nested exception is java.net.UnknownHostException: MY-SERVICE] with root cause java.net.UnknownHostException: MY-SERVICE
我创建了一个示例项目来说明我的设置,也许有人可以看看它并告诉我我的设置有什么问题。
https://github.com/KenavR/spring-boot-microservices-example
感谢
答案 0 :(得分:5)
根据patrick-grimard的建议,转换到Brixton并更改代码需要修复问题。工作解决方案在Github。
还将已发布的id
从请求参数更改为请求正文,这也改变了我将其添加到请求的方式。
服务端点
@RequestMapping(method = RequestMethod.POST, produces = "application/json; charset=utf-8")
public @ResponseBody Map<String, String> getTest(@RequestBody Map<String, Long> params) {
Map<String, String> response = new HashMap<>();
response.put("name", "My Service");
return response;
}
RestTemplate创建
@Configuration
public class PublicAPIConfiguration {
@LoadBalanced
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
}
致电服务
@Service
public class MyServiceService {
@Autowired
private RestTemplate restTemplate;
private final String serviceUrl;
public MyServiceService() {
this.serviceUrl = "http://my-service";
}
public Map<String, String> getTest() {
Map<String, Long> vars = new HashMap<>();
vars.put("id", 1L);
return restTemplate.postForObject(serviceUrl+"/test", vars, Map.class);
}
}
答案 1 :(得分:1)
对于将来也可能碰到此问题的任何人,我都具有完全相同的堆栈跟踪,但是对于解决方案而言则略有不同。
从编码的角度来看,我的问题与配置无关。这与我在其上运行代码的服务器有关。我忽略了它在没有DNS的DMZ上的事实,因此您必须手动将域映射到IP。
或多或少,请确保在服务器上正确配置了DNS,因为从restTemplate的角度来看,它将抛出此确切的堆栈跟踪。