предисловие
В последние годы микросервисная архитектура становится все более популярной в сфере интернет-приложений, внедрение микросервисов в основном решает проблему монолитности приложений.Плотное соединение нескольких модулей,Невозможно масштабироватьиСложность в эксплуатации и обслуживанииИ другие вопросы. Архитектура микросервиса основана наФункциональная гранулярностьПройти бизнес-модульвертикальное разделение, на самом монолитном приложенииОбслуживаниеисоставной, каждый компонент развертывается отдельно какапплет(отDB
прибытьUI
). между микросервисами и микросервисамиService API
взаимодействовать, поддерживаяГоризонтальное расширение,повышение производительностиидоступность услуги, одна служба позволяет одновременно развертывать одну или несколькоЭкземпляр службы. Во время выполнения каждый экземпляр обычно являетсяОблачная виртуальная машинаилиDocker
контейнер.
Как взаимодействовать между экземплярами нескольких сервисов в микросервисной системе? Как воспринимать существование и разрушение друг друга? Как служба-производитель узнает адрес службы-потребителя? Как реализовать разделение службы и реестра? Для этого требуется, чтобы сторонний реестр служб обеспечивал управление регистрацией узлов служб производителей и управление обнаружением узлов служб потребителей.
текст
1. Обнаружение службы и регистрация
1.1. Конкретный процесс
- Реестр услуг: В качестве ядра всей архитектуры для поддержкираспределенный,постоянное хранение,Изменения в регистрационной информацииУведомление потребителей в режиме реального времени.
-
поставщики услуг:служба с
docker
контейнерныйспособ развертывания (реализациясервисный портизДинамическая генерация), может пройтиdocker-compose
способ управлять. пройти черезRegistrator
обнаруженdocker
Обработка информации для завершения обслуживанияавтоматическая регистрация. - потребители услуг: нужно использоватьпоставщики услугПредоставляемые услуги и поставщики услуг часто динамически перемещаются друг к другу.
Относительно полный процесс регистрации и обнаружения службы выглядит следующим образом:
- регистрационная служба: от поставщика услуг к рееструрегистр;
- Подписка на сервис: сервисный потребитель для реестраподпискаслужебная информация, для котороймонитор;
- Список служб кэширования:местныйтайникСписок сервисов для уменьшения сетевого взаимодействия с реестром;
- вызов службы:ПервыйнайтиЛокальный кеш, если не можете найти, идите в центр регистрацииВытащитьадрес службы, а затем отправить запрос на обслуживание;
- Уведомление об изменении: сервисный узелизменятьВремя (новый,Удалитьд.), реестр уведомит прослушивающий узел,возобновитьСлужебная информация.
1.2. Связанные компоненты
Система обнаружения сервисов в основном состоит из трех частей:
- регистратор: Регистрируйте / нерегистрируйте службу в соответствии со статусом работы службы. Основная проблема, которая должна быть решена, - это то, когда инициировать действие регистрации / периодации.
- реестр: Сохранение служебной информации. Распространенными решениями являются zookeeper, etcd, cousul и т. д.
- Открытие: Чтение служебной информации из реестра и инкапсуляция интерфейса доступа для пользователя.
1.3. Сторонняя реализация
Для реализации регистрации и обнаружения сторонних сервисов существуют следующие три инструмента:
- zookeeper: Высокопроизводительный, распределенный сервис по координации приложений для обслуживания имен, распределенные блокировки, делится ресурсы и синхронизировать распределенную конфигурацию.
- Etcd: система хранения пар ключ/значение, использующая протокол HTTP, в основном используется для общей конфигурации и обнаружения сервисов, а предоставляемые функции относительно просты по сравнению с Zookeeper и Consul.
- Consul: Распределенное программное обеспечение для обнаружения и обмена конфигурациями с высокой доступностью, которое поддерживает обнаружение и регистрацию служб, несколько центров обработки данных, проверки работоспособности и распределенное хранилище ключей/значений.
Простое сравнение:
В отличие от Zookeeper и etcd, Consul реализует встроенную в него систему обнаружения сервисов, нет необходимости создавать собственную систему или использовать стороннюю систему, клиентам нужно только регистрировать сервисы и выполнять обнаружение сервисов через интерфейсы DNS или HTTP.
2. Консул и регистратор
2.1. Консул введение
Что такое консул
Consul
этораспределенныйиз,Высокая доступность,Поддержка горизонтального расширенияРегистрация услуг и инструменты обнаружения. Он обычно содержит следующие особенности:
-
обнаружение службы:
Consul
пройти черезDNS
илиHTTP
интерфейсРегистрация службы и обнаружение службыСтановится легко. некоторые внешние службы, такие какsaas
Предоставленные также могут быть зарегистрированы таким же образом; -
медицинское обследование: проверка работоспособности включена
consul
Операция в кластере может быть быстро предупреждена. Интеграция с обнаружением служб предотвращает переадресацию служб неисправным службам; -
хранилище ключей/значений: Один используетсяХранилище динамической конфигурациисистема. обеспечить простой
HTTP
интерфейс, можно работать где угодно; -
Несколько центров обработки данных:служба поддержкиНесколько центров обработки данныхизбегатьединая точка отказаВнутренние и внешние сетевые службы используют разные порты для мониторинга. Однако его развертывание необходимо учитывать задержку сети, фрагментацию и т. Д.
zookeeper
иetcd
Ни один из них не поддерживает функции нескольких центров обработки данных; -
алгоритм консенсуса:использовать
Raft
Алгоритм протокола консенсуса, чемPaxos
Алгоритмы просты в использовании. использоватьGOSSIP
Протокол управляет членством и широковещательными сообщениями, а также поддерживаетACL
Контроль доступа; -
Панель управления услугами: обеспечить
Web UI
услуги, зарегистрированные вмониторинг состояния здоровьяAdmin Page.
Несколько концепций Консула
На картинке нижеConsul
Схема проектирования архитектуры, предоставленная официальным документом:
Фигура содержит дваConsul
дата-центры, каждый дата-центр — этоconsul
кластер. В центре обработки данных 1 видно, чтоconsul
Кластер состоит изN
КусокSERVER
, плюсM
КусокCLIENT
состоит из. будь тоSERVER
все ещеCLIENT
, обаconsul
Узел кластера. Все услуги могут быть зарегистрированы на этих узлах, и именно через эти узлы реализуются совместное использование информации о регистрации услуг. В дополнение к этим двум кратко представлены несколько небольших деталей.
- CLIENT
CLIENT
выражатьconsul
изclient
режим, то естьклиентский режим. даconsul
Режим узла, в этом режиме все службы, зарегистрированные на текущем узле, будутВпередприбытьSERVER
узел, самНе стойкийэти сообщения.
- SERVER
SERVER
выражатьconsul
изserver
режим, указывающий, что этоconsul
Являетсяserver
узел. В этом режиме функции иCLIENT
Все равно, разница только в том, что он берет всю информациюУпорствоместный. Таким образом, в случае сбоя информация может быть сохранена.
- SERVER-LEADER
среднийSERVER
Ниже приведеныLEADER
Описание, указывающее на этоSERVER
Нод - их босс. И другиеSERVER
Разница в том, что он должен быть ответственнымСинхронизировать регистрационную информациюдать другимSERVER
, но и отвечает закаждый узелизМониторинг здоровья.
- Другая информация
Другая информация включаетспособ общения,инекоторая информация о протоколе,алгоритм. Они используются для гарантиисинхронизация данных,требования в режиме реального времениПодождите, пока будет решен ряд проблем с кластером. Кому интересно, посмотрите официальную документацию.
2.2. Знакомство с регистратором
Что такое регистратор
Registrator
не зависит от реестра услугКомпонент автоматической регистрации/отмены регистрации услуг, обычно сDocker container
способ развертывания.Registrator
автоматически определит, где он находитсяхозяинвсе включеноDocker
Состояние контейнера (включить/уничтожить) и в соответствии с состоянием контейнера на соответствующийСписок регистрации службыРегистрация/отмена регистрации услуг.
По факту,Registrator
Читая другие контейнеры на том же хостеContainer
изпеременная средыпровестирегистрация службы,Определение проверки работоспособностии так далее.
Registrator
служба поддержкиПодключаемыйизсервисный реестрконфигурация, поддерживаемая в настоящее время, включаетConsul
, etcd
иSkyDNS 2
Три инструмента регистрации.
2.3 Докер устанавливает кластер Consul
2.3.1 Планирование узла кластера
Мой местный используетUbuntu16.04
Виртуальная машина:
имя контейнера | IP-адрес контейнера | номер порта карты | IP-адрес хоста | сервисный режим |
---|---|---|---|---|
node1 | 172.17.0.2 | 8500 -> 8500 | 192.168.127.128 | Server Master |
node2 | 172.17.0.3 | 9500 -> 8500 | 192.168.127.128 | Server |
node3 | 172.17.0.4 | 10500 -> 8500 | 192.168.127.128 | Server |
node4 | 172.17.0.5 | 11500 -> 8500 | 192.168.127.128 | Client |
2.3.2 Установка кластера Consul
Consul
Параметр конфигурации Информация Описание:
список параметров | Значение параметров и описание сценариев использования |
---|---|
advertise | Адрес представления уведомления используется для изменения адреса, который мы представляем другим узлам в кластере.В общем, адрес -bind является адресом представления. |
bootstrap | Он используется для управления тем, находится ли сервер в режиме начальной загрузки.В центре обработки данных только один сервер может находиться в режиме начальной загрузки.Когда сервер находится в режиме начальной загрузки, он может выбрать себя в качестве лидера плота. |
bootstrap-expect | Ожидаемое количество серверных узлов в центре обработки данных. Если указано это значение, Consul не будет загружать весь кластер до тех пор, пока не будет достигнуто указанное количество серверов. Этот флаг нельзя использовать совместно с начальной загрузкой. |
bind | Этот адрес используется для связи IP-адресов в кластере, все узлы к адресу в кластере должны быть до 0,0.0,0. |
client | В котором адрес клиента является обязательным, этот адрес предоставляет такие службы, как HTTP, DNS, RPC, который по умолчанию равен 127.0.0.1. |
config-file | Явно указать, какой файл конфигурации загрузить |
config-dir | Каталог файлов конфигурации, все файлы, заканчивающиеся на .json, будут загружены |
data-dir | Укажите каталог для хранения состояния агента. Этот каталог требуется для всех разрешений агента. Каталог должен быть стабильным и продолжать существовать после перезапуска системы. |
dc | Этот тег управляет именем центра обработки данных, разрешенным агентом, по умолчанию — dc1. |
encrypt | Укажите секретный ключ для шифрования consul во время связи. Ключ может быть сгенерирован consul keygen. Узлы в одном кластере должны использовать один и тот же ключ. |
join | Добавьте IP-адрес уже запущенного агента, и вы можете указать адреса нескольких агентов несколько раз. Если консул не может быть добавлен ни на один указанный адрес, агент не запустится.По умолчанию агент не присоединится ни к одному узлу при запуске. |
retry-interval | Интервал времени между двумя присоединениями, по умолчанию 30-е годы |
retry-max | Количество попыток повторить соединение, по умолчанию 0, что означает бесконечное количество попыток. |
log-level | Уровень информации журнала, отображаемой после запуска агента-консула. По умолчанию это информация, необязательно: трассировка, отладка, информация, предупреждение, ошибка |
node | Имя узла в кластере должно быть уникальным в кластере, по умолчанию используется имя узла узла. |
protocol | Версия протокола, используемая консулом |
rejoin | Заставить консула игнорировать предыдущие отправления и по-прежнему пытаться присоединиться к кластеру после перезапуска |
server | Определите, чтобы агент работал в режиме сервера, а в каждом кластере был хотя бы один сервер.Рекомендуется, чтобы количество серверов в каждом кластере не превышало 5. |
syslog | Включите функцию системного журнала, она действует только на linux/osx |
pid-file | Укажите путь для хранения файла pid, который можно использовать для агента SIGINT/SIGHUP (закрыть/обновить). |
2.4. Docker устанавливает кластер Consul
2.4.1. Вытащите официальное изображение консула
madison@ubuntu:~$ docker pull consul:latest
2.4.2 Запустите узел Сервер
бегатьconsul
зеркало, началоServer Master
узелnode1
:
node1:
madison@ubuntu:~$ docker run -d --name=node1 --restart=always \
-e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
-p 8300:8300 \
-p 8301:8301 \
-p 8301:8301/udp \
-p 8302:8302/udp \
-p 8302:8302 \
-p 8400:8400 \
-p 8500:8500 \
-p 8600:8600 \
-h node1 \
consul agent -server -bind=172.17.0.2 -bootstrap-expect=3 -node=node1 \
-data-dir=/tmp/data-dir -client 0.0.0.0 -ui
Проверятьnode1
log для отслеживания операции:
В настоящее время в кластере нет выборовleader
Узел, продолжайте запускать два другихServer
узелnode2
иnode3
:
node2:
madison@ubuntu:~$ docker run -d --name=node2 --restart=always \
-e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
-p 9300:8300 \
-p 9301:8301 \
-p 9301:8301/udp \
-p 9302:8302/udp \
-p 9302:8302 \
-p 9400:8400 \
-p 9500:8500 \
-p 9600:8600 \
-h node2 \
consul agent -server -bind=172.17.0.3 \
-join=192.168.127.128 -node-id=$(uuidgen | awk '{print tolower($0)}') \
-node=node2 \
-data-dir=/tmp/data-dir -client 0.0.0.0 -ui
Проверятьnode2
Журнал запуска процесса узла:
node3:
madison@ubuntu:~$ docker run -d --name=node3 --restart=always \
-e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
-p 10300:8300 \
-p 10301:8301 \
-p 10301:8301/udp \
-p 10302:8302/udp \
-p 10302:8302 \
-p 10400:8400 \
-p 10500:8500 \
-p 10600:8600 \
-h node2 \
consul agent -server -bind=172.17.0.4 \
-join=192.168.127.128 -node-id=$(uuidgen | awk '{print tolower($0)}') \
-node=node3 \
-data-dir=/tmp/data-dir -client 0.0.0.0 -ui
Проверятьnode3
Журнал запуска процесса узла:
когда 3Server
Когда узлы запущены и работают нормально, наблюдайтеnode2
иnode3
Журнал процесса можно найтиnode1
избран какleader
узел, а этоДата центризServer Master
.
Проверьте еще разnode1
Журнал запуска процесса узла:
Журналы наблюдений найденыnode2
иnode3
успешно присоединилсяnode1
в центре обработки данныхdc1
. Когда в кластере 3 единицыConsul Server
При запускеnode1
избран какdc1
Первичный узел в. Потом,node1
Он будет постоянно проверять пульсацию.node2
иnode3
Сделайте проверку здоровья.
2.4.4. Запустите клиентский узел
node4:
madison@ubuntu:~$ docker run -d --name=node4 --restart=always \
-e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' \
-p 11300:8300 \
-p 11301:8301 \
-p 11301:8301/udp \
-p 11302:8302/udp \
-p 11302:8302 \
-p 11400:8400 \
-p 11500:8500 \
-p 11600:8600 \
-h node4 \
consul agent -bind=172.17.0.5 -retry-join=192.168.127.128 \
-node-id=$(uuidgen | awk '{print tolower($0)}') \
-node=node4 -client 0.0.0.0 -ui
Проверятьnode4
Журнал запуска процесса узла:
Его можно найти:node4
даClient
режим активирован. После завершения запуска поместитеdc1
в центре обработки данныхServer
режим запущенного узлаnode1
,node2
иnode3
добавляются кЛокальный список кешсередина.当客户端向node4
После инициирования запроса на обнаружение службыnode4
пройдетRPC
перенаправить запрос наServer
Один из узлов выполняет обработку.
2.4.5 Просмотр состояния кластера
madison@ubuntu:~$ docker exec -t node1 consul members
dc1
4 узла в дата-центреnode1
, node2
, node3
иnode4
Успешно стартовал,Status
указать свой статус, обаalive
.node1
, node2
, node3
отServer
режим запускается, покаnode4
отClient
запускается режим.
2.5 Регистратор установки Docker
2.5.1. Получение образа регистратора
madison@ubuntu:~$ docker pull gliderlabs/registrator:latest
2.5.2. Запустите узел Регистратора
madison@ubuntu:~$ docker run -d --name=registrator \
-v /var/run/docker.sock:/tmp/docker.sock \
--net=host \
gliderlabs/registrator -ip="192.168.127.128" consul://192.168.127.128:8500
--net, указанный как хост, указывает на использование режима хоста. -ip используется для указания IP-адреса хоста и коммуникационного адреса, используемого для проверки работоспособности. consul://192.168.127.128:8500: используйте Consul в качестве реестра службы и укажите конкретный адрес связи Consul для регистрации и отмены регистрации службы (Примечание: 8500 — это порт связи HTTP, предоставляемый Consul).
ПроверятьRegistrator
Журнал запуска процесса контейнера:
Registrator
В процессе запуска выполняются следующие шаги:
- Просмотреть лидер Центра данного узла Консул, как реестр услуг;
- Синхронизируйте включенные контейнеры текущего хоста и все служебные порты;
- Зарегистрируйте адрес/порт сервиса, публикуемый каждым контейнером, в список регистрации сервисов Consul.
2.5.3 Просмотр статуса регистрации Консула
Consul
предоставилWeb UI
визуализироватьСписок регистрации службы,узел связи,Дата центрихранилище ключей/значенийи т. д., прямой доступ к хосту8500
порт.
Список регистрации службы:
NODES
установлен на узлеdc1
все в дата-центреConsul
узлов, в том числеConsul Server
иClient
.
Список узлов связи:
запускатьRegistrator
В будущем все контейнеры на узле регистрируют службу наConsul
изSERVICES
На, тест сделан!
Суммировать
единый дата-центризConsul
Строительство кластера завершено! ! ! В следующих главах я объясню, как использоватьRegistrator
регистрация службымаркировка. затем пройтиdocker
развертыватьнесколько экземпляровизWeb
Базовый контейнерHTTP
изRESTful Service
и на основеTCP
изRPC Service
изрегистрация службыиОпределение проверки работоспособности, и продемонстрируйте, какЭтикеткаИдентифицирует несколько экземпляров службы.
Добро пожаловать в технический публичный аккаунт: Zero One Technology Stack
Эта учетная запись будет продолжать делиться сухими товарами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.