2016-07-20 8 views
1

У меня в настоящее время проблема при использовании Netflix Eureka и Zuul в среде Spring Cloud с использованием Docker.Весеннее облако с Zuul и Eureka не может обрабатывать экземпляры сервисов, идущих вниз

Моя текущая настройка выглядит следующим образом: 3 Docker контейнеры:

  • сервер Eureka
  • Zuul сервер, который использует Eureka на карте маршрутов к услугам и балансировка нагрузки между несколькими контейнерами той же службы.
  • сервис (в настоящее время только возвращение простой строки)

Эта установка работает нормально, но проблемы начинаются тогда, когда я начинаю играть с масштабированием службы. Когда я увеличиваю масштаб, Zuul забирает новые серверы через 30 секунд. Это прекрасно. Однако, когда я снимаю контейнеры для сервисов, вызовы Zuul могут завершиться неудачно (с кодом ошибки HTTP 200!), Поскольку Zuul все еще думает, что серверы находятся в активном пуле.

Я использую Spring бутсу 1.3.6 и Spring Cloud 1.1.2

Мои вопросы:

  • Может Zuul быть настроен для повтора вызовов?
  • Есть ли способ заставить Зуула выполнить пинг на всех серверах с помощью вызова REST? Насколько я могу судить, для этого нет конечной точки Spring Cloud. Проводка в/маршруты не делает то, что я хочу.
  • Если это невозможно, может ли Zuul быть настроен на отправку чего-то еще, кроме 200, когда сервер не отвечает вовремя?
+0

Пара вопросов ... Что именно вы средние вызовы Zuul не с кодом ошибки 200? Можете ли вы предоставить пример ответа? Также, когда вы добавляете экземпляры вверх/вниз, для Zuul (или других клиентов Eureka) потребуется некоторое время, так как клиентам нужно будет обновлять данные с сервера Eureka. Неужели Зууль в конечном итоге выясняет, что примеры больше не обновляются после того, как он обновляет данные от Eureka? –

+0

Когда я снимаю контейнеры, звонки в Zuul, которые перенаправляются на сервер, которые теперь недоступны, возвращают пустую страницу с кодом ответа HTTP 200.Таким образом, клиент не может знать, что ему может потребоваться повторить попытку. Я бы ожидал 504 или 503. Zuul действительно выясняет после интервала ping (что составляет 30 секунд), что некоторые серверы больше недоступны и удаляют их из LB. Но за эти 30 секунд вызовы возвращают пустые страницы, что не имеет смысла. –

+0

На стороне примечания, Eureka знает, когда сервер удален из регистра, поэтому мне интересно, есть ли способ связать это событие с Zuul, чтобы, если сервер не зарегистрирован, Zuul получает сигнал, что ему нужно обновить его список серверов. Это не проблема, если новые серверы не доступны сразу в LB, но это проблема, если вы уменьшаете основные сервисы, и для LB требуется 30 секунд, особенно если есть система, которая это знает (Эврика). –

ответ

0

Вам не нужно сообщать zuul об изменении в списке серверов, как это делается под ним. Реальная проблема здесь в том, что эврика решает сохранить эти экземпляры в своем реестре. Существует правило: если менее 85% услуг отвечают на проверку работоспособности, то eureka думает об этом из-за сбоя/раздела сети и сохраняет все службы в реестре. Это очень вероятно, если вы, например, имеете только 3 экземпляра вашего сервиса. Как вы можете себе представить, если вы отключите (33,3% из всех трех экземпляров), eureka проигнорирует его и все еще будет обслуживать этот экземпляр для клиентов.

Это может быть приятной особенностью, если у вас есть 100 серверов :). Инструмент netflix, созданный в основном для их нужд.

Вы можете попробовать переключить самосохранение от:

eureka.server.enable-self-preservation=false 

или настроить порог в какой-то более низкое значение:

eureka.server.renewal-percent-threshold=0.85 

http://cloud.spring.io/spring-cloud-static/spring-cloud.html#_appendix_compendium_of_configuration_properties