Мы собираемся выполнить балансировку нагрузки с помощью Haproxy через несколько узловых серверов, которые построены на основе приложения NestJs и основаны на шаблоне проектирования CQRS. С помощью докера мы заставляем это приложение выполнять докеризацию и запускаем несколько контейнеров одновременно с помощью одной команды, используя docker-compose.yml

Настройка проекта NestJs(CQRS)
В моем недавнем посте мы увидели, как можно настроить Nest js с шаблоном проектирования CQRS. Здесь я просто даю вам обзор NestJS, фреймворка узла, который фокусируется на прояснении разработки на стороне сервера, предоставляя совместимый и абстрактный интерфейс поверх стандартных инструментов, таких как экспресс.
почему? Я предлагаю шаблон проектирования CQRS, потому что CQRS — это популярный архитектурный шаблон, который решает распространенные проблемы в большинстве корпоративных приложений. Суть архитектурного шаблона CQRS состоит в том, чтобы отделить поведение записи от поведения чтения, повысить общую производительность, а также обеспечить стабильность и масштабируемость корпоративных приложений.

Настройка Haproxy для балансировки нагрузки
Единственным фокусом haproxy является маршрутизация трафика на несколько серверов, а в haproxy вы можете масштабировать внутренний сервер отдельно от клиента, подключающегося к внешнему интерфейсу.

- В корне создайте папку с именем
haproxyи в ней создайтеhaproxy.cfgfile. пропишите в нем следующую конфигурацию.
touch haproxy.cfg
- В докер-контейнере этот файл находится по этому пути
/etc/haproxy/haproxy.cfg - Haproxy включает разделы global, default, listen, frontend и backend. Все это разделы, в которых вы можете написать конфигурацию, связанную с такими разделами, как бэкэнд или внешний интерфейс.
maxconn:5000→ установка максимального количества соединений, которое ограничивает количество соединений, принимаемых haproxy, и защищает балансировщик нагрузки от нехватки памяти.default→ раздел по умолчанию устанавливает различные значения по умолчанию, которые будут применяться к последующим разделам, настройки являются общими для остальной части вашей конфигурации, поэтому вам не нужно повторять их во внешнем и внутреннем интерфейсе, каждый из этих параметров может быть переопределен при необходимости указав их снова.
В соответствующем разделе я настроил режим HTTP. Режим определяет, работает ли haproxy как уровень для TCP-прокси или как HTTP-прокси седьмого уровня.timeout→ сколько ждать, пока haproxy установит соединение с внутренним сервером?timoutclient→ здесь будет указано, как долго ждать, пока клиент отправит данныеtimeout server→ здесь будет указано, как долго ждать отправки данных сервером.frontend→ внешний интерфейс охватывает клиентские обязанности раздела прослушивания.backend→ бэкенд выполняет функции пула серверов.
В этом примере фронтенд ретранслирует весь трафик на бэкенд с именем backendServer, просматривая директиву бэкенда по умолчанию, если такой бэкэнд не найден, haproxy завершится ошибкой с новой конфигурацией и выдаст ошибку.
bind *:3005→ это означает прослушивание всех сетевых интерфейсов с портом 3005.server nestServer1 nodeapp1:1111→ мы указывали имя сервера nestServer1, а nodeapp1 означает, что вы можете указать их IP-адрес или 0.0.0.0 или написать IP-адрес контейнера, на котором работает ваше приложение, на ваше усмотрение. m с помощью файла docker-compose, поэтому я пишу имя службы, которой она может управлять сама, вы получите четкое представление, как только увидите конфигурациюdocker-compose.yml.default_backend backendServer→ вот как haproxy подключается к серверной части.
Настройка Dockerfile для NestJs
Скорее всего, вы слышали о докере, мы видели, что докеризация приложений — это удобная процедура, помогающая оптимизировать операции развертывания.
Было бы полезно создать Docker-образ NesJs(CQRS) вашего приложения.
Создать Dockerfile
Теперь, продвигаясь вперед, мы создадим Dockerfile.
touch Dockerfile
Теперь добавьте следующую команду в Dockerfile.
- На первом этапе мы используем образ узла как
builder,
builder — это имя предыдущего этапа в многоэтапном Dockerfile. Вероятно, это сборка диспетчера приложений. - Следующий шаг указывает наш рабочий каталог как
/app. - На следующем шаге файлы пакета копируются в рабочий каталог.
- Следующий шаг,
npm ci, используется для установки всех точных зависимостей версии или devDependencies из файлаpackage-lock.json. - Затем мы запускаем команду
npm run buildдля сборки производственного кода. Это поместит код приложения сборки в папку/distвнутри рабочего каталога. - После успешной сборки мы можем удалить все непроизводственные зависимости из папки
node_modules.
мы запускаем командуnpm prune — production, которая указывает, что мы хотим сохранить только производственные зависимости. - Теперь на последнем этапе DockerFile, который будет использоваться для создания образа нашего приложения, мы копируем папку и файл.
COPY — from=builder /эта команда обычно выполняет команду COPY, которая копирует файл из контекста сборки в образ. Но с— fromit вместо этого копируется из файловой системы предыдущего этапа сборки. Где-то выше этого вы увидите FROM какой-либо сборщик AS и некоторые инструкции по сборке, так что это копирование оттуда.
Теперь мы можем запустить команду для запуска кода в контейнере.
Сейчас создается образ NestJs
Запустите следующую команду, чтобы создать образ
docker build . -t loadbalancing


Как вы можете видеть на картинке выше, мы успешно создали образ.
Настройка docker-compose.yml
почему мы использовали docker-compose?
→ Сохраните настройки запуска контейнера Docker в удобном для чтения файле.
→ Создавайте однострочные стартапы среды разработки.
Создайте файл docker-compose.yml
Теперь добавьте следующую конфигурацию в файл docker-compose.yml, убедитесь, что вы указали имя образа, которое вы создали ранее, не дайте неправильное имя образа в файле docker-compose.yml.
- Мы используем версию docker-compose 3.2.
- Указав сервис в файле компоновки докеров, мы определяем сервис haproxy под
service, который называетсяlbв файле компоновки, которому вы можете дать любое имя. - Вытягиваем изображение haproxy из
docker-hubи указываем в нем некоторую конфигурацию, напримерrestart policy, resources limit,определяем том, где он должен создатьhaproxy.cfgфайл в контейнере и даем контейнеру имяHaproxy. - Мы также собираемся создать 3 сервераnesjs, сколько серверов вы хотите создать, зависит только от вас. В приведенном выше файле компоновки я создаю 3 сервера NestJS, поэтому я определяю 3 конфигурации сервера в файле
docker-compose.yml.
Если вы помните, в файле конфигурации haproxy.cfg выше я пишу server nestServer1 nodeapp1:1111 это nodeapp1относится к службе в docker-compose.yml
Теперь выполните следующую команду, чтобы запустить контейнер, используя docker-compose.yml file.
docker-compose up -d

Контейнер успешно поднят, как вы можете видеть

3-узловой сервер запущен, теперь нам нужно проверить, работает ли балансировка нагрузки.
Я уже создал почтовый API, который дает ответ на то, какой сервер работает, он дает номер порта, а нажатие того же URL-адреса дает другой порт, из которого мы можем указать, что наша балансировка нагрузки работает.



Ответ показывает, что балансировка нагрузки работает нормально, поскольку вы можете видеть, что она предоставляет разные порты при обращении к API, что доказывает, что балансировка нагрузки работает нормально, как мы и ожидали.
Вот моя ссылка на репо ниже, чтобы получить четкое представление, вы можете клонировать этот проект и запустить его
Репозиторий Github:
Краткое содержание:
Всего за несколько шагов мы смогли докеризировать приложение NestJS с haproxy, используя файл docker-compose.yml. Это может помочь упростить процесс развертывания производственного кода.
Запрос?
Не стесняйтесь спрашивать, если у вас есть какие-либо вопросы, вот моя почта: