Wie man Third-Party-Pakete von OpenResty mit LuaRocks und OPM verwaltet?

API7.ai

September 17, 2022

OpenResty (NGINX + Lua)

Im vorherigen Beitrag haben wir einen allgemeinen Überblick über einige offizielle OpenResty-Projekte erhalten. Wenn wir OpenResty jedoch in der Produktionsumgebung verwenden, reichen diese mit dem OpenResty-Paket gelieferten Bibliotheken nicht aus. Zum Beispiel gibt es keine lua-resty-Bibliothek, um HTTP-Anfragen zu senden, und es gibt keine Möglichkeit, mit Kafka zu interagieren.

Was sollten wir also tun?

Da OpenResty kein Fork von NGINX ist, noch eine Neuverpackung von NGINX mit einigen Standardbibliotheken, sondern lediglich NGINX als zugrunde liegende Netzwerkbibliothek verwendet.

Bei der Verwendung von NGINX denken Sie nicht darüber nach, wie Sie benutzerdefinierte HTTP-Anfragen initiieren oder wie Sie mit Kafka interagieren können. In der OpenResty-Welt können Entwickler dank cosocket jedoch schnell lua-resty-http und lua-resty-kafka schreiben, um diese Anforderungen zu erfüllen, ähnlich wie Sie es mit Entwicklungssprachen wie Python, PHP usw. tun können.

Ein weiterer Ratschlag für Sie: Sie sollten keine Bibliotheken aus der Lua-Welt verwenden, um die oben genannten Probleme zu lösen, sondern stattdessen die lua-resty-*-Bibliotheken von cosocket verwenden. Bibliotheken aus der Lua-Welt können Blockierungen verursachen, was einen ansonsten hochleistungsfähigen Dienst um mehrere Größenordnungen verlangsamen kann. Dies ist ein häufiger Fehler von OpenResty-Anfängern und ist nicht leicht zu bemerken.

Wie finden wir also diese nicht-blockierenden lua-resty-*-Bibliotheken? Lassen Sie mich Ihnen im Folgenden einige Möglichkeiten vorstellen.

OPM

OPM (OpenResty Package Manager) ist der Paketmanager, der mit OpenResty geliefert wird und verwendet werden kann, nachdem Sie OpenResty installiert haben. Wir können versuchen, die Bibliothek zum Senden von HTTP-Anfragen zu finden, indem wir den Befehl opm search http verwenden.

Die Abfrage kann beim ersten Mal langsam sein und dauert normalerweise einige Sekunden. opm.openresty.org führt eine Abfrage aus der PostgreSQL-Datenbank durch und speichert die Ergebnisse für eine Weile im Cache.

openresty/lua-resty-upload                            Streaming reader and parser for HTTP file uploading based on ngx_lua cosocket

Wenn Sie dieses Ergebnis sehen, fragen Sie sich vielleicht: Was hat dieses lua-resty-upload-Paket mit dem Senden von HTTP zu tun?

Es stellt sich heraus, dass OPM sowohl den Paketnamen als auch die Paketbeschreibung mit dem Suchbegriff durchsucht hat. Deshalb dauert die obige Suche einige Sekunden. Es führt eine Volltextsuche der Zeichenkette in PostgreSQL durch.

Aber trotzdem ist diese Rückmeldung nicht freundlich. Lassen Sie uns das Schlüsselwort ändern und erneut danach suchen.

$ 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

In der OpenResty-Welt müssen Sie, wenn Sie ein Paket mit cosocket implementieren, das Präfix lua-resty verwenden, was eine ungeschriebene Regel ist.

Wenn wir uns die Suchergebnisse ansehen, verwendet OPM die GitHub-Repository-Adresse des Beitragenden als Paketnamen, d.h. GitHub-ID / Repository-Name. Es gibt drei lua-resty-http-Drittanbieter-Bibliotheken zurück. Welche sollten wir wählen?

Bevor wir das Paket auswählen, schauen wir uns die Anzahl der Sterne und das letzte Aktualisierungsdatum an: nur ein Dutzend Sterne; die letzte Aktualisierung war 2016. Dies ist ein aufgegebenes Projekt. Wenn wir tiefer schauen, zeigen pintsized/lua-resty-http und ledgetech/lua-resty-http auf dasselbe Repository. Es spielt also keine Rolle, welches Sie wählen, es ist dasselbe.

Außerdem ist die OPM-Website relativ einfach und bietet weder die Anzahl der Paketdownloads noch die Abhängigkeiten für dieses Paket. Sie müssten mehr Zeit darauf verwenden, herauszufinden, welche lua-resty-Bibliotheken die richtigen sind, was eigentlich die Aufgabe des Maintainers sein sollte.

LuaRocks

LuaRocks ist ein weiterer Paketmanager für die OpenResty-Welt, der vor OPM entstanden ist. Im Gegensatz zu OPM, das nur OpenResty-bezogene Pakete enthält, hat LuaRocks auch Bibliotheken aus der Lua-Welt. Zum Beispiel ist LuaSQL-MySQL in LuaRocks ein Paket, das in der Lua-Welt eine Verbindung zu MySQL herstellt und nicht in OpenResty verwendet werden kann.

Nehmen wir wieder die HTTP-Bibliothek als Beispiel und versuchen, sie mit LuaRocks zu finden.

$ luarocks search http

Wie Sie sehen können, gibt es auch hier eine Reihe von Paketen zurück.

Lassen Sie uns das Schlüsselwort noch einmal ändern.

$ luarocks search lua-resty-http

Diesmal wurde nur ein Paket zurückgegeben. Wir können auf die LuaRocks-Website gehen und uns die Details dieses Pakets ansehen. Hier ist ein Screenshot der Website-Seite.

LuaRocks Package Details

Der obige Screenshot enthält den Autor, die Lizenz, die GitHub-URL, die Anzahl der Downloads, eine Zusammenfassung der Funktionen, Versionsgeschichte, Abhängigkeiten usw. Im Gegensatz zu OPM verwendet LuaRocks nicht direkt GitHub-Benutzerinformationen, sondern erfordert, dass Entwickler sich separat bei LuaRocks registrieren.

Das Open-Source-API-Gateway-Projekt Apache APISIX verwendet LuaRocks für die Paketverwaltung. Lassen Sie uns kurz untersuchen, wie die Paketverwaltungskonfiguration von APISIX geschrieben ist.

Die neueste Version von APISIX ist 2.15, und Sie können die Datei apisix-2.15.0-0.rockspec im Apache APISIX-Projekt finden.

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)",
    },
}

Wie Sie der Datei entnehmen können, sind die Abhängigkeiten gemischt mit lua-resty-*-Bibliotheken und Bibliotheken aus der reinen Lua-Welt, die nur teilweise mit OPM installiert werden können. Nachdem Sie die Konfiguration geschrieben haben, verwenden Sie den Upload-Befehl von LuaRocks, um diese Konfiguration hochzuladen, und der Benutzer kann LuaRocks verwenden, um APISIX herunterzuladen und zu installieren.

LuaRocks unterstützt dies. Sie können den Pfad und den Namen des C-Quellcodes in der .rockspec-Datei angeben, und LuaRocks wird ihn lokal für Sie kompilieren. OPM unterstützt diese Funktion noch nicht.

awesome-resty

Das awesome-resty-Projekt verwaltet fast alle verfügbaren Pakete für OpenResty, die in Kategorien organisiert sind. Dies ist der beste Ort, wenn Sie unsicher sind, ob es ein geeignetes Drittanbieter-Paket gibt.

Nehmen wir die HTTP-Bibliothek als Beispiel. In awesome-resty gehört sie natürlich zur Kategorie 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

Wir sehen, dass es acht Drittanbieter-Bibliotheken für lua-resty-http gibt. Vergleicht man die vorherigen Ergebnisse, haben wir mit OPM nur 2 und mit LuaRocks nur 1 gefunden. Wenn es jedoch schwer zu wählen ist, verwenden Sie die erste, die dieselbe wie in LuaRocks ist.

Für Ingenieure, die experimentierfreudig sind, empfehle ich die letzte Bibliothek: lua-resty-requests, eine benutzerfreundlichere HTTP-Zugriffsbibliothek mit demselben Schnittstellenstil wie das berühmte Requests von Python. Wenn Sie wie ich ein Python-Liebhaber sind, werden Sie lua-resty-requests lieben, das von dem aktiven tokers in der OpenResty-Community entwickelt wurde, sodass Sie es mit Vertrauen verwenden können.

Zusammenfassung

Damit ein Open-Source-Projekt gedeihen kann, benötigt es nicht nur harte Technologie, gute Dokumentation und vollständige Tests, sondern auch ein Ökosystem, das mehr Entwickler und Unternehmen zusammenbringt. Wie der Apache Way sagt: Community über Code.

Es gibt kein systematisches Lernmaterial für OpenResty, keinen offiziellen Code-Leitfaden, und viele Optimierungspunkte wurden in Open-Source-Projekten geschrieben, aber die meisten Entwickler wissen, worüber sie sprechen, aber nicht warum. Das ist der Zweck dieses E-Books. Nachdem Sie es gelernt haben, hoffe ich, dass Sie effizienteren OpenResty-Code schreiben und effizienter an OpenResty-bezogenen Open-Source-Projekten teilnehmen können, zum Beispiel Apache APISIX.

Was halten Sie vom OpenResty-Ökosystem? Hinterlassen Sie gerne einen Kommentar, und lassen Sie uns darüber sprechen. Außerdem freuen wir uns, wenn Sie diesen Artikel teilen.