Плагины Kong как микросервисы: написание сервера с одним плагином для Kong в Go

Плагины Kong как микросервисы: написание сервера с одним плагином для Kong в Go

15 марта 2022 г.

Многие разработчики и инженеры DevOps развертывали Kong Gateway перед своими микросервисами на основе приложений. Несмотря на то, что обширная библиотека встроенных плагинов может добавить большую гибкость и мощность вашим развертываниям, вы можете столкнуться с случайным случаем использования, когда вам нужен пользовательский плагин. которого просто нет в библиотеке.


К счастью, вы можете использовать Go для создания и запуска плагинов для Kong Gateway.


Этот пост расскажет, как настроиться для написания плагинов Kong.


Мы рассмотрим части жизненного цикла запроса/ответа, к которым вы можете подключиться, и рассмотрим пример того, как собрать все это вместе.


Пользовательские плагины для Kong можно получить с помощью сервера плагинов, специфичного для Go, который использует модель sidecar для динамической загрузки и запуска плагина, написанного на Go. Связь между подключаемым модулем и сервером подключаемого модуля осуществляется через сокет домена Unix. К счастью, все это упрощается с помощью Kong [Go Plugin Development Kit] (https://pkg.go.dev/github.com/Kong/go-pdk) (PDK).


Зачем вам писать собственный плагин?


В конечном счете, возможность написать свой собственный плагин Go и интегрировать его с Kong Gateway обеспечивает почти безграничную гибкость в течение жизненного цикла запросов и ответов. Классическим примером может быть простое обогащение запросов и ответов: представьте, что вы добавляете или удаляете заголовки, чтобы повлиять на маршрутизацию запросов, или включаете индивидуальную проверку запросов или регистрируете запросы для аудита.


Использование возможностей Kong Gateway при построении настраиваемой логики шлюза для вашего уникального бизнес-кейса дает вам лучшее из обоих миров.


Хватит говорить. Приступим к делу.


Настройка разработки


Для этого примера предположим, что вы уже сделали следующее:


  1. [Установлен Go] (https://go.dev/dl/)

  1. Установлен Kong локально на вашем компьютере.

  1. Installed decK для управления конфигурацией службы, хотя вы также можете настроить Kong с помощью Admin API.

Первым шагом для настройки среды является создание каталога и нашего файла мода Go:


$ mkdir Kong-Go-плагин


$ cd Kong-Go-плагин/


~/kong-go-plugin$ go mod init kong-go-plugin


go: создание нового go.mod: модуль kong-go-plugin


Затем мы запускаем go get и go build для сборки сервера плагинов:


~/kong-go-plugin$ go get -d -v github.com/Kong/go-pluginserver


go: загрузка github.com/Kong/go-pluginserver v0.6.1


go: загрузка github.com/Kong/go-pdk v0.6.0


перейти: скачать github.com/ugorji/go v1.2.1


перейти: скачать github.com/ugorji/go/codec v1.2.1


go get: добавлен github.com/Kong/go-pluginserver v0.6.1


~/kong-go-plugin$ перейти на github.com/Kong/go-pluginserver


По умолчанию Kong ожидает, что «go-pluginserver» находится в «/usr/local/bin», но вы можете изменить это поведение, изменив значение для «go_pluginserver_exe» в конфигурации Kong. Для согласованности давайте переместим только что созданный двоичный файл в папку по умолчанию.


~/kong-go-plugin$ sudo mv go-pluginserver /usr/local/bin/


Еще одно значение по умолчанию, которое мы хотим изменить, — это go_plugins_dir, для которого по умолчанию установлено значение off. Здесь Kong ищет наши плагины для Go. В этом примере мы будем использовать $HOME/goplugins/, поэтому, если вы будете следовать инструкциям, вам нужно будет обновить свою конфигурацию, чтобы она соответствовала.


Прежде чем погрузиться в код, последний момент заключается в том, что могут возникнуть проблемы с согласованностью. Обычно они проявляются в виде сообщений об ошибках, подобных следующим:


не удалось открыть плагин kong: plugin.Open("/path/go-plugins/myplugin"): плагин был собран с другой версией пакета github.com/Kong/go-pdk/bridge


Если вы столкнулись с этим сообщением, ознакомьтесь с документацией [здесь] (https://docs.konghq.com/gateway-oss/2.1.x/go/#environment-consistency-constraints) для получения дополнительной информации о возможных основных причинах. . Теперь, когда мы настроили нашу среду разработки, мы можем начать программировать наш плагин!


Время кодирования!


Наш следующий шаг — написать плагин и убедиться, что он работает должным образом. Мы начнем с простого фрагмента кода, чтобы добавить заголовок к ответу. Если вы следуете всем инструкциям, вы можете скопировать это прямо в файл с именем goplug.go:


основной пакет


импорт (


"github.com/Конг/го-пдк"


введите структуру конфигурации {


Прикрепить логическое значение


интерфейс func New(){} {


возврат &Конфигурация{}


func (c Config) Access(kong pdk.PDK) {


если c.Attach {


kong.ServiceRequest.SetHeader("x-goplug", "Устанавливается пользовательским плагином go")


Если вы работали с Go раньше, это должно быть довольно просто. Тем не менее, вы можете найти более подробную информацию в [Документации плагина Kong Go] (https://docs.konghq.com/gateway-oss/2.1.x/go/#development). Документация объясняет структуры и функции, а также предоставляет полный список фаз, к которым вы можете подключиться. На данный момент мы используем фазу «Доступ», поэтому мы можем прикрепить заголовок до того, как он будет проксирован вышестоящей службе. Это полезно в тех случаях, когда вы хотите добавить данные к ответу на основе некоторых входящих критериев, которые может использовать вышестоящая служба.


Затем нам нужно собрать наш плагин и «установить» его с помощью go build -buildmode plugin goplug.go && mv goplug.so ~/goplugins/


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


~/kong-go-plugin$ sudo kong перезапустить


Теперь наш плагин загружен и готов к использованию, но нам все еще нужен сервис для его использования. Я использовал [decK] (https://docs.konghq.com/deck/) и добавил следующее в файл kong.yaml, чтобы протестировать плагин. Все, что вам нужно сделать, это запустить deck sync после того, как вы создали файл kong.yaml.


_format_version: "1.1"


Сервисы:


  • хост: mockbin.org

имя: пример_сервис


порт: 80


протокол: http


плагины:


  • название: goplug

конфигурация:


прикрепить: правда


маршруты:


  • название: насмешливое

пути:


  • /насмехаться

полоса_путь: правда


Загрузив наш плагин и создав сервис, мы готовы к тесту. Просто сделайте запрос на сервис, и мы увидим плагин в действии!


~/kong-go-plugin$ curl -s -i -X ​​ПОЛУЧИТЬ http://localhost:8000/mock/request \


| grep "x-goplug"


x-goplug: устанавливается пользовательским плагином go.


Успех! На всякий случай давайте свяжем еще одну фазу жизненного цикла запросов и ответов. В этой следующей функции мы перейдем к фазе «Ответ», чтобы добавить заголовок отладки на случай, если наш плагин столкнется с проблемами.


func (c Config) Response(kong pdk.PDK) {


v := время выполнения. Версия ()


kong.Response.AddHeader("x-goplug-go-версия", v)


Добавьте указанную выше функцию в goplug.go, затем повторите процесс, чтобы перестроить плагин. Затем перезапустите Kong. Когда мы повторно запускаем нашу команду curl, мы видим, что x-goplug включен в запрос к вышестоящей службе, но удаляется перед отправкой ответа обратно клиенту.


$ curl -s -i -X ​​ПОЛУЧИТЬ http://localhost:8000/mock/request \


| grep "x-goplug-go-версия"


x-goplug-go-версия: go1.16.5


Давайте проведем некоторые параллели с реальными приложениями. Здесь мы показали, как вы можете получать данные из запроса и превращать их в полезную информацию, готовую к обработке вышестоящей службой, находящейся под управлением Kong Gateway. Что еще лучше, так это то, что вся эта фоновая работа прозрачна для клиента. Мы также показали, как вы можете изменить ответ клиенту. С помощью этой возможности вы можете упростить устранение неполадок или даже передавать обратно данные об ограничении скорости (например, количество оставшихся запросов API в день или час), чтобы информировать своих клиентов об их использовании.


Заворачивать


В этом посте мы многое рассмотрели, поэтому давайте завершим его кратким обзором. Вот что мы рассмотрели:


  • Что вам нужно для разработки плагинов Go для использования с Kong Gateway

  • Почему вы можете создать собственный плагин, а не использовать плагин, встроенный в Kong Gateway

  • Настройте локальную среду разработки, которая поддерживает создание плагинов Kong на основе Go.

  • Использовала эту локальную среду разработки для доступа к жизненному циклу запроса/ответа для изменения данных на лету.

Теперь, когда процесс не работает, его легко повторить для любого варианта использования, который у вас может быть для разработки плагинов Kong на основе Go. Вы можете найти документацию Kong по поддержке Go на веб-сайте Kong вместе с некоторыми другими примерами и пошаговыми руководствами.



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE