Как интегрировать API Gateway и Consul?

Fei Han

February 25, 2022

Ecosystem

Основная информация

Consul — это решение для сервисной сетки. Один из его ключевых компонентов, Consul KV, представляет собой распределенную базу данных ключ-значение, основное назначение которой — хранение параметров конфигурации и метаданных, а также предоставление возможности пользователям хранить индексированные объекты.

В модели микросервисной архитектуры, когда вышестоящие сервисы изменяются из-за расширения мощностей, аппаратных сбоев и т.д., ручное обновление информации о вышестоящих сервисах через конфигурацию может привести к значительному увеличению затрат на обслуживание. В ответ на это Apache APISIX предоставляет реестр для обнаружения сервисов, который позволяет динамически получать актуальную информацию о сервисных экземплярах, чтобы снизить затраты на обслуживание для пользователей.

В настоящее время Apache APISIX поддерживает реестр для обнаружения сервисов на основе Consul KV с помощью модуля consul_kv, предоставленного сообществом.

Как это работает

Apache APISIX использует модуль consul_kv и возможности распределенного хранилища ключ-значение Consul KV для разделения поставщика и потребителя сервиса, а также для реализации двух основных функций реестра для обнаружения сервисов.

  1. Регистрация сервиса: Поставщики сервисов регистрируют свои сервисы в реестре.
  2. Обнаружение сервиса: Потребители сервисов находят информацию о маршрутизации поставщиков сервисов через реестр.

На основе этого Apache APISIX становится более гибким и адаптируемым к существующим микросервисным архитектурам, чтобы лучше удовлетворять потребности пользователей.

архитектура consul

Как включить Consul в Apache APISIX

Тестовые среды в этой статье создаются в Docker с использованием docker-compose.

  1. Скачайте Apache APISIX.

    # Клонируйте репозиторий apisix-docker git clone https://github.com/apache/apisix-docker.git
  2. Создайте папку Consul и файлы конфигурации.

    # Создайте папку Consul mkdir -p ~/docker-things/consul/ && cd $_ # Создайте файлы конфигурации touch docker-compose.yml server1.json
  3. Отредактируйте файл 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
  4. Отредактируйте файл server1.json.

    { node_name: consul-server1, server: true, addresses: { http: 0.0.0.0 } }
  5. Добавьте информацию о конфигурации Consul в файл конфигурации Apache APISIX apisix_conf/config.yaml.

    # config.yml # ...другие настройки discovery: consul_kv: servers: - http://consul-server1:8500 prefix: upstreams
  6. Запустите Apache APISIX и Consul.

    # Перейдите в папку example, consul, запустите APISIX и Consul docker-compose up -d
  7. Зарегистрируйте тестовый сервис в 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
  8. Убедитесь в 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
  9. Сделайте запрос к 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": }.

  10. Проверьте, успешно ли зарегистрирован тестовый сервис.

    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 или через список рассылки.

Tags: