Реализация балансировки нагрузки на сервис на основе Docker + Consul + Nginx + Consul-template

задняя часть сервер Nginx балансировки нагрузки

предисловие

Предыдущая статьяИспользование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Процесс реализации динамической балансировки нагрузки выглядит следующим образом:

  1. с тем жеConsul ЭтикеткаправильноWeb Serverпровестизнак обслуживанияиКлассификация,новыйилиУдалить Web Serverсерверный узел;
  2. Registrator мониторприбытьWeb ServerОбновление статуса, автоматическоеConsulсервисный реестр будет ли эторегистриливыйти;
  3. Consul-templateподписалсяConsulсервисный реестрслужебное сообщение,получилаConsulpush сообщения, т.е.Web Serverсервисный узелгосударствопроизошли изменения.
  4. 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Зеркальная сборка из:

  1. Клонируйте проект в локальную среду проекта:GitHub.com/O — арендатор/билеты…
  2. переключиться на подмодульspring-cloud-starter-thrift-examplesвнизtestкаталог, выполнить командуmvn clean packageУпакуйте программу.
  3. соответственноtest-clientиtest-serverпроектКорневая директориявнизDockerfileдокументы иtargetв каталогеtarget/*.jarПрограмма копирования в192.168.1.182,192.168.1.183и192.168.1.185Под содержанием.
  4. Входитьклиент Dockerfileкаталог, даклиентпрограммаtest-clientДля создания образа команда выглядит следующим образом:docker build . -t test-client:latest
  5. ВходитьСервер Dockerfileкаталог, даСерверпрограммаtest-serverДля создания образа команда выглядит следующим образом:docker build . -t test-server:latest

После завершения сборки проверьте локальную зеркальную библиотеку:

3.4 Модель развертывания

пять хостов, в том числе192.168.1.181и192.168.1.186Основные функции двух хостов следующие:

  1. в видефорвардер балансировки нагрузки(Это всего лишь демонстрация, вы можете пройтиKeepAlivedвыполнитьNginxизHA), пропускайте трафик внешнего доступа черезалгоритм загрузкиОдин вперед на задний планClient WebApp.
  2. отServerзапуск режимаConsulузлы, один из которых служит всемКластер обнаружения и регистрации службизleader, заСинхронизироватьиУпорствоостальные триClientмодальныйConsulузладанныеиинформация о состоянии.

Остальные три хоста -192.168.1.182,192.168.1.183и192.168.1.185, который играет следующие роли:

  1. Каждый сClientразвертывание шаблонаConsulузел длярегистриНаходитьроднойdockerуслуги, предоставляемые контейнером, иConsul Serverизleaderузел дляСинхронизация состояния службы.
  2. начать по одному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
  1. Consul-templateиспользоватьConsulВверхСлужебная информацияправильноNginxизШаблон профиля /etc/consul-templates/nginx.conf.ctmplпеределыватьРазобратьиоказывать.
  2. оказыватьСгенерированоnginxФайл конфигурации/etc/nginx/conf.d/app.conf.
  3. бежать дальше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

零壹技术栈

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