предисловие
Предыдущая статьяИспользованиеConsulиRegistratorсуществуетdockerпостроен в контейнерной средеРегистрация и обнаружение службыкластер. На основе обнаружения и регистрации служб в этой статье будут представленыNginxобратный прокси-сервер иConsul-templateкомпонент, который реализует динамическийБалансировка нагрузки службы.
текст
1. Введение в инструмент
1.1. Nginx
высокая производительностьHTTPиобратный прокси-сервер, используемый для трафика внешнего доступа к внутреннему серверу приложенийбалансировки нагрузкиизапрос на переадресацию.
1.2. Consul-template
Consul-templateдаHashiCorpна основеConsulРасширяемые инструменты, предоставляемые прослушиваниемConsulсерединаизменение данных, динамически изменять некоторыеконфигурационный файлсерединашаблон. обычно используется вNginx,HAProxyДинамически настраивайте сведения о обратном прокси-сервере клиента в работоспособном состоянии.
2. Принцип реализации
- пройти через
Nginxсамореализациябалансировки нагрузкиизапрос на переадресацию; - пройти через
Consul-templateизconfigФункция мониторинга в реальном времениConsulузел кластераСлужитьиданныеПеремена; - использование в режиме реального времени
ConsulИнформация об узлезаменятьNginxфайл конфигурациишаблон,иПерезагрузитьконфигурационный файл;
Consul-templateиnginxдолжны быть установлены на той же машине, потому чтоConsul-templateнужно динамически изменятьnginxфайл конфигурацииnginx.conf, затем выполнитеnginx -s reloadкоманда для выполнения обновления маршрутизации для достиженияДинамическая балансировка нагрузкицель.
2.1 Традиционная балансировка нагрузки
Традиционная балансировка нагрузкиClientВизит сестры поддержкиNginx, а затем перенаправляется на серверную частьWeb Server. Если бэкэнд имеетДобавить к/Удалить Web Server, операции и техническое обслуживание должны быть изменены вручнуюnginx.conf,Потомперезагрузить конфигурацию, вы можете динамически регулировать балансировку нагрузки.
2.2. Автоматическая балансировка нагрузки
Давайте посмотрим на балансировку нагрузки на основе автоматического обнаружения и регистрации сервисов.Способ балансировки нагрузки не изменился, но есть и другие.Периферийные компоненты, конечно, эти компонентыClientневидим,clientВсе еще только вижуNginxСпособы входа и доступа не изменились.
NginxПроцесс реализации динамической балансировки нагрузки выглядит следующим образом:
- с тем же
ConsulЭтикеткаправильноWeb Serverпровестизнак обслуживанияиКлассификация,новыйилиУдалитьWeb Serverсерверный узел; -
RegistratorмониторприбытьWeb ServerОбновление статуса, автоматическоеConsulсервисный реестр будет ли эторегистриливыйти; -
Consul-templateподписалсяConsulсервисный реестрслужебное сообщение,получилаConsulpush сообщения, т.е.Web Serverсервисный узелгосударствопроизошли изменения. -
Consul-templateавтоматически изменять изаменятьNginxпод серверnginxв файле конфигурациишаблон,иПерезагрузитьСлужба достигает цели автоматической балансировки нагрузки.
3. Экологичность
3.1 Системная среда
| программное обеспечение | Версия |
|---|---|
| Операционная система | Ubuntu: 16.04 x86_64, ядро: 4.8.0-58-универсальное |
| docker | Docker version 1.12.6, build 78d1802 |
| docker-compose | docker-compose version 1.8.0 |
3.2 Планирование узла
| IP хоста | компоненты |
|---|---|
| 192.168.1.181 | Consul Server, Registrator, Nginx, Consul-template |
| 192.168.1.186 | Consul Server, Registrator, Nginx, Consul-template |
| 192.168.1.182 | Consul Client, Registrator, Client WebApp1, Server WebApp1, Server WebApp2 |
| 192.168.1.183 | Consul Client, Registrator, Client WebApp2, Server WebApp3, Server WebApp4 |
| 192.168.1.185 | Consul Client, Registrator, Client WebApp3, Server WebApp5, Server WebApp6 |
-
Client WebApp: Обеспечивает на основе
ThriftизRPCклиент и на основеHttpпротоколRESTfulклиент для доступаServerпрограмма. -
Server WebApp: Обеспечивает на основе
ThriftизRPCсервер и основанныйHttpпротоколRESTfulсервер, дляClientвызов программы.
3 хоста здесь -192.168.1.182,192.168.1.183и192.168.1.185, разверните два на хостClient WebAppконтейнер иClient Serverконтейнер, для издевательствсервисный уровеньбалансировки нагрузки.
3.3. Сборка образа
- Consul:консул: последний
- Registrator:gliderlabs/регистратор:последний
- NginxиConsul-template:либералман/nginx-консул-шаблон: последний
- Client WebApp: тестовый клиент: последний
- Server WebApp: тестовый сервер: последний
Давайте поговорим об этом здесьtest-clientиtest-serverЗеркальная сборка из:
- Клонируйте проект в локальную среду проекта:GitHub.com/O — арендатор/билеты…
- переключиться на подмодуль
spring-cloud-starter-thrift-examplesвнизtestкаталог, выполнить командуmvn clean packageУпакуйте программу. - соответственно
test-clientиtest-serverпроектКорневая директориявнизDockerfileдокументы иtargetв каталогеtarget/*.jarПрограмма копирования в192.168.1.182,192.168.1.183и192.168.1.185Под содержанием. - Входитьклиент
Dockerfileкаталог, даклиентпрограммаtest-clientДля создания образа команда выглядит следующим образом:docker build . -t test-client:latest - ВходитьСервер
Dockerfileкаталог, даСерверпрограммаtest-serverДля создания образа команда выглядит следующим образом:docker build . -t test-server:latest
После завершения сборки проверьте локальную зеркальную библиотеку:
3.4 Модель развертывания
пять хостов, в том числе192.168.1.181и192.168.1.186Основные функции двух хостов следующие:
- в видефорвардер балансировки нагрузки(Это всего лишь демонстрация, вы можете пройти
KeepAlivedвыполнитьNginxизHA), пропускайте трафик внешнего доступа черезалгоритм загрузкиОдин вперед на задний планClient WebApp. - от
Serverзапуск режимаConsulузлы, один из которых служит всемКластер обнаружения и регистрации службизleader, заСинхронизироватьиУпорствоостальные триClientмодальныйConsulузладанныеиинформация о состоянии.
Остальные три хоста -192.168.1.182,192.168.1.183и192.168.1.185, который играет следующие роли:
- Каждый с
Clientразвертывание шаблонаConsulузел длярегистриНаходитьроднойdockerуслуги, предоставляемые контейнером, иConsul Serverизleaderузел дляСинхронизация состояния службы. - начать по одному
Client WebAppэкземпляр контейнера и дваServer WebAppэкземпляр контейнера, будетClient WebAppзапрос в соответствии ссервисный уровеньалгоритм загрузкиВторичная переадресацияприбытьServer WebAppЗавершите конкретную бизнес-обработку на любом из них.
Здесь есть две операции переадресации услуг:
-
Переадресация на уровне доступа:два
NginxСервер отправляет клиентский трафик черезодин ретвитдо трехClient WebAppОбрабатывается любой из экземпляров службы. -
Переадресация на сервисном уровне:три
Client WebAppОдин из экземпляров сервиса, согласноРеестр услугВытащил здоровымСписок кеша службы, запроситВторичная переадресациядо шестиServer WebAppОдин из экземпляров службы выполняет обработку.
3.5. Начать строительство
3.5.1 Хост Consul Server
(а) Пишется отдельноdocker-compose.yml,УведомлениеRegistratorнужно настроить самостоятельноIPадрес.
- хост: 192.168.1.181
docker-compose.yml
version: '2'
services:
load_balancer:
image: liberalman/nginx-consul-template:latest
hostname: lb
links:
- consul_server_master:consul
ports:
- "80:80"
consul_server_master:
image: consul:latest
hostname: consul_server_master
ports:
- "8300:8300"
- "8301:8301"
- "8302:8302"
- "8400:8400"
- "8500:8500"
- "8600:8600"
command: consul agent -server -bootstrap-expect 1 -advertise 192.168.1.181 -node consul_server_master -data-dir /tmp/data-dir -client 0.0.0.0 -ui
registrator:
image: gliderlabs/registrator:latest
hostname: registrator
links:
- consul_server_master:consul
volumes:
- "/var/run/docker.sock:/tmp/docker.sock"
command: -ip 192.168.1.181 consul://192.168.1.181:8500
- хост: 192.168.1.186
docker-compose.yml
version: '2'
services:
load_balancer:
image: liberalman/nginx-consul-template:latest
hostname: lb
links:
- consul_server_slave:consul
ports:
- "80:80"
consul_server_slave:
image: consul:latest
hostname: consul_server_slave
ports:
- "8300:8300"
- "8301:8301"
- "8302:8302"
- "8400:8400"
- "8500:8500"
- "8600:8600"
command: consul agent -server -join=192.168.1.181 -advertise 192.168.1.186 -node consul_server_slave -data-dir /tmp/data-dir -client 0.0.0.0 -ui
registrator:
image: gliderlabs/registrator:latest
hostname: registrator
links:
- consul_server_slave:consul
volumes:
- "/var/run/docker.sock:/tmp/docker.sock"
command: -ip 192.168.1.186 consul://192.168.1.186:8500
(b) Проходя через два хоста соответственноdocker-composeЗапустите многососудные приложения, команда выглядит следующим образом:
docker-compose up -d
это на хосте192.168.1.181Вы можете увидеть вывод при запуске команды запуска наdocker-composeОн будет проверять сначала при запускецелевой файл изображенияТо ли тянуть на локалку, то ли последовательноСоздайтеизапускать docker-compose.ymlконфигурация файлаэкземпляр контейнера.
(C) Просмотр нормального начала технологического сосуда наблюдаетсяConsul,RegistratorиNginx/Consul-templateКонтейнеры запускаются нормально.
(D). Утилизацияdocker-compose, так же и на хосте192.168.1.186Запустите настроенный экземпляр службы контейнеров на сервере и проверьте состояние запуска следующим образом:
(д).Доступhttp://IP:8500ПроверятьConsul ServerизИнформация об узлеиСписок регистрации службы.
- Информация об узле:
- Список статусов службы:
дваConsul ServerВсе экземпляры службы контейнеров на хосте запускаются нормально!
3.5.2 Хост-клиент Consul
При нормальных обстоятельствах мыConsulВ качестве центра регистрации и обнаружения услуг он будет использоватьопределение услуги (Service Definition) иОпределение проверки работоспособности (Health Check Definition), соответствующие инструкции по настройке относятся к следующему:
определение услуги
| ключ переменной среды | переменная среды Значение | инструкция |
|---|---|---|
| SERVICE_ID | web-001 | Это может быть GUID или более удобочитаемая переменная, чтобы исключить повторение. |
| SERVICE_NAME | web | Если ID не задан, Consul будет использовать имя в качестве id, и регистрация может не пройти |
| SERVICE_TAGS | nodejs,web | Сервисные теги, разделенные запятыми, разработчики могут запрашивать некоторую информацию на основе тегов |
| SERVICE_IP | IP-адрес интрасети | Чтобы использовать Консул, доступный IP |
| SERVICE_PORT | 50001 | IP-приложения, если приложение, прослушивание к нескольким портам, следует рассматривать как больше приложений |
| SERVICE_IGNORE | Boolean | Игнорировать ли этот Контейнер, вы можете добавить это свойство для некоторых Контейнеров, которые не нужно регистрировать. |
Определение проверки работоспособности службы
Принципы настройки таковы:SERVICE_XXX_*. Если ваше приложение слушает5000порт, изменить наSERVICE_5000_CHECK_HTTP, конфигурация других переменных среды такая же.
| ключ переменной среды | переменная окружения Значение | инструкция |
|---|---|---|
| --- Ниже приведен режим HTTP | --- | --- |
| SERVICE_80_CHECK_HTTP | /path_to_health_check | Путь к проверке состояния вашего здоровья, например, /status |
| SERVICE_80_CHECK_INTERVAL | 15s | Проверять каждые 15 секунд |
| SERVICE_80_CHECK_TIMEOUT | 2s | Тайм-аут проверки статуса |
| --- Ниже приведен режим HTTPS | --- | --- |
| SERVICE_443_CHECK_HTTPS | /path_to_health_check | Путь к проверке состояния вашего здоровья, например, /status |
| SERVICE_443_CHECK_INTERVAL | 15s | Проверять каждые 15 секунд |
| SERVICE_443_CHECK_TIMEOUT | 2s | Тайм-аут проверки статуса |
| --- Ниже приведен режим TCP | --- | --- |
| SERVICE_443_CHECK_TCP | /path_to_health_check | Путь к проверке состояния вашего здоровья, например, /status |
| SERVICE_443_CHECK_INTERVAL | 15s | Проверять каждые 15 секунд |
| SERVICE_443_CHECK_TIMEOUT | 2s | Тайм-аут проверки статуса |
| --- использовать скрипт для проверки | --- | --- |
| SERVICE_CHECK_SCRIPT | curl --silent --fail example.com | Такие как check_redis.py в официальном примере |
| --- разное | --- | --- |
| SERVICE_CHECK_INITIAL_STATUS | passing | Зарегистрированная служба Consul по умолчанию не работает |
Инструкции по настройке
(а) Пишется отдельноdocker-compose.yml, также обратите вниманиеRegistratorнужно настроить самостоятельноIPадрес.test-serverиtest-clientизЭкземпляр службыПри настройке необходимо указать соответствующиепеременная среды.
- хост: 192.168.1.182
docker-compose.yml
version: '2'
services:
consul_client_01:
image: consul:latest
ports:
- "8300:8300"
- "8301:8301"
- "8301:8301/udp"
- "8302:8302"
- "8302:8302/udp"
- "8400:8400"
- "8500:8500"
- "8600:8600"
command: consul agent -retry-join 192.168.1.181 -advertise 192.168.1.182 -node consul_client_01 -data-dir /tmp/data-dir -client 0.0.0.0 -ui
registrator:
image: gliderlabs/registrator:latest
volumes:
- "/var/run/docker.sock:/tmp/docker.sock"
command: -ip 192.168.1.182 consul://192.168.1.182:8500
test_server_1:
image: test-server:latest
environment:
- SERVICE_8080_NAME=test-server-http-service
- SERVICE_8080_TAGS=test-server-http-service-01
- SERVICE_8080_CHECK_INTERVAL=10s
- SERVICE_8080_CHECK_TIMEOUT=2s
- SERVICE_8080_CHECK_HTTP=/health
- SERVICE_25000_NAME=test-server-thrift-service
- SERVICE_25000_TAGS=test-server-thrift-service-01
- SERVICE_25000_CHECK_INTERVAL=10s
- SERVICE_25000_CHECK_TIMEOUT=2s
- SERVICE_25000_CHECK_TCP=/
ports:
- "16000:8080"
- "30000:25000"
test_server_2:
image: test-server:latest
environment:
- SERVICE_8080_NAME=test-server-http-service
- SERVICE_8080_TAGS=test-server-http-service-02
- SERVICE_8080_CHECK_INTERVAL=10s
- SERVICE_8080_CHECK_TIMEOUT=2s
- SERVICE_8080_CHECK_HTTP=/health
- SERVICE_25000_NAME=test-server-thrift-service
- SERVICE_25000_TAGS=test-server-thrift-service-02
- SERVICE_25000_CHECK_INTERVAL=10s
- SERVICE_25000_CHECK_TIMEOUT=2s
- SERVICE_25000_CHECK_TCP=/
ports:
- "18000:8080"
- "32000:25000"
test_client_1:
image: test-client:latest
environment:
- SERVICE_8080_NAME=my-web-server
- SERVICE_8080_TAGS=test-client-http-service-01
- SERVICE_8080_CHECK_INTERVAL=10s
- SERVICE_8080_CHECK_TIMEOUT=2s
- SERVICE_8080_CHECK_HTTP=/features
ports:
- "80:8080"
- хост: 192.168.1.183
docker-compose.yml
version: '2'
services:
consul_client_02:
image: consul:latest
ports:
- "8300:8300"
- "8301:8301"
- "8301:8301/udp"
- "8302:8302"
- "8302:8302/udp"
- "8400:8400"
- "8500:8500"
- "8600:8600"
command: consul agent -retry-join 192.168.1.181 -advertise 192.168.1.183 -node consul_client_02 -data-dir /tmp/data-dir -client 0.0.0.0 -ui
registrator:
image: gliderlabs/registrator:latest
volumes:
- "/var/run/docker.sock:/tmp/docker.sock"
command: -ip 192.168.1.183 consul://192.168.1.183:8500
test_server_1:
image: test-server:latest
environment:
- SERVICE_8080_NAME=test-server-http-service
- SERVICE_8080_TAGS=test-server-http-service-03
- SERVICE_8080_CHECK_INTERVAL=10s
- SERVICE_8080_CHECK_TIMEOUT=2s
- SERVICE_8080_CHECK_HTTP=/health
- SERVICE_25000_NAME=test-server-thrift-service
- SERVICE_25000_TAGS=test-server-thrift-service-03
- SERVICE_25000_CHECK_INTERVAL=10s
- SERVICE_25000_CHECK_TIMEOUT=2s
- SERVICE_25000_CHECK_TCP=/
ports:
- "16000:8080"
- "30000:25000"
test_server_2:
image: test-server:latest
environment:
- SERVICE_8080_NAME=test-server-http-service
- SERVICE_8080_TAGS=test-server-http-service-04
- SERVICE_8080_CHECK_INTERVAL=10s
- SERVICE_8080_CHECK_TIMEOUT=2s
- SERVICE_8080_CHECK_HTTP=/health
- SERVICE_25000_NAME=test-server-thrift-service
- SERVICE_25000_TAGS=test-server-thrift-service-04
- SERVICE_25000_CHECK_INTERVAL=10s
- SERVICE_25000_CHECK_TIMEOUT=2s
- SERVICE_25000_CHECK_TCP=/
ports:
- "18000:8080"
- "32000:25000"
test_client_1:
image: test-client:latest
environment:
- SERVICE_8080_NAME=my-web-server
- SERVICE_8080_TAGS=test-client-http-service-02
- SERVICE_8080_CHECK_INTERVAL=10s
- SERVICE_8080_CHECK_TIMEOUT=2s
- SERVICE_8080_CHECK_HTTP=/features
ports:
- "80:8080"
- хост: 192.168.1.185
docker-compose.yml
version: '2'
services:
consul_client_03:
image: consul:latest
ports:
- "8300:8300"
- "8301:8301"
- "8301:8301/udp"
- "8302:8302"
- "8302:8302/udp"
- "8400:8400"
- "8500:8500"
- "8600:8600"
command: consul agent -retry-join 192.168.1.181 -advertise 192.168.1.185 -node consul_client_03 -data-dir /tmp/data-dir -client 0.0.0.0 -ui
registrator:
image: gliderlabs/registrator:latest
volumes:
- "/var/run/docker.sock:/tmp/docker.sock"
command: -ip 192.168.1.185 consul://192.168.1.185:8500
test_server_1:
image: test-server:latest
environment:
- SERVICE_8080_NAME=test-server-http-service
- SERVICE_8080_TAGS=test-server-http-service-05
- SERVICE_8080_CHECK_INTERVAL=10s
- SERVICE_8080_CHECK_TIMEOUT=2s
- SERVICE_8080_CHECK_HTTP=/health
- SERVICE_25000_NAME=test-server-thrift-service
- SERVICE_25000_TAGS=test-server-thrift-service-05
- SERVICE_25000_CHECK_INTERVAL=10s
- SERVICE_25000_CHECK_TIMEOUT=2s
- SERVICE_25000_CHECK_TCP=/
ports:
- "16000:8080"
- "30000:25000"
test_server_2:
image: test-server:latest
environment:
- SERVICE_8080_NAME=test-server-http-service
- SERVICE_8080_TAGS=test-server-http-service-06
- SERVICE_8080_CHECK_INTERVAL=10s
- SERVICE_8080_CHECK_TIMEOUT=2s
- SERVICE_8080_CHECK_HTTP=/health
- SERVICE_25000_NAME=test-server-thrift-service
- SERVICE_25000_TAGS=test-server-thrift-service-06
- SERVICE_25000_CHECK_INTERVAL=10s
- SERVICE_25000_CHECK_TIMEOUT=2s
- SERVICE_25000_CHECK_TCP=/
ports:
- "18000:8080"
- "32000:25000"
test_client_1:
image: test-client:latest
environment:
- SERVICE_8080_NAME=my-web-server
- SERVICE_8080_TAGS=test-client-http-service-03
- SERVICE_8080_CHECK_INTERVAL=10s
- SERVICE_8080_CHECK_TIMEOUT=2s
- SERVICE_8080_CHECK_HTTP=/features
ports:
- "80:8080"
Уведомление:Используемые нами сторонние зеркала
liberalman/nginx-consul-template,Nginxбудет называться какmy-web-serverизСервисный контейнеротправлено в качестве фонацелевой сервер, Таким образом, вtest-clientВ пункте конфигурации нужно указатьSERVICE_XXX_NAMEзаmy-web-server. Конечно, вы также можетесделать зеркалоуточнитьшаблон.
(б) Использование на трех хостахdocker-composeЗапустите многоконтейнерное приложение:
docker-compose up -d
принимать гостей192.168.1.182В качестве примера (два других аналогичны) в журнале консоли показано, создано и запущеноdocker-compose.yml5 Конфигурация файлаэкземпляр контейнера.
(c) Просмотрите процесс контейнера, который запускается нормально, и обратите внимание, чтоConsul, одинtest-clientи дваtest-serverКонтейнеры запускаются нормально.
(г).bВывод консоли в операции можно увидеть:docker-composeне согласноdocker-compose.ymlКонфигурация службы в файлепоследовательностьзапускать.registratorЗапуск контейнера зависит отconsulКонтейнер, покаconsulОн еще не начался, кажетсяregistratorприоритет для началаненормальный выходФеномен. Обходной путь - запустить его сноваdocker-compose up -dЗаказ.
(e) Снова проверьте процесс контейнера, на этот разRegistratorКонтейнер запустился нормально.
(F) На оставшихся двух хостах таким же образомповторениеВышеупомянутая операция, посетите еще разhttp://IP:8500ПроверятьConsul ServerизИнформация об узлеиСписок регистрации службы.
-
ConsulИнформация об узле кластера, включая дваConsul Serverузел и одинConsul Clientузел, вы можете увидеть всеСписок регистрации службыи связанные с нимиРезультаты проверки работоспособности:
-
nginxсписок статусов службы, имя службыnginx-consul-template,поставкаhttpсервис, всего 2 экземпляра сервиса:
-
test-clientСписок статусов службы, имя службыmy-web-server,поставкаhttpсервис, есть 3 экземпляра сервиса:
-
test-serverСписок статусов службы, имя службыtest-server-http-serviceиtest-server-thrift-service6 соответственноhttpэкземпляр службы и 6thriftЭкземпляр службы:
триConsul ClientВсе экземпляры службы контейнеров на узле запускаются нормально, а регистрация и обнаружение службы выполняются нормально!
4. Проверка результатов
4.1 Балансировка нагрузки Nginx
4.1.1. Доступ к Nginx
NginxНомер порта доступа по умолчанию:80, Выбери одинNginxдоступ, например:http://192.168.1.181/swagger-ui.html.
Запрос отправленTest ClientизSwaggerСтраница с указаниемnginxконфигурационный файлnginx.confодеялоConsul-templateМодифицировано успешно.
4.1.2. Войдите в контейнер Nginx
бегатьdocker psПроверятьnginx-consul-templateконтейнерID, например вот:4f2731a7e0cb. Входитьnginx-consul-templateконтейнер.
docker-enter 4f2731a7e0cb
Просмотрите список процессов внутри контейнера:
Обратите особое внимание на следующую однострочную команду процесса, которая выполняет три важных шага:
consul-template -consul-addr=consul:8500 -template /etc/consul-templates/nginx.conf.ctmpl:/etc/nginx/conf.d/app.conf:nginx -s reload
-
Consul-templateиспользоватьConsulВверхСлужебная информацияправильноNginxизШаблон профиля/etc/consul-templates/nginx.conf.ctmplпеределыватьРазобратьиоказывать. -
оказыватьСгенерировано
nginxФайл конфигурации/etc/nginx/conf.d/app.conf. - бежать дальше
nginx -s reloadПерезагрузитьapp.conf,продлитьСписок переадресации маршрута.
Проверятьapp.confэлементы конфигурации, найдено триtest-clientузлаIP:portприсоединилисьПереулок по маршруту спискасередина.
Выйдите и выключите хост192.168.1.182Вверхtest-clientконтейнер.
Проверьте еще разapp.conf, его можно найтиузел маршрутизации 192.168.1.182:80уже изNginxизсписок переадресации маршрутаначальствовыбраковыватьПотерял.
Аналогично, перезапуститеtest-clientВосстановив контейнер, его снова можно найтиNginxизсписок переадресации маршрутаАвтоматически добавить его снова!
4.2 Балансировка сервисной нагрузки
4.2.1 Тест интерфейса
test-clientпройти черезhttpЗапрос режима связи любойtest-server, возвращает результат ответа (время обработки запросаms).
test-clientпройти черезthriftЗапрос режима связи любойtest-server, возвращает результат ответа (время обработки запросаms).
4.2.3 Анализ журнала
Балансировка нагрузки сервисовНе очень, вот прямо перехватилtest-clientизсписок сервисного кэшаЖурнал, напечатанный во время динамического обновления времени:
2018-02-09 13:15:55.157 INFO 1 --- [erListUpdater-1] t.c.l.ThriftConsulServerListLoadBalancer : Refreshed thrift serverList: [
test-server-thrift-service: [
ThriftServerNode{node='consul_client_01', serviceId='test-server-thrift-service', tags=[test-server-thrift-service-01], host='192.168.1.182', port=30000, address='192.168.1.182', isHealth=true},
ThriftServerNode{node='consul_client_01', serviceId='test-server-thrift-service', tags=[test-server-thrift-service-02], host='192.168.1.182', port=32000, address='192.168.1.182', isHealth=true},
ThriftServerNode{node='consul_client_02', serviceId='test-server-thrift-service', tags=[test-server-thrift-service-03], host='192.168.1.183', port=30000, address='192.168.1.183', isHealth=true},
ThriftServerNode{node='consul_client_02', serviceId='test-server-thrift-service', tags=[test-server-thrift-service-04], host='192.168.1.183', port=32000, address='192.168.1.183', isHealth=true},
ThriftServerNode{node='consul_client_03', serviceId='test-server-thrift-service', tags=[test-server-thrift-service-05], host='192.168.1.185', port=30000, address='192.168.1.185', isHealth=true},
ThriftServerNode{node='consul_client_03', serviceId='test-server-thrift-service', tags=[test-server-thrift-service-06], host='192.168.1.185', port=32000, address='192.168.1.185', isHealth=true}
],
test-server-http-service: [
ThriftServerNode{node='consul_client_01', serviceId='test-server-http-service', tags=[test-server-http-service-01], host='192.168.1.182', port=16000, address='192.168.1.182', isHealth=true},
ThriftServerNode{node='consul_client_01', serviceId='test-server-http-service', tags=[test-server-http-service-02], host='192.168.1.182', port=18000, address='192.168.1.182', isHealth=true},
ThriftServerNode{node='consul_client_02', serviceId='test-server-http-service', tags=[test-server-http-service-03], host='192.168.1.183', port=16000, address='192.168.1.183', isHealth=true},
ThriftServerNode{node='consul_client_02', serviceId='test-server-http-service', tags=[test-server-http-service-04], host='192.168.1.183', port=18000, address='192.168.1.183', isHealth=true},
ThriftServerNode{node='consul_client_03', serviceId='test-server-http-service', tags=[test-server-http-service-05], host='192.168.1.185', port=16000, address='192.168.1.185', isHealth=true},
ThriftServerNode{node='consul_client_03', serviceId='test-server-http-service', tags=[test-server-http-service-06], host='192.168.1.185', port=18000, address='192.168.1.185', isHealth=true}
],
my-web-server: [
ThriftServerNode{node='consul_client_01', serviceId='my-web-server', tags=[test-client-http-service-01], host='192.168.1.182', port=80, address='192.168.1.182', isHealth=true},
ThriftServerNode{node='consul_client_02', serviceId='my-web-server', tags=[test-client-http-service-02], host='192.168.1.183', port=80, address='192.168.1.183', isHealth=true},
ThriftServerNode{node='consul_client_03', serviceId='my-web-server', tags=[test-client-http-service-03], host='192.168.1.185', port=80, address='192.168.1.185', isHealth=true}
]]
Экземпляр службы
-
test-server-http-serviceвсездоровыйЭкземпляр службы:
| Сервис IP-адрес | сервисный порт | Метка |
|---|---|---|
| 192.168.1.182 | 16000 | test-server-http-service-01 |
| 192.168.1.182 | 18000 | test-server-http-service-02 |
| 192.168.1.183 | 16000 | test-server-http-service-03 |
| 192.168.1.183 | 18000 | test-server-http-service-04 |
| 192.168.1.185 | 16000 | test-server-http-service-05 |
| 192.168.1.185 | 18000 | test-server-http-service-06 |
-
test-server-thrift-serviceвсездоровыйЭкземпляр службы:
| IP-адрес службы | сервисный порт | Метка |
|---|---|---|
| 192.168.1.182 | 30000 | test-server-thrift-service-01 |
| 192.168.1.182 | 32000 | test-server-thrift-service-02 |
| 192.168.1.183 | 30000 | test-server-thrift-service-03 |
| 192.168.1.183 | 32000 | test-server-thrift-service-04 |
| 192.168.1.185 | 30000 | test-server-thrift-service-05 |
| 192.168.1.185 | 32000 | test-server-thrift-service-06 |
-
my-web-serverвсездоровыйЭкземпляр службы:
| IP-адрес службы | сервисный порт | Метка |
|---|---|---|
| 192.168.1.182 | 80 | test-client-http-service-01 |
| 192.168.1.183 | 80 | test-client-http-service-02 |
| 192.168.1.185 | 80 | test-client-http-service-03 |
spring-cloud-starter-thriftусыновленныйголосованиеЭкспедиционная стратегия, то естьmy-web-serverбудет нажиматьцикл в последовательностиземляhttpилиrpcзапросить рассылку соответствующим6КусокЭкземпляр службыПолная обработка.
Суммировать
В этой статье представлен набор, основанный наСистема регистрации и обнаружения сервисов микросервисовиконтейнеризВысокая доступность (HA) решение, введенноеуровень доступаисервисный уровеньизАвтоматическая балансировка нагрузкиреализация, которая подробно описанапрограмма практикиитехнические средства!
Добро пожаловать в технический публичный аккаунт: Zero One Technology Stack
Эта учетная запись будет продолжать делиться сухими товарами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.