Можно ли определить статический список серверов с лентой (с помощью симуляции), когда используется Eureka? - PullRequest
0 голосов
/ 29 мая 2018

Среда

  • Spring Boot 1.5.13.RELEASE
  • Spring Cloud Edgware.SR3
  • Java 8

Конфигурация

  • Клиент Eureka включен и работает правильно (я проверил и все работает, как я ожидаю).

Некоторые соответствующие свойства из моей конфигурации:

feign.hystrix.enabled=true
eureka.client.fetch-registry=true
spring.cloud.service-registry.auto-registration.enabled=true
service1.ribbon.listOfServers=https://www.google.com

Контекст

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

Вопрос

В качестве окончательной услуги я попытался добавить service1.ribbon.listOfServers=https://www.google.com к application.properties, однако в этом случаеследующая ошибка во время выполнения при вызове симулированного клиента:

Servlet.service () для сервлета [dispatcherServlet] в контексте с путем [] вызвала исключение [Ошибка обработки запроса;Вложенное исключение - com.netflix.hystrix.exception.HystrixRuntimeException: Service1Client # test () не выполнен и откат недоступен.] с первопричиной priceing_1 |цена_1 |com.netflix.client.ClientException: у балансировщика нагрузки нет доступного сервера для клиента: service1 pricing_1 |at com.netflix.loadbalancer.LoadBalancerContext.getServerFromLoadBalancer (LoadBalancerContext.java:483) ~ [ribbon-loadbalancer-2.2.5.jar! /: 2.2.5]

Мой клиент настроен следующим образом:

@FeignClient("service1")
public interface Service1Client {

    @GetMapping(value = "/")
    String test();

}

Заранее благодарим за любые советы.

Рассмотрение

Поскольку дух Ribbon, как я понимаю, заключается в том, чтобы действовать в качестве балансировщика нагрузки на стороне клиента и учитываяв моем случае нет ничего для балансировки нагрузки (у меня есть одно фиксированное статическое имя хоста, которое возвращает одну запись A в DNS).Лента на самом деле кажется ненужным компонентом - я действительно хотел клиента Feign, поскольку мне нравится тот факт, что он абстрагирует HTTP-запрос более низкого уровня и разделение объектов.Поэтому я полагаю, что альтернативный дополнительный вопрос заключается в том, могу ли я использовать симуляцию без ленты - похоже, что из коробки можно использовать ленту - даже Javadoc аннотации @FeignClient говорит:

Если лента доступна, она будет использоваться для балансировки нагрузки внутренних запросов, а балансировщик нагрузки может быть настроен с использованием @RibbonClient с тем же именем (то есть значением), что и для симулированного клиента.

Предполагая, что оба они тесно связаны, даже если они служат разным целям.

1 Ответ

0 голосов
/ 29 мая 2018

Как вы упомянули, есть два способа решения вашей проблемы.

Использовать Feign без ленты Если вы зададите атрибут url в аннотации @FeignClient, он будет работать без лентыкак ниже.

@FeignClient(name = "service1", url = http://www.google.com)
public interface Service1Client {
    @GetMapping(value = "/")
    String test();
}

В этом случае два других клиента Feign будут по-прежнему работать с Ribbon и Eureka.

Использовать Feign с лентой и без Eureka

То, что вам не хватает, находится в вашей конфигурации NIWSServerListClassName.Его значение по умолчанию com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList, и оно будет использовать Eureka для получения списка серверов.Если вы установите NIWSServerListClassName на ConfigurationBasedServerList для ленточного клиента (симулированного клиента), только этот клиент будет работать со списком listOfServers без извлечения списка серверов из Eureka.И другие симулированные клиенты будут по-прежнему работать с Eureka.

service1:
  ribbon:
    NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
    listOfServers: http://www.google.com
...