Apache APISIX Serverless-Plugin für Event Hooks
February 15, 2023
Apache APISIX ist ein Open-Source-API-Gateway mit hoher Leistung, das auf Nginx basiert. Eine seiner leistungsstarken Funktionen ist die Möglichkeit, serverlose Funktionen zu erstellen, das sind kleine, zustandslose Programme, die die Funktionalität von Apache APISIX erweitern können. In diesem Artikel behandeln wir die Grundlagen des Apache APISIX Serverless Plugins und wie es verwendet werden kann, um serverlose Funktionen als Reaktion auf Ereignisse auszulösen.
Lernziele
In diesem Artikel lernen Sie Folgendes:
- Was ist das Apache APISIX Serverless-Plugin?
- Wie funktioniert das Serverless-Plugin und wie wird es verwendet?
- Anwendungsfälle für das Serverless-Plugin.
- Wie Sie das Serverless-Plugin verwenden können, um es mit einem Webhook zu integrieren.
Was ist das Apache APISIX Serverless-Plugin?
Das Apache APISIX Serverless-Plugin für Ereignishooks ermöglicht es Ihnen, serverlose Funktionen zu schreiben und in das API-Gateway zu integrieren. Das Plugin bietet eine einfache und flexible Möglichkeit, benutzerdefinierten Code als Reaktion auf Ereignisse auszuführen, ohne die zugrunde liegende Infrastruktur verwalten zu müssen.
Das Serverless-Plugin trennt die Logik zur Behandlung von Ereignissen in separate serverlose Funktionen, wodurch Sie Ihre API-Architektur vereinfachen und leichter verwalten können. Apache APISIX bietet Unterstützung für Serverless-Frameworks beliebter Cloud-Anbieter wie Azure Functions und AWS Lambda.
Wie verwendet man das Serverless-Plugin?
Um das Apache APISIX Serverless-Plugin für Ereignishooks zu verwenden, müssen Sie einen serverlosen Funktionscode in der Programmiersprache Lua schreiben, der die Logik implementiert, die Sie als Reaktion auf ein Ereignis ausführen möchten, und das serverless-pre-function
- oder serverless-post-function
-Plugin aktivieren, abhängig von den Phasen des Anfrage-Antwort-Zyklus Ihrer Wahl.
Derzeit unterstützt APISIX nur Lua, um einen Funktionscode zu schreiben. Wenn Sie andere Programmiersprachen bevorzugen, können Sie jederzeit Plugin-Runner verwenden, um ein neues benutzerdefiniertes Plugin von Grund auf zu erstellen.
Anwendungsfälle für das Serverless-Plugin
Hier sind einige Anwendungsfälle für das Apache APISIX Serverless-Plugin für Ereignishooks:
-
Dynamisches Routing: Das Serverless-Plugin kann verwendet werden, um eingehende API-Anfragen basierend auf bestimmten Kriterien wie der Anfragemethode, dem URL-Pfad oder Header-Werten dynamisch weiterzuleiten. Dies ermöglicht es Ihnen, komplexe Routing-Szenarien einfach zu implementieren, ohne die zugrunde liegende Apache APISIX-Konfiguration ändern zu müssen.
-
Authentifizierung und Autorisierung: Sie können das Serverless-Plugin verwenden, um Authentifizierungs- und Autorisierungsprüfungen für Ihre API zu implementieren. Beispielsweise können Sie eine serverlose Funktion schreiben, die das Vorhandensein eines gültigen API-Schlüssels in den Anfrage-Headern überprüft, bevor die Anfrage fortgesetzt wird. Oder es kann als externer Autorisierungsdienst in Kombination mit dem forward-auth-Plugin verwendet werden.
-
Anfrage-Transformation: Das Serverless-Plugin kann verwendet werden, um eingehende API-Anfragen zu transformieren, bevor sie vom Backend-Dienst verarbeitet werden. Beispielsweise können Sie eine serverlose Funktion schreiben, die die Anfrage-Header oder den Anfragekörper so ändert, dass sie dem vom Backend-Dienst erwarteten Format entsprechen.
-
Antwort-Transformation: Sie können das Serverless-Plugin auch verwenden, um die Antwort vom Backend-Dienst zu transformieren, bevor sie an den Client zurückgesendet wird. Beispielsweise können Sie eine serverlose Funktion schreiben, die die Antwort-Header oder den Antwortkörper so ändert, dass sie dem vom Client erwarteten Format entsprechen.
-
Protokollierung und Überwachung: Sie können das Serverless-Plugin verwenden, um Protokollierung und Überwachung für Ihre API zu implementieren. Beispielsweise können Sie eine serverlose Funktion schreiben, die detaillierte Informationen über jede API-Anfrage protokolliert, wie z.B. die Anfragemethode, URL, Header und den Anfragekörper, für eine spätere Analyse.
Integration von Apache APISIX mit Webhooks (Demo)
Um Apache APISIX mit Webhooks zu integrieren, müssen Sie eine serverlose Funktion erstellen, die eingehende POST-Anfragen an den URL-Endpunkt überwacht, überprüft, ob die Anfragemethode POST ist, und eine Webhook-Benachrichtigung an den Drittanbieterdienst sendet, sobald eine neue Nachricht gepostet wird.
Die serverlose Funktion sollte auch die Antwort vom Webhook zurückgeben, damit Sie den Status des Webhooks und eventuelle Fehlermeldungen sehen können, falls etwas schiefgeht. In beiden Fällen kann APISIX mit dem Zielservice kommunizieren und diesen darüber informieren, dass ein Ereignis ausgelöst wurde, indem eine bereitgestellte URL mit Informationen über dieses Ereignis aufgerufen wird.
Voraussetzungen
- Docker auf Ihrem Computer installiert, um APISIX auszuführen.
- Grundkenntnisse über einige APISIX-Kernkonzepte wie Route, Upstream und Plugin.
Projekt einrichten
Das erste, was Sie tun müssen, ist das apisix-docker-Projekt-Repo von GitHub zu klonen:
git clone https://github.com/apache/apisix-docker.git
Öffnen Sie den Projektordner in Ihrem bevorzugten Code-Editor. Das Tutorial verwendet VS Code.
Apache APISIX installieren und ausführen
Um Apache APISIX auszuführen, können Sie diese Schritte befolgen:
Öffnen Sie ein neues Terminalfenster und führen Sie den Befehl docker compose up
aus dem Stammverzeichnis des Projekts aus:
docker compose up -d
Der obige Befehl führt Apache APISIX und etcd zusammen mit Docker aus.
Wir haben APISIX in dieser Demo mit Docker installiert. Es gibt jedoch andere Möglichkeiten, es zu installieren, wie im Installationshandbuch beschrieben.
Serverlose Funktion in Apache APISIX konfigurieren
Um die serverlose Funktion in Apache APISIX einzurichten, müssen Sie eine neue Route für den Endpunkt erstellen und das Serverless-Plugin mit unserem benutzerdefinierten Funktionscode in Lua konfigurieren.
Hier ist ein Beispiel für eine serverlose Funktion in Lua, die eingehende POST-Anfragen an den Endpunkt überwacht und eine Webhook-Benachrichtigung sendet:
function webhook(conf, ctx)
-- Notwendige Bibliotheken importieren
local http = require("resty.http")
local core = require("apisix.core")
-- Webhook-Benachrichtigung nur senden, wenn die Anfragemethode POST ist, ansonsten überspringen und wie gewohnt an den Upstream senden
if core.request.get_method() == "POST" then
-- Webhook-Benachrichtigung an die angegebene URL senden
local httpc = http.new()
local res, err = httpc:request_uri("http://webhook.site/9db3d3a0-ab64-4142-a39f-d4852ca50f8d", {
method = "POST",
headers = {
["Content-Type"] = "application/json"
},
body = core.request.get_body(),
})
-- Antwort vom Webhook überprüfen
if not res then
core.log.error("Fehler beim Senden des Webhooks: ", err)
return 500, err
end
end
-- Antwort vom Upstream-Dienst zurückgeben
return conf.status, conf.body
end
Wie Sie im obigen Beispielcode für die Webhook-Funktion sehen können, sendet er JSON-POST-Anfragen an eine bereitgestellte URL mit dem Anfragekörper (der Anfragekörper vom Client zum API-Gateway) als Nutzlast. Die Website https://webhook.site wird verwendet, um unseren Webhook-Endpunkt zu simulieren.
Um Ihren Webhook-Endpunkt zu erstellen und einzurichten:
- Generieren Sie eine URL, indem Sie https://webhook.site in Ihrem Webbrowser aufrufen.
- Wählen Sie Copy to clipboard neben Your unique URL.
- Fügen Sie sie in die request_uri-Methode der HTTP-Anfrage im Funktionscode ein.
Außerdem werden alle anderen Anfragen, einschließlich POST, weiter an den Upstream-Dienst gesendet. Im nächsten Schritt konfigurieren wir eine Route und einen Upstream.
Route und Upstream konfigurieren
Jetzt erstellen wir eine neue Route mit aktiviertem Serverless-Funktions-Plugin und einem Upstream, der als unser Backend-Dienst fungiert.
curl -X PUT 'http://127.0.0.1:9180/apisix/admin/routes/1' \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \
-H 'Content-Type: application/json' \
-d '{
"uri": "/post",
"plugins": {
"serverless-pre-function": {
"phase": "rewrite",
"functions" : ["
return function(conf, ctx)
-- Notwendige Bibliotheken importieren
local http = require(\"resty.http\")
local core = require(\"apisix.core\")
-- Webhook-Benachrichtigung nur senden, wenn die Anfragemethode POST ist, ansonsten überspringen und wie gewohnt an den Upstream senden
if core.request.get_method() == \"POST\" then
-- Webhook-Benachrichtigung an die angegebene URL senden
local httpc = http.new()
local res, err = httpc:request_uri(\"http://webhook.site/9db3d3a0-ab64-4142-a39f-d4852ca50f8d\", {
method = \"POST\",
headers = {
[\"Content-Type\"] = \"application/json\"
},
body = core.request.get_body(),
})
-- Antwort vom Webhook überprüfen
if not res then
core.log.error(\"Fehler beim Senden des Webhooks: \", err)
return 500, err
end
end
-- Antwort vom Upstream-Dienst zurückgeben
return conf.status, conf.body
end"]
}
},
"upstream": {
"nodes": {
"httpbin.org:80": 1
},
"type": "roundrobin"
}
}'
Im vorherigen Beispiel für die Routenkonfiguration haben wir unsere erste Route erstellt, indem wir eine curl
-Anfrage an die APISIX Admin API gesendet haben. Im Anfragekörper der Route haben wir angegeben, dass alle Anfragen an den Pfad /post
den serverlosen Funktionscode auslösen und später an das Ziel httpbin.org
weitergeleitet werden. Dies bedeutet, dass die Anfrage an den Endpunkt httpbin.org/post
weitergeleitet wird, nachdem überprüft wurde, ob die Anfragemethode POST ist und ob das Ereignis an den Webhook-Endpunkt des Drittanbieters gesendet werden soll oder nicht. Der Backend-Dienst kann durch Ihren eigenen Backend-Dienst ersetzt werden.
Sie werden auch bemerken, dass wir den Funktionscode in die functions
-Eigenschaft von serverless-pre-function
im JSON-Objekt eingefügt haben.
Konfiguration testen
Schließlich testen wir, ob alles wie erwartet funktioniert, indem wir den /post
-API-Gateway-Endpunkt aufrufen und das POST-Ereignis an die Webhook-Website gesendet wird.
curl -i http://127.0.0.1:9080/post -X POST -d \
'{
"message": "A new webhook message"
}'
Nachdem Sie zur Webhook-URL von der Seite https://webhook.site navigiert haben, die Sie in den vorherigen Schritten generiert haben, sollten Sie eine POST-Anfrage sehen, die unseren Webhook-Endpunkt über das Ereignis informiert und den Anfragekörper gesendet hat.
Zusätzlich dazu erhalten wir die Antwort vom Mock-Upstream-Dienst httpbin.org
zurück:
HTTP/1.1 200 OK
Content-Type: application/json
{
...
"form": {
"{\n \"message\": \"A new webhook message\"\n}": ""
},
"headers": {
"Accept": "*/*",
"Content-Length": "41",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "127.0.0.1",
"X-Forwarded-Host": "127.0.0.1"
},
"json": null,
"url": "http://127.0.0.1/post"
}
Offensichtlich wird der Webhook-Endpunkt nicht ausgelöst, wenn Sie andere HTTP-Anfragemethoden als POST senden.
Dies ist ein einfaches Beispiel für die Einrichtung einer serverlosen Funktion in Apache APISIX. Sie können diese Funktionalität erweitern, indem Sie komplexere Logik zu Ihrer serverlosen Funktion hinzufügen, wie z.B. das Auslösen einer weiteren Funktion als Reaktion auf Webhooks.
Fazit
Das Apache APISIX Serverless-Plugin für Ereignishooks bietet eine flexible und skalierbare Möglichkeit, serverlose Funktionen als Reaktion auf Ereignisse auszulösen, die während der Verarbeitung von API-Anfragen auftreten. Durch die Verwendung des Plugins können Sie Ihre API-Architektur vereinfachen, die Leistung und Zuverlässigkeit Ihrer Dienste verbessern und die Kosten für die Verwaltung Ihrer Anwendungsinfrastruktur senken.
Verwandte Ressourcen
Empfohlene Inhalte
Community
🙋 Treten Sie der Apache APISIX Community bei 🐦 Folgen Sie uns auf Twitter 📝 Finden Sie uns auf Slack