API Gateway и Service Discovery: Бесшовная интеграция микросервисов
February 7, 2024
В цифровую эпоху интерфейсы прикладного программирования (API) стали краеугольным камнем взаимодействия между различными системами и сервисами.
С распространением архитектуры микросервисов важность API-шлюзов и механизмов обнаружения сервисов становится все более заметной. API-шлюз служит входной точкой архитектуры микросервисов, отвечая за обработку всех внешних запросов и координацию взаимодействия между внутренними сервисами, в то время как механизм обнаружения сервисов гарантирует, что система может динамически находить и подключаться к нужным экземплярам сервисов.
Вместе они создают эффективную, гибкую и масштабируемую распределенную систему. В этой статье подробно рассматриваются связи между API-шлюзами и механизмами обнаружения сервисов, а также их ключевые роли в современных распределенных системах.
API-шлюзы и обнаружение сервисов
Как входная точка архитектуры микросервисов, API-шлюз обрабатывает все внешние запросы и обеспечивает взаимодействие с внутренними сервисами. Его основные функции включают:
- Маршрутизация и перенаправление запросов: Направление запросов на соответствующие сервисы на основе характеристик запроса.
- Контроль доступа и аутентификация: Обеспечение того, что только авторизованные пользователи или системы могут получить доступ к API.
- Балансировка нагрузки и кэширование: Оптимизация производительности сервисов путем равномерного распределения запросов между различными экземплярами сервисов и предоставление кэширования для уменьшения нагрузки на серверные сервисы.
- Логирование и анализ: Сбор и анализ данных об использовании API для поддержки принятия бизнес-решений.
Обнаружение сервисов — это механизм, используемый для автоматического поиска доступных экземпляров сервисов в распределенной системе. Когда количество сервисов велико и динамически изменяется, обнаружение сервисов становится критически важным. Принципы регистрации и обнаружения сервисов следующие:
- Регистрация сервисов: Когда сервис запускается, он регистрирует свою информацию (например, IP-адрес, номер порта и т.д.) в реестре сервисов.
- Обнаружение сервисов: Когда другим сервисам необходимо вызвать этот сервис, они запрашивают реестр сервисов, чтобы найти доступные экземпляры сервисов и выбрать один для взаимодействия.
Связи между API-шлюзами и обнаружением сервисов
API-шлюз служит "привратником", обрабатывающим все внешние запросы и интеллектуально направляющим их на правильные экземпляры сервисов. API-шлюзы и механизмы обнаружения сервисов взаимозависимы в архитектуре микросервисов, обеспечивая стабильность и масштабируемость.
До внедрения механизма обнаружения сервисов API-шлюз полагался на ручную настройку для указания адресов вышестоящих сервисов. Если адреса экземпляров сервисов изменялись, например, из-за обновлений, аварийного переключения на резервные экземпляры или масштабирования из-за увеличения трафика, администраторам приходилось вручную обновлять конфигурацию API-шлюза. Такой подход не только неэффективен, но и сложен в обеспечении точности и своевременности.
С помощью механизма обнаружения сервисов API-шлюз может динамически подключаться к реестру сервисов в реальном времени, автоматически получая последние адреса экземпляров всех вышестоящих сервисов и гарантируя, что запросы будут точно направлены на новые сервисы.
В то же время механизм обнаружения сервисов может своевременно уведомлять API-шлюз о неисправностях, эффективно предотвращая направление запросов на недоступные сервисы. Настроив адрес реестра сервисов и имена сервисов, API-шлюз значительно продвинулся в повторном использовании конфигураций в различных средах, уменьшив объем ручной настройки и повысив точность и повторное использование конфигураций.

Практическое применение интеграции API-шлюза с обнаружением сервисов Kubernetes
Предположим, у нас есть система на основе архитектуры микросервисов, развернутая в Kubernetes, с несколькими сервисами, такими как сервис пользователей, сервис заказов, сервис платежей и т.д. Каждый сервис имеет несколько реплик (Pods), и IP-адреса и номера портов этих реплик динамически изменяются при создании и уничтожении контейнеров.
В этом сценарии мы хотим использовать API-шлюз для обработки внешних запросов и интеллектуального направления их на правильные сервисы Kubernetes. В то же время мы хотим использовать механизм обнаружения сервисов Kubernetes для динамического обнаружения и управления экземплярами сервисов.
Шаг 1: Развертывание и регистрация сервисов
В Kubernetes мы используем Deployments или StatefulSets для развертывания сервисов и создаем соответствующие Services как абстракции сервисов. Kubernetes Services автоматически обеспечивает балансировку нагрузки для backend Pods и сопоставляет имена сервисов с устойчивыми внутренними IP-адресами и номерами портов кластера.
Когда Pods создаются или уничтожаются, Service Controller Kubernetes автоматически обновляет объекты Endpoint сервисов, которые содержат IP-адреса и номера портов всех связанных Pods. Эти объекты Endpoint хранятся в API-сервере Kubernetes для запросов другими компонентами.
Шаг 2: Развертывание и настройка API-шлюза
В качестве примера возьмем API7 Enterprise. Мы подключаемся к адресу реестра сервисов Kubernetes в группе шлюзов. Когда мы публикуем сервис в группе шлюзов, вместо ручного ввода адреса экземпляра вышестоящего сервиса мы выбираем этот реестр Kubernetes и указываем пространство имен и соответствующий Service внутри него. API7 Enterprise автоматически извлекает информацию Endpoint соответствующего сервиса из API-сервера Kubernetes и использует ее как адрес вышестоящего сервиса.
Шаг 3: Обработка запросов
Когда API-шлюз получает внешний запрос, он определяет, на какой сервис направить запрос, на основе настроенных правил маршрутизации. Затем он запрашивает API-сервер Kubernetes, чтобы получить последнюю информацию о вышестоящих сервисах. API-шлюз выбирает экземпляр из этой информации (на основе различных стратегий балансировки нагрузки) и перенаправляет запрос на этот экземпляр. Поскольку информация Endpoint обновляется динамически, API-шлюз может автоматически обрабатывать создание, уничтожение и миграцию Pods, гарантируя, что запросы всегда направляются на доступные вышестоящие сервисы.
Шаг 4: Обнаружение и обновление сервисов
В Kubernetes обнаружение сервисов выполняется автоматически. Когда статус Pods изменяется (например, создание, уничтожение или миграция), Service Controller Kubernetes автоматически обновляет соответствующие объекты Endpoint сервисов.
API-шлюз регулярно извлекает последнюю информацию Endpoint из API-сервера Kubernetes и обновляет свои вышестоящие сервисы на основе этой информации. Это позволяет API-шлюзу мгновенно реагировать на изменения статуса сервисов и автоматически корректировать правила маршрутизации, чтобы гарантировать, что запросы направляются на доступные экземпляры сервисов.
Заключение
Благодаря интеграции API-шлюза и механизма обнаружения сервисов Kubernetes наша система может достичь динамической регистрации и обнаружения сервисов, интеллектуальной маршрутизации и балансировки нагрузки. Такой подход упрощает настройку и управление системой, повышает надежность и масштабируемость системы, а также полностью использует мощные функции, предоставляемые Kubernetes, делая развертывание и эксплуатацию архитектуры микросервисов более простым и эффективным.