Автор статьи: Артем Михайлов
Микросервисная архитектура является одним из наиболее популярных подходов к созданию сложных приложений в настоящее время. Этот подход разбивает большое приложение на ряд маленьких, автономных сервисов, которые работают вместе для достижения общей цели.
Однако при работе с микросервисами возникают некоторые сложности в управлении нагрузкой на приложение. Именно здесь на помощь приходят два важных компонента — Load Balancer и Reverse Proxy.
Load Balancer помогает распределить нагрузку между несколькими экземплярами сервиса. Например, если у вас есть несколько экземпляров веб-сервера, то Load Balancer будет выбирать один из них для обработки запросов от клиента, чтобы сбалансировать нагрузку между ними.
Reverse Proxy, с другой стороны, является посредником между клиентом и сервером. Он принимает запрос от клиента и перенаправляет его на нужный сервис. Это позволяет скрыть сложную архитектуру приложения от внешнего мира.
Цель этой статьи — рассмотреть использование Load Balancer и Reverse Proxy при работе с микросервисами. Мы разберемся, как эти компоненты помогают управлять нагрузкой на приложение и обеспечивают безопасность ваших данных.
Load Balancer и Reverse Proxy в микросервисной архитектуре
Load Balancer в микросервисной архитектуре — это крайне важный инструмент для обеспечения высокой доступности и отказоустойчивости. Его работа заключается в распределении входящего трафика между несколькими экземплярами микросервисов, чтобы нагрузка была равномерно распределена и не наблюдались перегрузки системы.
Одной из основных особенностей работы Load Balancer является возможность обнаружения недоступных или неработающих экземпляров сервиса и перенаправления трафика на более работоспособные экземпляры. Это существенно повышает уровень надежности и устойчивости системы.
Существуют различные типы Load Balancer, каждый из которых может использоваться в зависимости от конкретных потребностей и задач. К примеру, Round Robin используется для равномерного распределения трафика между экземплярами, Least Connection для того, чтобы выбирать наиболее свободный экземпляр, а IP Hash — для более точной маршрутизации трафика на основе IP-адреса источника.
В микросервисной архитектуре использование Load Balancer является необходимым условием для эффективной работы множества микросервисов. Он помогает справиться с повышенной нагрузкой и масштабироваться на высокие объемы запросов, а также обеспечивает более высокую доступность и отказоустойчивость.
Принцип работы Load Balancer заключается в том, что он выступает в качестве посредника между клиентами и микросервисами. Когда клиенты отправляют запрос на услугу, он передает его Load Balancer, который затем выбирает конкретный экземпляр микросервиса, который будет ответственен за выполнение этого запроса.
Load Balancer может работать по разным алгоритмам: Round Robin, Least Connection, IP Hash или Weighted Round Robin. С помощью этих алгоритмов, он может регулировать нагрузку на каждом экземпляре сервиса, равномерно распределяя трафик между ними и избегая таким образом перегрузки одного из них.
Помимо этого, Load Balancer постоянно проверяет работоспособность и доступность каждого экземпляра сервиса, используя механизмы мониторинга сервисов. Если какой-то экземпляр перестает отвечать на запросы или выходит из строя, Load Balancer автоматически исключает его из списков доступных сервисов и перенаправляет трафик на другой работающий экземпляр.
Таким образом, принцип работы Load Balancer заключается в том, чтобы распределять трафик между экземплярами микросервисов, обеспечивать равномерность нагрузки и отказоустойчивость, а также автоматически мониторить состояние сервисов и мгновенно реагировать в случае выхода из строя одного из них. Все это позволяет обеспечивать высокую производительность и стабильность работы системы.
В микросервисной архитектуре, где множество микросервисов взаимодействуют между собой, использование Reverse Proxy является необходимостью. Он позволяет обеспечить балансировку нагрузки и высокую доступность, а также обеспечить безопасность взаимодействия между микросервисами и клиентами.
Задача Reverse Proxy состоит в том, чтобы принимать запросы от клиентов и перенаправлять их на соответствующие микросервисы. Он выступает в роли посредника между клиентами и микросервисами. Важно отметить, что Reverse Proxy может работать только с HTTP и HTTPS протоколами.
Основная задача Reverse Proxy – обеспечение балансировки нагрузки на микросервисы. Он распределяет запросы от клиентов на различные микросервисы с учетом их текущей загрузки. Это позволяет избежать перегрузки одного микросервиса и сохранить высокую доступность.
Кроме того, Reverse Proxy может выполнять следующие функции:
- Поддержка безопасности. Reverse Proxy может шифровать и расшифровывать сообщения между клиентами и микросервисами, что позволяет обеспечить защиту от атак и взломов.
- Кэширование. Reverse Proxy может кэшировать ответы микросервисов, что позволяет ускорить работу системы и уменьшить нагрузку на микросервисы.
- Маршрутизация трафика. Reverse Proxy может перенаправлять трафик на различные микросервисы в зависимости от их местоположения или других критериев.
Преимущества использования Reverse Proxy
- Более высокая доступность. Reverse Proxy позволяет устранить единую точку отказа и обеспечить высокую доступность микросервисов.
- Более высокая надежность. Распределение нагрузки между микросервисами позволяет избежать перегрузки и сбоев системы.
- Более высокая скорость работы. Кэширование и оптимизация трафика позволяют ускорить работу системы и повысить ее производительность.
- Более высокий уровень безопасности. Reverse Proxy обеспечивает защиту системы от атак и взломов.
Рабочий процесс Reverse Proxy состоит из следующих этапов:
- Клиент отправляет запрос на reverse proxy.
- Reverse proxy получает запрос и анализирует его.
- Reverse proxy проверяет, есть ли в кэше запрошенная информация или страница. Если страница находится в кэше, она отправляется обратно клиенту.
- Если страница отсутствует в кэше, reverse proxy передает запрос на сервер, который находится в сети, и получает ответ.
- Reverse proxy анализирует ответ от сервера и, если необходимо, обрабатывает его.
- Reverse proxy отправляет полученный ответ от сервера клиенту.
Reverse proxy может выполнять такие задачи, как балансировку нагрузки на серверы, кеш-память или определение правильного местоположения сервера для обработки запроса от клиента.
Создание микросервисной архитектуры с использованием Load Balancer и Reverse Proxy
Когда вы создаете микросервисную архитектуру, важно иметь возможность распределять трафик между различными экземплярами приложений и держать все под контролем. Для этих целей мы можем использовать две основные компоненты: Load Balancer и Reverse Proxy.
Load Balancer работает как контроллер трафика, который распределяет запросы между различными экземплярами приложений, находящимися за ним. Это позволяет максимально утилизировать ресурсы и сократить время отклика.
Reverse Proxy работает как посредник между клиентом и сервером, который скрывает настоящий IP-адрес сервера, а также обеспечивает дополнительный уровень безопасности и шифрования.
Давайте рассмотрим пример создания микросервисной архитектуры с использованием Docker и код. Предположим, что у нас есть 3 приложения, работающих на портах 5000, 6000 и 7000. Мы можем запустить эти приложения в контейнерах Docker, использую команду:
docker run -p 5000:5000 app_1
docker run -p 6000:6000 app_2
docker run -p 7000:7000 app_3
Теперь, чтобы произвести балансировку нагрузки, нам нужно создать контейнер с нашим Load Balancer — в нашем случае это Nginx. Создаем файл
nginx.conf
:http {
upstream app_servers {
server app_1:5000;
server app_2:6000;
server app_3:7000;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://app_servers;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
Как видно из кода выше, мы конфигурируем Nginx для использования нашего Load Balancer, и настраиваем его на прослушивание порта 80, который будет принимать запросы от клиентов. Затем мы настраиваем адреса наших приложений, и настраиваем атрибуты прокси, которые позволяют нам отправлять запросы с корректными заголовками.
Для настройки Reverse Proxy мы можем использовать то же самое приложение Nginx. Создаем конфигурационный файл nginx.conf:
http {
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://internal-server-ip:port;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
В примере выше мы определяем Reverse Proxy сервер, который принимает запросы на порту 80 и отправляет их на internal-server-ip на заданный порт. Далее мы настраиваем атрибуты прокси и отправляем запросы с корректными заголовками.
Рассмотрим еще один пример использования Load Balancer и Reverse Proxy в микросервисной архитектуре.
Предположим, у нас есть несколько микросервисов, которые работают на разных хостах и портах. Названия сервисов: Users, Orders, Payment. Каждый сервис предназначен для выполнения определенных задач, например, сервис Users отвечает за управление пользователями.
Для обеспечения балансировки нагрузки между сервисами а мы можем использовать HAProxy в качестве Load Balancer и Nginx в качестве Reverse Proxy.
HAProxy — это профессиональный и высокопроизводительный Load Balancer, который позволяет распределять трафик между множеством серверов.
Для создания микросервисной архитектуры с использованием HAProxy нужно выполнить следующие шаги:
1. Настроить HAProxy на балансировку нагрузки между серверами. Создадим файл
haproxy.cfg
со следующим содержимым:frontend http_front
bind *:80
mode http
option http-server-close
default_backend http_back
backend http_back
mode http
balance roundrobin
option forwardfor
server users_service1 users-service1:80 check
server users_service2 users-service2:80 check
server orders_service1 orders-service1:80 check
server orders_service2 orders-service2:80 check
server payment_service1 payment-service1:80 check
server payment_service2 payment-service2:80 check
В примере выше мы настраиваем порт 80 на фронтенде HAProxy, чтобы балансировать запросы между несколькими бэкендами (backend), где каждый бэкенд представляет отдельный сервис.
2. Настроить Nginx как Reverse Proxy, чтобы скрыть IP-адресы и обеспечить безопасность и шифрование. Создадим файл
nginx.conf
:http {
upstream users {
server haproxy_ip:80;
}
server {
listen 80;
server_name users.example.com;
location / {
proxy_pass http://users;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
Заключение
В примере выше мы настраиваем Nginx на режим Reverse Proxy, в нашем случае мы настраиваем адрес HAProxy в качестве upstream, который затем балансирует запросы между сервисами. Затем мы настраиваем атрибуты прокси, которые позволяют нам отправлять запросы с корректными заголовками.
так, мы рассмотрели на практике, как Load Balancer и Reverse Proxy могут улучшить работу микросервисной архитектуры. Благодаря распределению нагрузки между серверами и управлению трафиком в сети, можно достичь более высокой отказоустойчивости и производительности приложения.
Reverse Proxy помогает избежать прямого доступа к внутренним ресурсам, защищая их от внешних угроз, а также упрощает управление запросами на сервера. Load Balancer же решает проблему распределения трафика, перенаправляя запросы на свободные ресурсы и уменьшая нагрузку на конкретные серверы.
В основе рационального применения этих технологий лежит понимание сути задачи и масштаба проекта. Использование Load Balancer и Reverse Proxy может оказать влияние на бизнес-процессы компании и на его успешность в целом.
Напоследок хочу порекомендовать вам бесплатный вебинар от OTUS, на котором будут рассмотрены основы domain-driven design и применение к предметно-ориентированному проектированию. На вебинаре вы поймете как DDD помогает в построении архитектуры.
Комментарии (10)
PrinceKorwin
11.06.2023 09:57+3потому что как из пушки по воробьям
Почему? Сам небольшой, ресурсов много не есть. Нужный функционал есть. Есть задел по функционалу на будущее.
Правда. Чем он плох? Тем, что не модно-молодежно?
creker
11.06.2023 09:57Я бы сказал "как из пушки по воробьям" здесь некорректная характеристика. Скорее nginx это менее подходящее решение на сегодня, когда есть лучшие альтернативы. Основные проблемы nginx (по крайне опенсорса его варианта, а не всяческих надстроек и платных решений, которые вокруг него предлагает F5. Там может быть все это решено) происходят из его возраста. У него нет нормального хот релоада, API, service discovery, мониторинга, интеграций. Всех тех фич, которые обычно вкладывают в определение cloud-native. Все это нужно в микросервисных архитектурах, где инфраструктура очень динамично меняется и статичный характер nginx создает много боли. Его так или иначе приходится обкладывать каким-нить control plane'ом, чтобы нормально его интегрировать.
PrinceKorwin
11.06.2023 09:57У него нет нормального хот релоада, API, service discovery, мониторинга, интеграций.
Речь ведь про load balancer/reverse proxy.
Отсутствие релоада - в облаке он ведь в докере будет. Контейнер перезапустить просто.
API - зачем оно балансировщику? Конфигурацию через rolling update накатывать. Нет?
Service discovery - зачем это балансировщику?
Мониторинг - тут согласен. Но у nginx сейчас вроде с этим в порядке.
Интеграции - с чем? С access control? Умеет же.
Не. Я понимаю, что старое уходит и новое приходит. Но вот с тем же envoy у меня были проблемы с его кастомизацией и тем, что он больше памяти требует.
mayorovp
11.06.2023 09:57Отсутствие релоада — в облаке он ведь в докере будет. Контейнер перезапустить просто.
Ага, и пусть весь мир подождёт пока контейнер перезапускается.
Что забавно, reload у nginx как раз есть. Он даже умеет обновлять свой бинарник не прекращая обслуживание соединений.
Service discovery — зачем это балансировщику?
Искать апстримы же.
Интеграции — с чем?
Ну вот у traefik есть интеграции с докером и кубом, позволяющие дописывать конфигурацию в настройках сервисов-апстримов, за счёт чего получается более простой деплой. Чем это плохо?
(На самом деле это плохо тем, что там глобальное пространство имён сервисов и что в процессе деплоя сервиса traefik выдаёт совершенно некузявую ошибку вместо 503)
creker
11.06.2023 09:57Он то есть. Проблема в том, что это ручное действие. Т.е. нужен либо человек, который будет бегать эти сигналы посылать. Либо тот самый control plane.
А в остальном, по всем пунктам именно это я и имел ввиду.
apro
11.06.2023 09:57+1А при чем здесь микросервисы ? Некоторые монолитные приложения тоже могут горизонтально масштабироваться, и все описанное в статье, насколько я понимаю, в этом случае тоже будет к ним применимо.
ggo
11.06.2023 09:57+1Не слушайте никого. Nginx подходит для абсолютного большинства задач Load Balancing, Reverse Proxy для абсолютного большинства систем. Шило на мыло в общем.
Есть некоторое небольшое количества задач и систем, в которых вместо Nginx действительно лучше использовать его альтернативы.
Didimus
11.06.2023 09:57Не очень понял из описания, почему не совместисть reverse proxy (вроде как это по нашему шлюз называется?) и балансировщик.
nronnie
Все ок, даже плюсанул, но
nginx
для таких целей сейчас это уже очень уж устаревшее, потому что как из пушки по воробьям - есть более специализированные приложения, типаkrakend
илиenvoy
.hogstaberg
Хуже. В этом же тексте упоминается haproxy как load-balancer. Так вот haproxy прежде всего именно навороченный http reverse-proxy. Причём именно в этой роли он обходит nginx по всем параметрам и возможностям