Начните работу с настраиваемыми плагинами Kong за считанные минуты.
Что такое Конг?
Если вы когда-либо занимались разработкой микросервисов, возможно, вы слышали о термине API Gateway раньше. Шлюз API - это шаблон архитектурного проектирования, связанный с микросервисами, который решает проблему того, как клиенты должны взаимодействовать с большим количеством дискретных микросервисов, составляющих более крупное приложение или платформу. Шлюзы API решают эту проблему, предоставляя единую точку доступа для всех клиентов к приложению.
Как правило, единственная задача шлюза API - принимать запросы и передавать их соответствующей серверной службе, но на самом деле у них часто есть еще несколько обязанностей, включая ограничение скорости, аутентификацию, авторизацию, кэширование, фильтрацию, ведение журнала и многое другое.
Если посмотреть на ландшафт сервисов и технологий API Gateway, недостатка в потенциальных предложениях нет. Большинство крупных облачных игроков имеют свои собственные шлюзы, Amazon API Gateway для AWS, Управление API в Azure и, в первую очередь, Apigee для GCP. Однако существует множество вариантов помимо тех, которые предлагаются облачными провайдерами, в том числе более устоявшиеся корпоративные варианты, такие как Anypoint Platform от Mulesoft, и целый ряд новых вариантов, таких как Kong, Tyk и Express Gateway. , все из которых предлагают версии с открытым исходным кодом. Из этих трех последних, Kong, возможно, является наиболее широко используемым и многофункциональным, так что это хорошее место для начала.
По своей сути Kong - это приложение, написанное на Lua и построенное на базе Nginx с использованием OpenResty. Kong также предлагает множество дополнительных функций как часть своей версии OSS и даже больше в своем корпоративном пакете. На мой взгляд, Kong был самым интересным из шлюзов API по трем причинам.
- Он предлагает бесплатную версию с открытым исходным кодом, которая обладает широкими возможностями и работает прямо из коробки.
- Он очень расширяемый, с возможностью добавлять собственные плагины в дополнение к ряду очень удобных встроенных плагинов.
- Это супер работоспособность. При правильной настройке и инициализации Kong работает молниеносно.
Плагины Kong
Kong - это приложение Lua, предназначенное для загрузки и выполнения модулей Lua (которые мы чаще называем «надстройками») и предоставляет для них всю среду разработки, включая SDK, абстракции базы данных, миграции и более.
Kong допускает расширяемость своих возможностей обработки запросов путем добавления пользовательских подключаемых модулей Lua. Эти плагины могут добавлять практически любую функциональность, о которой вы только можете подумать, включая прокси, модификацию запроса / ответа, ограничение скорости и многое другое. Плагины можно применять к отдельным маршрутам, целым API или глобально на экземпляре Kong. В настоящее время плагины Kong могут быть написаны только на Lua, но поддержка плагинов, написанных на Go, как ожидается, будет добавлена в версии 2.0, которая скоро появится.
Написание собственного плагина
Kong предоставляет Комплект для разработки плагинов (PDK), который предоставляет различные методы для взаимодействия с запросом и выполнения других действий или доступа к хранилищам данных из области действия плагина. Если вы похожи на меня и не знакомы с Lua, я подумал, что это пошаговое руководство было полезно для начала.
Типичный плагин должен иметь следующую структуру для успешной установки в Kong:
<plugin-name> ├── kong │ └── plugins │ └── <plugin-name> │ ├── handler.lua │ └── schema.lua └── <plugin-name>-<version>.rockspec
Давайте кратко рассмотрим каждый из этих файлов.
handler.lua
Файл handler.lua должен возвращать таблицу, реализующую функции, которые вы хотите выполнить. Другими словами, этот файл будет обрабатывать ядро логики вашего плагина. Хотя вы можете создавать дополнительные файлы Lua, содержащие дополнительную логику, handler.lua - единственный модуль, который на самом деле будет напрямую вызван Kong во время выполнения. Подробнее о возможностях модуля handler.lua можно прочитать здесь.
schema.lua
Модуль schema.lua должен возвращать таблицу Lua со свойствами, которые будут определять, как ваши плагины могут быть позже настроены пользователями. Подробнее о параметрах, доступных для модуля schema.lua, можно прочитать здесь.
‹Plugin_name› - ‹version› .rockspec
LuaRocks - это менеджер пакетов для языка программирования Lua, а файлы rockspec используются для определения пакета, который также называется рок. Чтобы упаковать новый плагин, вам нужно будет предоставить файл rockspec.
Бегущий Конг
Для простоты запуска и тестирования Kong локально я рекомендую использовать docker-compose и создавать свою собственную конфигурацию на основе собственных реализаций докеров Kong. В дополнение к этому, я также рекомендую запустить Konga, который представляет собой сторонний графический интерфейс, который можно использовать для взаимодействия с Kong Admin API в браузере.
Для этого нам понадобится Dockerfile для запуска самого Kong, а также файл docker-compose, который предоставит Postgres (для запуска Kong), а также Konga и MongoDB (зависимость Konga). Я не буду вдаваться в подробности этих документов, но вы можете просмотреть все файлы этого проекта здесь.
Dockerfile
docker-compose.yml
Другие скрипты и конфигурации
Есть также несколько других скриптов и конфигураций, которые нам понадобятся, чтобы связать все вместе. Для краткости я не буду перечислять их содержимое здесь - но вы можете просмотреть их в общем репо.
Эти файлы включают файл kong.conf, который будет использоваться для настройки экземпляра Kong. Нам также понадобится файл docker-entrypoint.sh, на который вы можете ссылаться в Dockerfile - этот файл используется для определения поведения при запуске Kong, включая запуск небольшого скрипта для установки наших настраиваемых плагинов.
Наконец, нам нужно добавить небольшой исходный файл пользователя для начальной загрузки Konga. Я назвал свой kus.js, и вы можете увидеть ссылку на него в файле docker-compose.yml.
Наш настраиваемый плагин
Мы собираемся создать фильтр конфиденциальных данных, который будет пытаться обнаруживать любые заголовки секретных токенов в наших заголовках ответов и удалять их. Назовем наш плагин hide-token.
Примечание: это просто иллюстративный пример. Я основал свой код на более мощном встроенном плагине Response-Transformer, который, вероятно, также может справиться с этим вариантом использования.
handler.lua
schema.lua
header_filter.lua
Я также добавил отдельный файл, содержащий фактическую логику удаления заголовка. Это должно было разделить обязанности, а также показать, как включить дополнительный файл помимо двух строго обязательных.
скрытый токен -1.0.0.rockspec
Подробнее о формате Rockpec вы можете узнать здесь.
Установка плагина
На этом этапе установка плагина должна быть довольно простой, если вы следовали инструкциям. Нам просто нужно внести следующие изменения:
- Добавьте небольшой скрипт, который будет вызываться из вашего файла docker-entrypoint.sh. Этому сценарию просто нужно построить плагин, вызвав
luarocks make
в том же каталоге, что и ваш файл rockspec.
2. Добавьте название вашего плагина в атрибут plugins в файле kong.conf.
Вот и все.
Тестирование
Начнем с запуска нашей среды, запустив docker-compose build && docker-compose up -d
в корне нашего проекта. (На вытягивание всех слоев может потребоваться некоторое время). Если этот шаг прошел успешно, вы сможете перейти к http://localhost:1337
и увидеть экран входа в Konga.
Вы можете войти в Konga, используя учетные данные из исходного файла пользователя. После входа в систему вы сможете щелкнуть элемент Plugins
в меню боковой панели, а затем щелкнуть + Add Global Plugin
и увидеть свой настраиваемый плагин в категории Other
. Вы можете добавить свой плагин и настроить его по своему усмотрению.
Теперь, когда у нас настроен глобальный плагин, мы должны добавить Сервис и Маршрут для тестирования - я в конечном итоге использовал для этого mockoon после того, как мне не повезло ни с одной из бесплатных размещенных служб, которые я нашел. Было приятно использовать его для специального тестирования; супер простой и гибкий.
Моя фиктивная конечная точка должна возвращать JSON {“status”:”A-OK”}
, а также заголовки SECRET-TOKEN: MUH SECRETZ
и NOT-SO-SECRET: abc123
вместе с ответом 200 OK.
Для своего теста я добавил новую службу для прокси в http://host.docker.internal:3000/
, которая будет перенаправлять из контейнера докеров на мой MacBook и попадать в открытый порт для mockoon. Затем я добавил к этой службе новый маршрут, чтобы соответствовать всем входящим запросам, не удаляя путь с помощью регулярного выражения /.*
.
Перед настройкой моего плагина ответ в свернутом виде выглядел так.
< HTTP/1.1 200 OK < Content-Type: application/json; charset=utf-8 < Content-Length: 17 < Connection: keep-alive < X-Powered-By: Express < SECRET-TOKEN: MUH SECRETZ < NOT-SO-SECRET: abc123 < ETag: W/"11-xthkVpV/BvEyfleURt8wQpCqVD8" < Date: Sun, 12 Jan 2020 16:52:20 GMT < X-Kong-Upstream-Latency: 1528 < X-Kong-Proxy-Latency: 11 < Via: kong/1.4.3 < * Connection #0 to host 0.0.0.0 left intact {"status":"A-OK"}
После того, как мой плагин включил фильтрацию заголовка SECRET-TOKEN
, ответ будет выглядеть так. Обратите внимание, что отсутствует определенный заголовок.
< HTTP/1.1 200 OK < Content-Type: application/json; charset=utf-8 < Content-Length: 17 < Connection: keep-alive < X-Powered-By: Express < NOT-SO-SECRET: abc123 < ETag: W/"11-xthkVpV/BvEyfleURt8wQpCqVD8" < Date: Sun, 12 Jan 2020 16:54:07 GMT < X-Kong-Upstream-Latency: 2322 < X-Kong-Proxy-Latency: 14 < Via: kong/1.4.3 < * Connection #0 to host 0.0.0.0 left intact {"status":"A-OK"}
Заключение
Это был всего лишь простой пример запуска Kong локально в Docker и добавления простого настраиваемого плагина - это лишь малая часть того, на что способен Kong. Сообщите мне ниже, если есть какие-либо другие темы, связанные с Kong, о которых вы хотели бы услышать, или если какие-либо из его конкурентов, такие как Tyk или express-gateway, представляют интерес.
Привет, я Эндрю Скотт, разработчик программного обеспечения и создатель Охрона. Ochrona фокусируется на улучшении безопасности Python, предоставляя понимание зависимостей вашего проекта и делая это с упором на опыт разработчика (DX). Подпишитесь на нашу рассылку здесь!