Микросервисы - RestTemplate UnknownHostException

У меня есть простая установка с сервером регистрации службы Eureka, службой для общедоступного API и службой, которая вызывается из общедоступного API с помощью 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, 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

Благодарность


person KenavR    schedule 11.05.2016    source источник
comment
Похоже, что вводимый RestTemplate не является сбалансированным по нагрузке. Поскольку вы используете в своем проекте Spring Cloud Angel.SR6, он должен автоматически добавить балансировку нагрузки. Единственное предложение, которое я могу придумать, - это аннотировать ваш RestTemplate с помощью @LoadBalanced и посмотреть, имеет ли это значение.   -  person Patrick Grimard    schedule 11.05.2016
comment
Я пробовал это в прошлом, и теперь снова, к сожалению, ошибка остается прежней.   -  person KenavR    schedule 11.05.2016
comment
Вы пробовали Spring Cloud Brixton.RELEASE, он был выпущен сегодня. Просто обратите внимание, что с Brixton вы должны определить свой собственный @LoadBalanced @Bean RestTemplate, потому что Brixton больше не создает его по умолчанию. Тогда вы можете @Autowire это как обычно. Если этого не сделать, вы можете попробовать позвонить в свою службу, указав идентификатор службы в нижнем регистре http://my-service/test.   -  person Patrick Grimard    schedule 11.05.2016
comment
Переключение на Brixton и изменение кода были необходимы, чтобы устранить проблему, спасибо   -  person KenavR    schedule 14.05.2016


Ответы (2)


Как было предложено patrick-grimard, переключение на Brixton и изменение кода были необходимы для устранения проблем. Рабочее решение находится на Github.

Также изменил опубликованный параметр запроса id from на тело запроса, что также изменило способ его добавления в запрос.

Конечная точка службы

@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);
    }
}
person KenavR    schedule 14.05.2016
comment
Не могли бы Вы уточнить? Связано ли это с версией Spring? - person valijon; 08.08.2018
comment
У меня похожая проблема. Моя служба использует RestTemplate для связи с другой службой с myhost.com. Хотя мы ничего не меняли, оно начало выдавать исключение UnknownHostException. ping myhost.com в порядке. - person valijon; 08.08.2018

Просто для тех, кто в будущем может столкнуться с этой проблемой, у меня была точно такая же трассировка стека, но немного другое решение.

Моя проблема не была связана с конфигурацией с точки зрения кодирования. Это было связано с сервером, на котором я запускал код. Я игнорировал тот факт, что он находился в DMZ, в которой нет DNS, поэтому вам нужно вручную сопоставить домен с IP-адресом.

Более или менее убедитесь, что ваш DNS правильно настроен на вашем сервере, потому что, с точки зрения restTemplate, он будет генерировать именно эту трассировку стека.

person Brent Thoenen    schedule 19.11.2019