微服务 \- RestTemplate UnknownHostException

新手上路,请多包涵

我有一个简单的设置,包括一个 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

谢谢

原文由 KenavR 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

正如 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;
}

Rest模板创建

@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);
    }
}

原文由 KenavR 发布,翻译遵循 CC BY-SA 3.0 许可协议

对于将来也可能碰巧遇到此问题的任何人,我有完全相同的堆栈跟踪,但解决方案略有不同。

从编码的角度来看,我的问题与配置无关。它与我运行代码的服务器有关。我忽略了它位于没有 DNS 的 DMZ 上的事实,因此您必须手动将域映射到 IP。

或多或少,请确保您的 DNS 在您的服务器上正确配置,因为从 restTemplate 的角度来看,它会抛出这个确切的堆栈跟踪。

原文由 Brent Thoenen 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题