Comment gérer les packages tiers d'OpenResty via LuaRocks et OPM ?
API7.ai
September 17, 2022
Dans le post précédent, nous avons obtenu un aperçu général de certains projets officiels d'OpenResty. Cependant, si nous utilisons OpenResty pour un environnement de production, ces bibliothèques fournies avec le package OpenResty sont insuffisantes. Par exemple, il n'y a pas de bibliothèque lua-resty
pour envoyer des requêtes HTTP, et il n'y a aucun moyen d'interagir avec Kafka.
Alors, que devrions-nous faire ?
Parce qu'OpenResty n'est pas un fork de NGINX, ni un reconditionnement de NGINX avec quelques bibliothèques standard, mais utilise simplement NGINX comme bibliothèque réseau sous-jacente.
Lorsque vous utilisez NGINX, vous ne pensez pas à la manière d'initier des requêtes HTTP personnalisées ou à la manière d'interagir avec Kafka. Et dans le monde d'OpenResty, grâce à cosocket
, les développeurs peuvent rapidement écrire lua-resty-http
et lua-resty-kafka
pour répondre à ces besoins, tout comme vous pouvez le faire avec des langages de développement comme Python, PHP, etc.
Un autre conseil pour vous : vous ne devriez pas utiliser de bibliothèques du monde Lua pour résoudre les problèmes ci-dessus, mais plutôt utiliser les bibliothèques lua-resty-*
basées sur cosocket
. Les bibliothèques du monde Lua risquent d'introduire des blocages, transformant un service autrement performant en un service beaucoup plus lent. C'est une erreur courante pour les débutants d'OpenResty et elle n'est pas facilement détectable.
Alors, comment trouvons-nous ces bibliothèques lua-resty-*
non bloquantes ? Ensuite, laissez-moi vous présenter les méthodes suivantes.
OPM
OPM (OpenResty Package Manager) est le gestionnaire de paquets fourni avec OpenResty et peut être utilisé après avoir installé OpenResty. Nous pouvons essayer de trouver la bibliothèque pour envoyer des requêtes HTTP en utilisant la commande opm search http
.
La requête peut être lente la première fois, prenant généralement quelques secondes. opm.openresty.org effectuera une requête à partir de la base de données PostgreSQL et mettra en cache les résultats pendant un certain temps.
openresty/lua-resty-upload Lecteur et analyseur en streaming pour le téléchargement de fichiers HTTP basé sur ngx_lua cosocket
Lorsque vous voyez ce résultat, vous pourriez vous demander : quel est le rapport entre ce package lua-resty-upload
et l'envoi de requêtes HTTP ?
Il s'avère que lors de la recherche, OPM a cherché à la fois le nom du package et le profil du package en utilisant le mot-clé. C'est pourquoi la recherche ci-dessus prend quelques secondes. Elle effectue une recherche en texte intégral de la chaîne dans PostgreSQL.
Mais, de toute façon, ce retour n'est pas très convivial. Modifions le mot-clé et recherchons à nouveau.
$ opm search lua-resty-http
ledgetech/lua-resty-http Client HTTP Lua basé sur cosocket pour OpenResty/ngx_lua
pintsized/lua-resty-http Client HTTP Lua basé sur cosocket pour OpenResty/ngx_lua
agentzh/lua-resty-http Client HTTP Lua basé sur cosocket pour OpenResty/ngx_lua
Dans le monde d'OpenResty, si vous implémentez un package en utilisant cosocket
, vous devez utiliser le préfixe lua-resty
, c'est une règle non écrite.
En regardant les résultats de la recherche, OPM utilise l'adresse du dépôt GitHub du contributeur comme nom du package, c'est-à-dire ID GitHub / nom du dépôt. Il retourne trois bibliothèques tierces lua-resty-http
. Laquelle devrions-nous choisir ?
Avant de choisir le package, regardons son nombre d'étoiles et la date de la dernière mise à jour : seulement une douzaine d'étoiles ; la dernière mise à jour date de 2016. C'est un projet abandonné. En creusant plus profondément, pintsized/lua-resty-http
et ledgetech/lua-resty-http
pointent vers le même dépôt. Donc, peu importe lequel vous choisissez, c'est le même.
De plus, le site web d'OPM est relativement simple et ne fournit pas le nombre de téléchargements du package ou les dépendances de ce package. Il serait utile de passer plus de temps à déterminer quelles bibliothèques lua-resty
sont les bonnes à utiliser, alors que cela devrait être le travail du mainteneur.
LuaRocks
LuaRocks est un autre gestionnaire de paquets pour le monde d'OpenResty, né avant OPM. Contrairement à OPM, qui ne contient que des packages liés à OpenResty, LuaRocks contient également des bibliothèques du monde Lua. Par exemple, LuaSQL-MySQL dans LuaRocks est un package qui se connecte à MySQL dans le monde Lua et ne peut pas être utilisé dans OpenResty.
Prenons toujours la bibliothèque HTTP
comme exemple, essayons d'utiliser LuaRocks pour la trouver.
$ luarocks search http
Comme vous pouvez le voir, il retourne également une série de packages.
Changeons à nouveau le mot-clé.
$ luarocks search lua-resty-http
Cette fois, un seul package a été retourné. Nous pouvons aller sur le site web de LuaRocks et regarder les détails de ce package. Voici une capture d'écran de la page du site web.
La capture d'écran ci-dessus contient l'auteur, la licence, l'URL GitHub, le nombre de téléchargements, un résumé des fonctionnalités, l'historique des versions, les dépendances, etc. Contrairement à OPM, LuaRocks n'utilise pas directement les informations GitHub de l'utilisateur, mais demande aux développeurs de s'inscrire séparément sur LuaRocks.
Le projet open source de passerelle API, Apache APISIX, utilise LuaRocks pour la gestion des packages. Examinons brièvement comment la configuration de gestion des packages d'APISIX est écrite.
La dernière version d'APISIX est la 2.15, et vous pouvez trouver le fichier apisix-2.15.0-0.rockspec
sous le projet 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 est une passerelle API cloud-native pour les microservices, offrant des performances ultimes, une sécurité, une open source et une plateforme évolutive pour toutes vos API et 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)",
},
}
Comme vous pouvez le voir dans le fichier, les dépendances sont mélangées avec des bibliothèques lua-resty-*
et des bibliothèques du monde Lua pur, qui ne peuvent être que partiellement installées en utilisant OPM. Après avoir écrit la configuration, utilisez la commande d'upload de LuaRocks
pour téléverser cette configuration, et l'utilisateur peut utiliser LuaRocks
pour télécharger et installer APISIX.
LuaRocks
supporte cela. Vous pouvez spécifier le chemin et le nom du code source C dans le fichier .rockspec
, et LuaRocks le compilera localement pour vous. OPM ne supporte pas encore cette fonctionnalité.
awesome-resty
Le projet awesome-resty maintient presque tous les packages disponibles pour OpenResty, organisés par catégories. C'est le meilleur endroit à consulter lorsque vous n'êtes pas sûr s'il existe un package tiers approprié.
Prenons la bibliothèque HTTP comme exemple. Dans awesome-resty
, elle appartient naturellement à la catégorie networking.
lua-resty-http par @pintsized — Client HTTP Lua basé sur cosocket pour OpenResty / ngx_lua
lua-resty-http par @liseen — Client HTTP Lua pour ngx_lua basé sur l'API cosocket
lua-resty-http par @DorianGray — Client HTTP Lua pour ngx_lua basé sur l'API cosocket
lua-resty-http-simple — Client HTTP Lua simple pour ngx_lua
lua-resty-httpipe — Client HTTP Lua basé sur cosocket pour OpenResty / ngx_lua
lua-resty-httpclient — Bibliothèque cliente HTTP Lua non bloquante pour aLiLua & ngx_lua
lua-httpcli-resty — Module client HTTP Lua pour OpenResty
lua-resty-requests — Une autre bibliothèque HTTP pour OpenResty
Nous voyons qu'il y a huit bibliothèques tierces pour lua-resty-http
. En comparant avec les résultats précédents, nous n'avons trouvé que 2 en utilisant OPM et seulement 1 dans LuaRocks. Cependant, s'il est difficile de choisir, utilisez la première, qui est la même que celle dans LuaRocks.
Pour les ingénieurs prêts à expérimenter, je recommande la dernière bibliothèque : lua-resty-requests, une bibliothèque d'accès HTTP plus conviviale avec le même style d'interface que le célèbre Requests de Python. Si vous êtes un amoureux de Python comme moi, vous adorerez lua-resty-requests
, qui est écrite par tokers
, un membre actif de la communauté OpenResty, donc vous pouvez l'utiliser en toute confiance.
Résumé
Pour qu'un projet open source prospère, il a besoin non seulement de technologie de pointe, d'une bonne documentation et de tests complets, mais aussi d'un écosystème qui rassemble plus de développeurs et d'entreprises. Comme le dit la voie Apache : la communauté avant le code.
Il n'y a pas de matériel d'apprentissage systématique pour OpenResty, pas de guide de code officiel, et de nombreux points d'optimisation ont été écrits dans le projet open source. Mais la plupart des développeurs savent de quoi ils parlent sans savoir pourquoi. C'est le but de cet Ebook. Après l'avoir appris, j'espère que vous pourrez écrire un code OpenResty plus efficace et participer plus efficacement aux projets open source liés à OpenResty, par exemple, Apache APISIX.
Que pensez-vous de l'écosystème OpenResty ? N'hésitez pas à laisser un commentaire, et discutons-en. De plus, n'hésitez pas à partager cet article.