Начните работу с настраиваемыми плагинами 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 по трем причинам.

  1. Он предлагает бесплатную версию с открытым исходным кодом, которая обладает широкими возможностями и работает прямо из коробки.
  2. Он очень расширяемый, с возможностью добавлять собственные плагины в дополнение к ряду очень удобных встроенных плагинов.
  3. Это супер работоспособность. При правильной настройке и инициализации 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 вы можете узнать здесь.

Установка плагина

На этом этапе установка плагина должна быть довольно простой, если вы следовали инструкциям. Нам просто нужно внести следующие изменения:

  1. Добавьте небольшой скрипт, который будет вызываться из вашего файла 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). Подпишитесь на нашу рассылку здесь!