Управление serverless API с помощью Apache APISIX
January 18, 2023
Серверные вычисления позволяют разработчикам создавать приложения быстрее, устраняя необходимость управления инфраструктурой. С использованием серверных API в облаке поставщик облачных услуг автоматически предоставляет, масштабирует и управляет инфраструктурой, необходимой для выполнения кода. В этой статье вы узнаете, как интегрировать Apache APISIX API Gateway с Azure Functions для управления серверными API на основе Java.
Цели обучения
В этой статье вы изучите следующее:
- Что такое серверные API?
- Роль API Gateway в управлении сложным трафиком серверных API.
- Как настроить Apache APISIX Gateway.
- Как создавать серверные API с помощью Azure Functions.
- Как предоставлять серверные API в качестве вышестоящих сервисов.
- Как защитить серверные API с помощью плагинов аутентификации APISIX.
- Как применять политики ограничения скорости.
Apache APISIX предлагает дополнительные плагины, которые можно использовать с другими серверными решениями, такими как AWS Lambda.
Прежде чем мы перейдем к практической части руководства, давайте рассмотрим некоторые концепции.
Что такое серверные API?
Серверные API — это те же традиционные API, за исключением того, что они используют серверный бэкенд. Для бизнеса и разработчиков серверные вычисления означают, что им больше не нужно беспокоиться о обслуживании серверов или масштабировании серверных ресурсов для удовлетворения потребностей пользователей. Кроме того, серверные API избегают проблемы масштабирования, поскольку они создают серверные ресурсы каждый раз, когда поступает запрос. Серверные API уменьшают задержку, поскольку они размещены на исходном сервере. И последнее, но не менее важное: серверные вычисления гораздо более экономически эффективны, чем традиционные альтернативы, такие как создание целых микросервисов.
Серверные API с использованием Azure Functions
Azure Function — это простой способ выполнения небольших фрагментов кода в облаке. Вам не нужно беспокоиться об инфраструктуре, необходимой для размещения этого кода. Вы можете написать функцию на C#, Java, JavaScript, PowerShell, Python или любом из языков, перечисленных в поддерживаемых языках.
С помощью Azure Functions вы можете быстро создавать HTTP API для своих веб-приложений без головной боли с веб-фреймворками. Azure Functions является серверным, поэтому вы платите только тогда, когда вызывается HTTP-конечная точка. Когда конечные точки не используются, вы не платите. Эти два фактора делают серверные платформы, такие как Azure Functions, идеальным выбором для API, где вы сталкиваетесь с неожиданными всплесками трафика.
API Gateway для управления трафиком серверных API
API Gateway является фундаментальной частью серверных API, поскольку он отвечает за соединение между определенным API и функцией, обрабатывающей запросы к этому API. API Gateway имеет множество преимуществ в архитектуре серверных API. В дополнение к основным функциям API Gateway, таким как аутентификация, ограничение скорости, наблюдаемость, кэширование и т.д., он способен вызывать серверные API, подписываться на события, а затем обрабатывать их с использованием обратных вызовов и пересылать запросы аутентификации во внешние службы авторизации с полностью пользовательской логикой серверных функций.
Управление серверными API с помощью демонстрации Apache APISIX
Имея достаточно теоретических знаний, теперь мы можем перейти к практической части. Мы используем пример проекта apisix-manage-serverless-apis, размещенный на GitHub. Вы можете найти исходный код и примеры команд curl, которые мы используем в этом руководстве.
Для нашего мини-проекта мы будем работать с двумя простыми функциями Azure, написанными на Java, которые имитируют наши серверные API для Product и Review сервисов.
Предварительные требования
- Необходимо быть знакомым с основными концепциями API.
- Необходимо иметь базовые знания о Azure Functions, например, этот учебный модуль показывает, как создать HTTP API с использованием расширения Azure Functions для Visual Studio Code.
- Docker
- Аккаунт Azure
- Azure CLI
- Java Developer Kit, как минимум версия 8
- Maven
- Azure Functions Core Tools
- Visual Studio Code
- Azure Functions Core Tools (мин. версия 2.6.666)
- Расширение Azure Functions для Visual Studio Code
Настройка проекта
Первое, что нужно сделать, это клонировать репозиторий проекта с GitHub:
git clone https://github.com/Boburmirzo/apisix-manage-serverless-apis.git
Откройте папку проекта в вашем любимом редакторе кода. В этом руководстве используется VS Code.
Запуск Apache APISIX
Чтобы запустить Apache APISIX и Azure Functions локально, выполните следующие шаги:
Откройте новое окно терминала и выполните команду docker compose up из корневой папки проекта:
docker compose up -d
Эта команда запустит Apache APISIX и etcd вместе с Docker. Например, если Docker Desktop установлен на вашем компьютере, вы можете увидеть запущенные контейнеры там:

В этой демонстрации мы установили APISIX в локальной среде, но вы также можете развернуть его в Azure и запустить на Azure Container Instance. См. следующее руководство.
Запуск Azure Functions
Затем перейдите в папку /upstream:
mvn clean install mvn azure-functions:run
Две функции запустятся в окне терминала. Вы можете запросить оба серверных API в вашем браузере:
Например:


Развертывание Azure Functions
Далее мы развернем код функций в Azure Function App, выполнив следующую команду:
mvn azure-functions:deploy
Или вы можете просто следовать этому руководству по развертыванию проекта функции в Azure
Обратите внимание, что имя приложения функции генерируется случайным образом на основе вашего
artifactId, с добавлением случайно сгенерированного числа. В командах руководства упоминается имя приложения функцииserverless-apis.
Чтобы убедиться, что наша функция работает, мы можем протестировать вызов, напрямую запросив её URL в браузере:
https://serverless-apis.azurewebsites.net/api/products https://serverless-apis.azurewebsites.net/api/reviews
Предоставление серверных API в APISIX
После завершения настройки мы теперь предоставим серверные API Azure Functions в качестве вышестоящих сервисов в APISIX. Для этого нам нужно создать новый Route с включенным плагином azure-function для обоих серверных API products и reviews.
Если плагин azure-function включен на маршруте, APISIX прослушивает запросы на пути этого маршрута, а затем вызывает удаленный код Azure Function с параметрами из этого запроса.
Создание маршрута для Products
Чтобы создать маршрут для функции Products, выполните следующую команду:
curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "name": "Create a route with Azure function plugin", "plugins": { "azure-functions": { "function_uri": "https://serverless-apis.azurewebsites.net/api/products", "ssl_verify": false } }, "uri": "/products" }'
Обратите внимание, что мы установили атрибут
ssl_verifyплагинаazure-functionsвfalse, чтобы отключить проверку SSL только для демонстрационных целей. Вы также можете включить её для выполнения более безопасных запросов от APISIX к Azure Functions. Узнайте больше о других параметрах конфигурации.
Тестирование с помощью запроса curl
Мы можем использовать curl для отправки запроса, чтобы убедиться, что APISIX правильно прослушивает путь и успешно перенаправляет запрос на вышестоящий сервис:
curl -i -XGET http://127.0.0.1:9080/products HTTP/1.1 200 OK [ { "id": 1, "name": "Product1", "description": "Description1" }, { "id": 2, "name": "Product2", "description": "Description2" } ]
Отлично! Мы получили ответ от реального серверного API на Azure Function.
Далее мы сделаем аналогичную конфигурацию для функции reviews.
Создание маршрута для Reviews и тестирование
Создайте второй маршрут с включенным плагином Azure function:
curl http://127.0.0.1:9180/apisix/admin/routes/2 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "plugins": { "azure-functions": { "function_uri": "https://serverless-apis.azurewebsites.net/api/reviews", "ssl_verify": false } }, "uri": "/reviews" }'
Тестирование ответа серверного API:
curl -i -XGET http://127.0.0.1:9080/reviews
В этом разделе мы представили новый маршрут и добавили плагин azure-functions к нашим серверным API, чтобы APISIX мог вызывать удаленные функции Azure и управлять трафиком. В следующих разделах мы узнаем, как аутентифицировать потребителей API и применять политики времени выполнения, такие как ограничение скорости.
Защита серверных API с помощью плагинов аутентификации APISIX
До сих пор наши серверные API были общедоступными и доступны для неавторизованных пользователей. В этом разделе мы включим функцию аутентификации, чтобы запретить неавторизованные запросы к серверным API.
Apache APISIX может проверять идентичность, связанную с запросами API, через проверку учетных данных и токенов. Также он способен определять, какой трафик авторизован для прохождения через API к вышестоящим сервисам. Вы можете проверить все доступные плагины аутентификации.
Давайте создадим нового потребителя для наших серверных API и добавим плагин basic-auth к существующему маршруту, чтобы только разрешенный пользователь мог получить к ним доступ.
Создание нового потребителя для серверных API
Следующая команда создаст нового потребителя с его учетными данными, такими как имя пользователя и пароль:
curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "username": "consumer1", "plugins": { "basic-auth": { "username": "username1", "password": "password1" } } }
Добавление плагина basic auth к существующим маршрутам Products и Services
Теперь мы настроим плагин basic-auth для маршрутов, чтобы APISIX проверял заголовок запроса с учетными данными потребителя API каждый раз, когда вызываются API:
curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "name": "Create a route with Azure function plugin", "plugins": { "azure-functions": { "function_uri": "https://serverless-apis.azurewebsites.net/api/products", "ssl_verify": false }, "basic-auth": {} }, "uri": "/products" }'
curl http://127.0.0.1:9180/apisix/admin/routes/2 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "plugins": { "azure-functions": { "function_uri": "https://serverless-apis.azurewebsites.net/api/reviews", "ssl_verify": false }, "basic-auth": {} }, "uri": "/reviews" }'
Тестирование плагина basic auth
Теперь, если мы запросим серверные API без учетных данных пользователя в заголовке, мы получим ошибку неавторизованного доступа:
curl -i http://127.0.0.1:9080/products HTTP/1.1 401 Unauthorized {"message":"Missing authorization in request"}
Результат соответствует нашим ожиданиям. Но если мы предоставим правильные учетные данные пользователя в запросе и получим доступ к тому же конечному пункту, он должен работать корректно:
curl -i -u username1:password1 http://127.0.0.1:9080/products HTTP/1.1 200 OK
Мы проверили идентичность клиента, пытающегося запросить серверные API, с помощью плагина базовой аутентификации с использованием Apache APISIX.
Применение политик ограничения скорости для серверных API
В этом разделе мы защитим серверные API от злоупотреблений, применив политику ограничения скорости. В Apache APISIX Gateway мы можем применить ограничение скорости, чтобы ограничить количество входящих вызовов.
Применение и тестирование политики ограничения скорости
С существующими конфигурациями маршрутов для функций Products и Reviews мы можем применить политику ограничения скорости с плагином limit-count, чтобы защитить наш API от аномального использования. Мы ограничим количество вызовов API до 2 за 60 секунд для каждого потребителя API.
Чтобы включить плагин limit-count для существующего маршрута Products, нам нужно добавить плагин в атрибут plugins в нашей конфигурации маршрута Json:
curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "name": "Create a route with Azure function plugin", "plugins": { "azure-functions": { "function_uri": "https://serverless-apis.azurewebsites.net/api/products", "ssl_verify": false }, "basic-auth": {}, "limit-count": { "count": 2, "time_window": 60, "rejected_code": 403, "rejected_msg": "Requests are too frequent, please try again later." } }, "uri": "/products" }'
Apache APISIX обработает первые два запроса как обычно. Однако третий запрос в тот же период вернет код 403 HTTP Forbidden с нашим пользовательским сообщением об ошибке:
HTTP/1.1 403 Forbidden {"error_msg":"Requests are too frequent, please try again later."}
Следующие шаги
В этой статье мы шаг за шагом узнали, как создавать серверные API на основе Java с помощью Azure Functions и Apache APISIX Gateway для управления вашими API на протяжении всего их жизненного цикла, от предоставления серверных API в качестве вышестоящих сервисов в APISIX до правильной защиты и применения ограничения скорости для ограничения количества запросов. Это открывает двери для других случаев использования интеграции API Gateway и серверных API.
Вы можете изучить другие возможности APISIX Gateway, объединяя различные встроенные плагины для преобразования запросов, мониторинга доступности, производительности и использования наших серверных API, кэширования ответов API и дальнейшего их развития путем версионирования API, что помогает вам сократить время разработки, увеличить масштабируемость и сэкономить затраты.
Apache APISIX — это полностью открытое решение для API Gateway. Если вам требуются более продвинутые функции управления API для серверных API, вы можете использовать API7 Enterprise или API7 Cloud, которые основаны на APISIX.