Spring Cloud с Consul для высокой доступности

У меня есть установка, в которой я развертываю приложение spring-cloud-consul из оверлейной сети docker swarm. В моей оверлейной сети я создал изображения консула на каждом узле. Когда я запускаю приложение spring-cloud-consul, я должен указать имя хоста агента консула, с которым он должен разговаривать, например «обнаружение», чтобы он мог рекламировать себя и запрашивать обнаружение услуг. Проблема здесь в том, что каждый контейнер затем запрашивает одного и того же консула. Когда я удаляю этого конкретного агента консула, кажется, что Ribbon DiscoveryClient полагается на свой собственный кеш, а не на один из других узлов консула.

Каков правильный способ запуска приложения микросервиса с использованием spring-cloud-consul и consul, чтобы они не зависели от одного фиксированного агента консула?

Решения, которые я задумал попробовать:

  1. Наличие нескольких файлов компоновки, в которых указаны разные агенты консула.
  2. Каким-то образом образ докера идентифицирует узел, на котором он находится, а затем настраивает себя на использование агента консула, локального для этого узла. (Пока не знаю, как это сделать.)
  3. Упакуйте агента консула с приложением spring -boot.

Спасибо за помощь.


person Mimyck    schedule 25.04.2016    source источник
comment
Из consul.io/docs/agent/basics.html Агент должен работать на каждом узле, который является частью кластера Consul. IMO, запускающий агент на каждом узле, запускает агент в каждом контейнере докеров.   -  person spencergibb    schedule 25.04.2016
comment
Это был бы вариант 3. Но я чувствую, что это своего рода нарушение инкапсуляции микросервисов. Это также усложняет упаковку этих изображений, так как это потребует расширения образа консула, чтобы обеспечить выполнение требований java для Spring, а затем запустить обе службы. Тем не менее, он обеспечивает высочайшую надежность, поскольку при выходе из строя данного агента консула происходит сбой только одного экземпляра.   -  person Mimyck    schedule 25.04.2016
comment
Что означает инкапсуляция микросервисов? Consul - это один двоичный файл.   -  person spencergibb    schedule 25.04.2016
comment
Под инкапсуляцией здесь я имею в виду наличие двух служб, работающих в одном контейнере. В этом случае и консул, и исполняемый файл java spring. Однако в этом случае агент консула предоставляет услуги только приложению java spring, так что, возможно, это не проблема. Я собираюсь протестировать этот подход, в котором consul и исполняемый файл java помещаются в один контейнер. Спасибо.   -  person Mimyck    schedule 25.04.2016
comment
Думаю, я не уверен, почему нельзя иметь оба процесса в контейнере.   -  person spencergibb    schedule 26.04.2016
comment
@Bryan, какой-то источник в сети (извините за то, что сейчас ленив, чтобы искать) подчеркнул, что не следует зацикливаться на одном процессе, одной идее контейнера. Скорее посмотрите на функциональность, которую в конечном итоге раскрывает контейнер - она ​​должна быть сосредоточена на одном домене. Если вам нужна поддержка, обрабатываемая за этим в том же контейнере - и что?   -  person demaniak    schedule 26.05.2016
comment
У меня связанная проблема - мой консул-кластер не может связаться со службами для проверки работоспособности. Я считаю, что столкнулся с неправильной проблемой сетевого адаптера - у любого тела есть быстрый указатель, чтобы обойти это? или я должен создать новую проблему SO?   -  person demaniak    schedule 26.05.2016


Ответы (1)


Агент консула должен работать на каждом узле кластера. Нет необходимости запускать агент консула внутри каждого контейнера докеров, только на каждом узле. У вас есть выбор: установить агент консула на каждом узле или запустить агент консула в контейнере докера на каждом узле.

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

Подробнее о запуске агента консула в клиентском режиме в контейнере докеров см. https://hub.docker.com/_/consul/ и выполните поиск по запросу «Запуск агента Consul в клиентском режиме». Это определяет контейнер агента с помощью --net = host network, поэтому агент ведет себя так, как будто он установлен изначально, когда он фактически находится в контейнере докера.

person dlaidlaw    schedule 29.06.2016