Spring Cloud: отсутствует экземпляр сервера с использованием ленты и клиента Feign (но не Eureka)

Я впервые пытаюсь использовать @FeignClient в простом клиентском тестовом приложении REST. Я хочу использовать Ribbon для балансировки нагрузки между двумя экземплярами сервера, но не использовать Eureka. Следуя документации, я настроил свой application.yml со свойством listOfServers и отключил Eureka. Имя моего клиента совпадает с именем префикса YAML для свойств ribbon.

application.yml:

ds:
  ribbon:
    listOfServers: server1:18201,server2:18201

Код клиента:

@FeignClient("ds")
public interface DataServicesClient {
  @RequestMapping(method = RequestMethod.GET, value = "/context-path/customers")
  List<Customers> getCustomers();
}

Когда я вызываю приложение, я вижу, что лента принимает listOfServers:

2016-03-07 12:15:17.275  INFO 39948 --- [nio-8081-exec-1] 
    c.n.l.DynamicServerListLoadBalancer      : DynamicServerListLoadBalancer for client ds 
    initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=ds,current list of 
    Servers=[server1:18201, server2:18201]

Однако затем клиент выполняет вызов, используя только значение аннотации @RequestMapping без префикса сервера, и, очевидно, терпит неудачу.

2016-03-07 12:15:21.394 ERROR 39948 --- [nio-8081-exec-1] o.a.c.c.C.[.[.[/].
    [dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context 
    with path [] threw exception [Request processing failed; nested exception is 
    feign.RetryableException: Unexpected end of file from server executing GET 
    http://context-path/customers] with root cause
java.net.SocketException: Unexpected end of file from server
at sun.net.www.http.HttpClient.parseHTTPHeader(Unknown Source)

Я ожидал, что он будет внедрять каждый сервер по очереди (http:{server instance}/context-path/customers), поэтому я, очевидно, что-то здесь упустил.

Кто-нибудь может указать мне правильное направление?

Спасибо,

Роб.


person RobP    schedule 07.03.2016    source источник
comment
Меня устраивает. Можете ли вы поделиться простым примером проекта?   -  person Dave Syer    schedule 07.03.2016
comment
Спасибо, Дэйв. Похоже, я ожидал слишком многого от аннотации / автоматического подключения. Я решил проблему, создав своего клиента через Feign.builder () вместо автоматического подключения экземпляра @FeignClient, а затем сказав строителю использовать RibbonClient, то есть: 'DataServicesClient api = Feign.builder (). Contract (новый SpringMvcContract ()). client (новый RibbonClient ()). target (DataServicesClient.class, ds) '   -  person RobP    schedule 07.03.2016
comment
Хорошо, но тебе не следует этого делать. @EnableFeignClients сделает именно это за вас.   -  person Dave Syer    schedule 07.03.2016
comment
Хм, ладно, это было бы лучше, поскольку изменение было бы менее инвазивным. Тогда позвольте мне продезинфицировать и поделиться своим примером проекта.   -  person RobP    schedule 07.03.2016


Ответы (1)


Получается, что проблема заключалась в том, что я пытался получить доступ к защищенному ресурсу, но не добавил префиксу https к моему воображаемому клиенту.

@FeignClient("https://ds")

Я могу быть несколько наивным, но я не обнаружил, что ошибка действительно объясняет проблему:

java.net.SocketException: Unexpected end of file from server

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

В любом случае, проблема теперь решена, и она работает только с аннотацией @EnableFeignClients, Feign.builder() не требуется.

Спасибо за поддержку @Dave Syer

person RobP    schedule 08.03.2016