API Gateway и Service Discovery: Бесшовная интеграция микросервисов

February 7, 2024

Technology

В цифровую эпоху интерфейсы прикладного программирования (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, делая развертывание и эксплуатацию архитектуры микросервисов более простым и эффективным.

Tags: