Как управлять сторонними пакетами OpenResty через LuaRocks и OPM?
API7.ai
September 17, 2022
В предыдущем посте мы получили общий обзор некоторых официальных проектов OpenResty. Однако, если мы используем OpenResty в производственной среде, этих библиотек, которые поставляются с пакетом OpenResty, недостаточно. Например, нет библиотеки lua-resty для отправки HTTP-запросов, и нет способа взаимодействовать с Kafka.
Так что же нам делать?
Поскольку OpenResty не является форком NGINX, ни переупаковкой NGINX с некоторыми стандартными библиотеками, а просто использует NGINX как базовую сетевую библиотеку.
При использовании NGINX вы не думаете о том, как инициировать пользовательские HTTP-запросы и как взаимодействовать с Kafka. В мире OpenResty, благодаря cosocket, разработчики могут быстро написать lua-resty-http и lua-resty-kafka для решения этих задач, так же как это можно сделать с языками разработки, такими как Python, PHP и т.д.
Еще один совет для вас: вы не должны использовать библиотеки из мира Lua для решения вышеуказанных проблем, а вместо этого использовать библиотеки lua-resty-* на основе cosocket. Библиотеки из мира Lua могут привести к блокировкам, что снизит производительность высокопроизводительного сервиса на несколько порядков. Это распространенная ошибка среди новичков в OpenResty, и ее нелегко заметить.
Итак, как мы можем найти эти неблокирующие библиотеки lua-resty-*? Далее я расскажу вам о следующих способах.
OPM
OPM (OpenResty Package Manager) — это менеджер пакетов, который поставляется с OpenResty и может быть использован после установки OpenResty. Мы можем попытаться найти библиотеку для отправки HTTP-запросов с помощью команды opm search http.
Первый запрос может быть медленным, обычно занимая несколько секунд. opm.openresty.org выполнит запрос из базы данных PostgreSQL и кэширует результаты на некоторое время.
openresty/lua-resty-upload Streaming reader and parser for HTTP file uploading based on ngx_lua cosocket
Когда вы видите этот результат, вы можете задаться вопросом: какое отношение этот пакет lua-resty-upload имеет к отправке HTTP?
Оказывается, при поиске OPM ищет как имя пакета, так и его описание, используя ключевое слово. Именно поэтому поиск занимает несколько секунд. Он выполняет полнотекстовый поиск строки внутри PostgreSQL.
Но, в любом случае, этот результат не очень удобен. Давайте изменим ключевое слово и снова выполним поиск.
$ opm search lua-resty-http ledgetech/lua-resty-http Lua HTTP client cosocket driver for OpenResty/ngx_lua pintsized/lua-resty-http Lua HTTP client cosocket driver for OpenResty/ngx_lua agentzh/lua-resty-http Lua HTTP client cosocket driver for OpenResty/ngx_lua
В мире OpenResty, если вы реализуете пакет с использованием cosocket, вы должны использовать префикс lua-resty, это негласное правило.
Вернемся к результатам поиска: OPM использует адрес репозитория GitHub автора в качестве имени пакета, т.е. GitHub ID / имя репозитория. Он возвращает три сторонние библиотеки lua-resty-http. Какую из них выбрать?
Прежде чем выбрать пакет, давайте посмотрим на количество звезд и дату последнего обновления: всего несколько звезд; последнее обновление было в 2016 году. Это заброшенный проект. При более глубоком рассмотрении, pintsized/lua-resty-http и ledgetech/lua-resty-http указывают на один и тот же репозиторий. Так что неважно, какой из них вы выберете, это одно и то же.
Кроме того, сайт OPM довольно прост и не предоставляет количество загрузок пакета или его зависимости. Вам придется потратить больше времени, чтобы выяснить, какие библиотеки lua-resty подходят для использования, хотя это должно быть задачей сопровождающего.
LuaRocks
LuaRocks — это еще один менеджер пакетов для мира OpenResty, появившийся раньше OPM. В отличие от OPM, который содержит только пакеты, связанные с OpenResty, LuaRocks также включает библиотеки из мира Lua. Например, LuaSQL-MySQL в LuaRocks — это пакет для подключения к MySQL в мире Lua, и его нельзя использовать в OpenResty.
Вернемся к примеру с библиотекой HTTP, попробуем найти ее с помощью LuaRocks.
$ luarocks search http
Как видите, он также возвращает множество пакетов.
Давайте изменим ключевое слово еще раз.
$ luarocks search lua-resty-http
На этот раз возвращен только один пакет. Мы можем перейти на сайт LuaRocks и посмотреть детали этого пакета. Вот скриншот страницы сайта.

На скриншоте выше указаны автор, лицензия, URL GitHub, количество загрузок, краткое описание функций, история версий, зависимости и т.д. В отличие от OPM, LuaRocks не использует информацию GitHub напрямую, а требует, чтобы разработчики зарегистрировались в LuaRocks отдельно.
Открытый проект API-шлюза, Apache APISIX, использует LuaRocks для управления пакетами. Давайте кратко рассмотрим, как написана конфигурация управления пакетами в APISIX.
Последняя версия APISIX — 2.15, и вы можете найти файл apisix-2.15.0-0.rockspec в проекте Apache APISIX.
package = "apisix" version = "2.15.0-0" supported_platforms = {"linux", "macosx"} source = { url = "git://github.com/apache/apisix", branch = "2.15.0", } description = { summary = "Apache APISIX is a cloud-native microservices API gateway, delivering the ultimate performance, security, open source and scalable platform for all your APIs and microservices.", homepage = "https://github.com/apache/apisix", license = "Apache License 2.0", } dependencies = { "lua-resty-ctxdump = 0.1-0", "lua-resty-dns-client = 6.0.2", "lua-resty-template = 2.0", "lua-resty-etcd = 1.8.2", "api7-lua-resty-http = 0.2.0", "lua-resty-balancer = 0.04", "lua-resty-ngxvar = 0.5.2", "lua-resty-jit-uuid = 0.0.7", "lua-resty-healthcheck-api7 = 2.2.0", "api7-lua-resty-jwt = 0.2.4", "lua-resty-hmac-ffi = 0.05", "lua-resty-cookie = 0.1.0", "lua-resty-session = 3.10", "opentracing-openresty = 0.1", "lua-resty-radixtree = 2.8.2", "lua-protobuf = 0.3.4", "lua-resty-openidc = 1.7.5", "luafilesystem = 1.7.0-2", "api7-lua-tinyyaml = 0.4.2", "nginx-lua-prometheus = 0.20220527", "jsonschema = 0.9.8", "lua-resty-ipmatcher = 0.6.1", "lua-resty-kafka = 0.20-0", "lua-resty-logger-socket = 2.0.1-0", "skywalking-nginx-lua = 0.6.0", "base64 = 1.5-2", "binaryheap = 0.4", "api7-dkjson = 0.1.1", "resty-redis-cluster = 1.02-4", "lua-resty-expr = 1.3.1", "graphql = 0.0.2", "argparse = 0.7.1-1", "luasocket = 3.0rc1-2", "luasec = 0.9-1", "lua-resty-consul = 0.3-2", "penlight = 1.9.2-1", "ext-plugin-proto = 0.5.0", "casbin = 1.41.1", "api7-snowflake = 2.0-1", "inspect == 3.1.1", "lualdap = 1.2.6-1", "lua-resty-rocketmq = 0.3.0-0", "opentelemetry-lua = 0.1-3", "net-url = 0.9-1", "xml2lua = 1.5-2", "nanoid = 0.1-1", "lua-resty-mediador = 0.1.2-1" } build = { type = "make", build_variables = { CFLAGS="$(CFLAGS)", LIBFLAG="$(LIBFLAG)", LUA_LIBDIR="$(LUA_LIBDIR)", LUA_BINDIR="$(LUA_BINDIR)", LUA_INCDIR="$(LUA_INCDIR)", LUA="$(LUA)", OPENSSL_INCDIR="$(OPENSSL_INCDIR)", OPENSSL_LIBDIR="$(OPENSSL_LIBDIR)", }, install_variables = { ENV_INST_PREFIX="$(PREFIX)", ENV_INST_BINDIR="$(BINDIR)", ENV_INST_LIBDIR="$(LIBDIR)", ENV_INST_LUADIR="$(LUADIR)", ENV_INST_CONFDIR="$(CONFDIR)", }, }
Как видно из файла, зависимости смешаны с библиотеками lua-resty-* и библиотеками из мира Lua, которые можно установить только частично с помощью OPM. После написания конфигурации используйте команду загрузки LuaRocks, чтобы загрузить эту конфигурацию, и пользователь сможет использовать LuaRocks для загрузки и установки APISIX.
LuaRocks поддерживает это. Вы можете указать путь и имя исходного кода C в файле .rockspec, и LuaRocks скомпилирует его локально для вас. OPM пока не поддерживает эту функцию.
awesome-resty
Проект awesome-resty поддерживает почти все доступные пакеты для OpenResty, организованные по категориям. Это лучшее место, когда вы не уверены, есть ли подходящий сторонний пакет.
Возьмем библиотеку HTTP в качестве примера. В awesome-resty она, естественно, относится к категории networking.
lua-resty-http by @pintsized — Lua HTTP client cosocket driver for OpenResty / ngx_lua lua-resty-http by @liseen — Lua http client driver for the ngx_lua based on the cosocket API lua-resty-http by @DorianGray — Lua HTTP client driver for ngx_lua based on the cosocket API lua-resty-http-simple — Simple Lua HTTP client driver for ngx_lua lua-resty-httpipe — Lua HTTP client cosocket driver for OpenResty / ngx_lua lua-resty-httpclient — Nonblocking Lua HTTP Client library for aLiLua & ngx_lua lua-httpcli-resty — Lua HTTP client module for OpenResty lua-resty-requests — Yet Another HTTP Library for OpenResty
Мы видим, что есть восемь сторонних библиотек для lua-resty-http. Сравнивая с предыдущими результатами, мы нашли только 2 с помощью OPM и только 1 в LuaRocks. Однако, если сложно выбрать, используйте первую, которая совпадает с той, что в LuaRocks.
Для инженеров, готовых экспериментировать, я рекомендую последнюю библиотеку: lua-resty-requests, более удобную библиотеку для доступа к HTTP с таким же стилем интерфейса, как у знаменитой библиотеки Requests в Python. Если вы, как и я, любите Python, вам понравится lua-resty-requests, которая создана активным участником сообщества OpenResty tokers, так что вы можете использовать ее с уверенностью.
Заключение
Для процветания открытого проекта необходимы не только передовые технологии, хорошая документация и полное тестирование, но и экосистема, которая объединяет больше разработчиков и компаний. Как говорится в Apache Way: сообщество важнее кода.
Для OpenResty нет систематических учебных материалов, нет официального руководства по коду, и многие точки оптимизации написаны в открытых проектах, но большинство разработчиков знают, о чем говорят, но не знают, почему. Это цель этой электронной книги. После ее изучения я надеюсь, что вы сможете писать более эффективный код на OpenResty и более эффективно участвовать в связанных с OpenResty открытых проектах, например, Apache APISIX.
Что вы думаете об экосистеме OpenResty? Не стесняйтесь оставлять комментарии, давайте обсудим. Также приветствуется распространение этой статьи.