Как интегрировать API Gateway и Consul?
Fei Han
February 25, 2022
Основная информация
Consul — это решение для сервисной сетки. Один из его ключевых компонентов, Consul KV, представляет собой распределенную базу данных ключ-значение, основное назначение которой — хранение параметров конфигурации и метаданных, а также предоставление возможности пользователям хранить индексированные объекты.
В модели микросервисной архитектуры, когда вышестоящие сервисы изменяются из-за расширения мощностей, аппаратных сбоев и т.д., ручное обновление информации о вышестоящих сервисах через конфигурацию может привести к значительному увеличению затрат на обслуживание. В ответ на это Apache APISIX предоставляет реестр для обнаружения сервисов, который позволяет динамически получать актуальную информацию о сервисных экземплярах, чтобы снизить затраты на обслуживание для пользователей.
В настоящее время Apache APISIX поддерживает реестр для обнаружения сервисов на основе Consul KV с помощью модуля consul_kv, предоставленного сообществом.
Как это работает
Apache APISIX использует модуль consul_kv и возможности распределенного хранилища ключ-значение Consul KV для разделения поставщика и потребителя сервиса, а также для реализации двух основных функций реестра для обнаружения сервисов.
- Регистрация сервиса: Поставщики сервисов регистрируют свои сервисы в реестре.
- Обнаружение сервиса: Потребители сервисов находят информацию о маршрутизации поставщиков сервисов через реестр.
На основе этого Apache APISIX становится более гибким и адаптируемым к существующим микросервисным архитектурам, чтобы лучше удовлетворять потребности пользователей.

Как включить Consul в Apache APISIX
Тестовые среды в этой статье создаются в Docker с использованием docker-compose.
-
Скачайте Apache APISIX.
# Клонируйте репозиторий apisix-docker git clone https://github.com/apache/apisix-docker.git -
Создайте папку Consul и файлы конфигурации.
# Создайте папку Consul mkdir -p ~/docker-things/consul/ && cd $_ # Создайте файлы конфигурации touch docker-compose.yml server1.json -
Отредактируйте файл
docker-compose.yml.version: '3.8' services: consul-server1: image: consul:1.9.3 container_name: consul-server1 restart: always volumes: - ./server1.json:/consul/config/server1.json:ro networks: - apisix ports: - '8500:8500' command: 'agent -bootstrap-expect=1' networks: apisix: external: true name: example_apisix -
Отредактируйте файл
server1.json.{ node_name: consul-server1, server: true, addresses: { http: 0.0.0.0 } } -
Добавьте информацию о конфигурации Consul в файл конфигурации Apache APISIX
apisix_conf/config.yaml.# config.yml # ...другие настройки discovery: consul_kv: servers: - http://consul-server1:8500 prefix: upstreams -
Запустите Apache APISIX и Consul.
# Перейдите в папку example, consul, запустите APISIX и Consul docker-compose up -d -
Зарегистрируйте тестовый сервис в Consul. Пример содержит два веб-сервиса, которые можно использовать для тестирования.
# Проверьте docker-compose.yml примера # Вы увидите два веб-сервиса $ cat docker-compose.yml | grep web # Вывод web1: - ./upstream/web1.conf:/etc/nginx/nginx.conf web2: - ./upstream/web2.conf:/etc/nginx/nginx.conf -
Убедитесь в IP-адресах этих веб-сервисов.
$ sudo docker inspect -f='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(sudo docker ps -aq) | grep web # Вывод /example-web1-1 - 172.26.0.7 /example-web2-1 - 172.26.0.2 -
Сделайте запрос к HTTP API Consul через терминал, чтобы зарегистрировать тестовый сервис.
# Зарегистрируйте с соответствующим IP curl \ -X PUT \ -d ' {weight: 1, max_fails: 2, fail_timeout: 1}' \ http://127.0.0.1:8500/v1/kv/upstreams/webpages/172.26.0.7:80 curl \ -X PUT \ -d ' {weight: 1, max_fails: 2, fail_timeout: 1}' \ http://127.0.0.1:8500/v1/kv/upstreams/webpages/172.26.0.2:80Путь после
/v1/kv/следует формату{Префикс}/{Имя сервиса}/{IP}:{Порт}.{Префикс}— это префикс, указанный при настройке Consul в APISIX, а{Имя сервиса}и{IP}:{Порт}должны быть определены пользователем в зависимости от вышестоящего сервиса.Формат данных:
{"weight": , "max_fails": , "fail_timeout": }. -
Проверьте, успешно ли зарегистрирован тестовый сервис.
curl http://127.0.0.1:8500/v1/kv/upstreams/webpages?keysСледующее сообщение указывает на успешную регистрацию.
[upstreams/webpages/172.26.0.2:80,upstreams/webpages/172.26.0.7:80]%
Создание маршрута и включение Consul
Добавьте Consul в маршрут с помощью Admin API, предоставляемого Apache APISIX.
Перед добавлением необходимо определить X-API-KEY и upstream.service_name.
X-API-KEY: Токен доступа к Admin API, в этом примере используется значение по умолчаниюedd1c9f034335f136f87ad84b625c8f1.upstream.service_name: Имя вышестоящего сервиса, которое указывает на сервис в реестре, который будет привязан к маршруту. Оно должно быть установлено на URL, используемый для регистрации тестового сервиса при использовании Consul, при этом часть{IP}:{Порт}должна быть удалена в конце. Мы также можем использовать Memory Dump API, предоставляемый Apache APISIX, чтобы получить URL сервиса и убедиться, что вышестоящий сервис обнаружен правильно.
$ curl http://127.0.0.1:9092/v1/discovery/consul_kv/dump | jq # Вывод { "services": { # Этот ключ — требуемый URL "http://consul-server1:8500/v1/kv/upstreams/webpages/": [ { "port": 80, "host": "172.26.0.7", "weight": 1 }, { "port": 80, "host": "172.26.0.2", "weight": 1 } ] }, "config": { # ...конфигурации } }
Добавление маршрута
Здесь запрос с URL /consul/* направляется на http://consul-server1:8500/v1/kv/upstreams/webpages/. Также необходимо установить discovery_type в значение consul_kv, чтобы запустить соответствующий модуль.
curl http://127.0.0.1:9080/apisix/admin/routes -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X POST -d ' { "uri": "/consul/*", "upstream": { "service_name": "http://consul-server1:8500/v1/kv/upstreams/webpages/", "type": "roundrobin", "discovery_type": "consul_kv" } }'
Тестирование и проверка результата
Результаты запросов показывают, что новый маршрут в Apache APISIX смог найти правильный адрес сервиса через Consul и запросить его на обоих узлах в соответствии с политикой балансировки нагрузки.
# первый запрос curl -s http://127.0.0.1:9080/consul/ # Вывод hello web1% # второй запрос curl -s http://127.0.0.1:9080/consul/ # Вывод hello web2% # Примечание: Возможно, что оба запроса вернут # одинаковый результат, как web1 или web2. # Это связано с природой балансировки нагрузки, # и вы можете попробовать сделать больше запросов.
Итог
Первая часть статьи описывает, как Apache APISIX работает с Consul для реализации реестра для обнаружения сервисов на основе Consul KV, чтобы решить проблему управления и обслуживания информации о сервисах. Вторая часть статьи посвящена тому, как использовать Apache APISIX в Docker с Consul. Конечно, применение в реальных сценариях требует анализа в зависимости от бизнес-сценария и существующей системной архитектуры.
Дополнительные инструкции по использованию реестра Consul в Apache APISIX можно найти в официальной документации.
Apache APISIX также активно работает над дополнительными плагинами для поддержки интеграции с другими сервисами, поэтому, если вы заинтересованы, не стесняйтесь начать обсуждение в GitHub Discussion или через список рассылки.