Envoy und Apache APISIX: Eine weitere Möglichkeit zur Implementierung von Envoy Filter
API7.ai
December 16, 2020
Möglichkeiten zur Implementierung von Envoy-Filtern
Envoy-Filter
Envoy ist ein L7-Proxy und Kommunikationsbus, der für große, moderne dienstorientierte Architekturen entwickelt wurde. Ein pluggbarer Filterkettenmechanismus ermöglicht es, Filter zu schreiben, die verschiedene Aufgaben ausführen und in den Hauptserver eingefügt werden können.
Erweiterungsmethoden
Die vorhandenen Filter erfüllen möglicherweise nicht die benutzerdefinierten Anforderungen. In diesem Fall muss Envoy erweitert werden. Neue Filter können basierend auf der vorhandenen Filterkette angepasst werden, um die Anforderungen zu erfüllen.
Entwickler können Envoy auf drei Arten erweitern:
Schwierigkeitsgrad | Stabilität | Entwicklungseffizienz | Bereitstellung und Kompilierung | |
---|---|---|---|---|
C++ | hoch | stabil | niedrig | lange Kompilierzeit |
Lua | niedrig | stabil | hoch | keine Kompilierung erforderlich, direkte Bereitstellung |
WASM | mittel-hoch | unsicher | abhängig von der Sprache | Kompilierzeit abhängig von der Sprache |
- Erweiterung mit C++
Bei dieser Methode wird C++-Code direkt auf der Basis von Envoy geschrieben, um die Funktionalität zu erweitern. Nach der Implementierung eines benutzerdefinierten Filters wird die neue Binärdatei neu kompiliert, um das Upgrade abzuschließen. Diese Methode hat zwei Probleme:
- Begrenzt durch die C++-Sprache, hoher Schwierigkeitsgrad, Mangel an Entwicklern.
- Erhöhung der Komplexität bei der Bereitstellung, dem Betrieb und der Wartung sowie bei Upgrades. Envoy wird immer schwerer, und jede Änderung erfordert eine erneute Kompilierung der Binärdatei, was die Iteration und Verwaltung erschwert.
- Erweiterung mit Lua
Lua wurde entwickelt, um in Anwendungen eingebettet zu werden, um flexible Erweiterungs- und Anpassungsfunktionen zu bieten, und wird weit verbreitet eingesetzt.
Lua-Filter ermöglichen es, Lua-Skripte im Anfrage- und Antwortprozess auszuführen. Die derzeit unterstützten Hauptfunktionen umfassen: Überprüfung von Headern, Body und Trailers während des Streamings im Anfrage- oder Antwortfluss; Änderung von Headern und Trailers; Blockieren und Puffern des gesamten Anfrage-/Antwort-Bodys zur Überprüfung; Durchführen eines asynchronen HTTP-Aufrufs an einen Upstream-Host; Durchführen einer direkten Antwort und Überspringen der weiteren Filteriteration usw.
Derzeit verteilen viele Leute Lua-Code direkt in der Konfiguration, was die Codeorganisation und -verwaltung erschwert und es schwierig macht, ihn mit anderen zu teilen, um ein Ökosystem zu bilden.
- Erweiterung mit WASM
Entwickler können Filter in ihrer eigenen Programmiersprache schreiben, sie mit Tools in das WASM-Format kompilieren und in Envoy einbetten, um sie auszuführen.
Es unterstützt derzeit nur wenige Sprachen, und die Erweiterung mit diesen Sprachen ist immer noch nicht so einfach. Andererseits haben viele Leute noch Vorbehalte gegenüber WASM und verwenden es möglicherweise nicht direkt.
Apache APISIX-Lösung
Basierend auf der obigen Analyse können wir sehen, dass Lua sehr gut geeignet ist, um Envoy zu erweitern, und es ist einfach zu erlernen, und die Entwicklungseffizienz ist extrem hoch. Da es in Envoy eingebettet ist, gibt es keinen zusätzlichen Netzwerk-Overhead, und die Leistung ist gut.
Die Apache APISIX-Community schlägt ihre eigene Lösung basierend auf Lua vor, nämlich eine leistungsstarke und flexible Grundbibliothek bereitzustellen, um alle Plugins von Apache APISIX und zukünftige Plugins auf Envoy laufen zu lassen. Entwickler können auch ihre eigenen benutzerdefinierten Plugins basierend auf dieser Grundbibliothek entwickeln.
Apache APISIX ist ein dynamisches, Echtzeit-, Hochleistungs-API-Gateway, basierend auf der Nginx-Bibliothek und Lua. Apache APISIX bietet umfangreiche Traffic-Management-Funktionen wie Lastenausgleich, dynamisches Upstream, Canary-Release, Circuit Breaking, Authentifizierung, Beobachtbarkeit und mehr.
Beispiel
Bitte überprüfen Sie das Repo für spezifischen Code und wie man es ausführt: https://github.com/api7/envoy-apisix.
Die relevante Konfiguration von Envoy ist wie folgt:
Definieren eines Filters:
http_filters:
- name: entry.lua
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
source_codes:
entry.lua:
filename: /apisix/entry.lua
Aktivieren des Filters für eine Route und Konfiguration mit Metadaten:
routes:
- match:
prefix: "/foo"
route:
cluster: web_service
typed_per_filter_config:
envoy.filters.http.lua:
"@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.LuaPerRoute
name: entry.lua
metadata:
filter_metadata:
envoy.filters.http.lua:
plugins:
- name: uri-blocker
conf:
rejected_code: 403
block_rules:
- root.exe
- root.m+
Wie es funktioniert
Wir müssen keine größeren Änderungen an Envoy vornehmen, nur einige Optimierungen, die für allgemeine Anforderungen geeignet sind.
Wir schirmen Plattformunterschiede für die Plugin-Schicht ab. Alle Schnittstellen, die verwendet werden müssen, werden im zugrunde liegenden Framework abstrahiert, das wir apisix.core nennen, sodass alle Plugins gleichzeitig auf Envoy und Apache APISIX laufen können.
Wir verwenden das vorherige Beispiel, um zu zeigen, wie das Plugin läuft:
Erster Schritt, Konfiguration lesen
Wir konfigurieren über Metadaten, um festzulegen, welche Plugins auf jeder Route ausgeführt werden müssen und welche Konfiguration für jedes Plugin gilt. Im Beispiel haben wir das Plugin uri-blocker
für die Route mit dem Präfix /foo
konfiguriert, sowie die Blockierungsregel des Plugins und den Antwortstatus, wenn eine Blockierung erforderlich ist.
Zweiter Schritt, Anfrage analysieren
Wir haben die Client-Anfragedaten in ctx
gekapselt, sodass sie im gesamten Prozess direkt verwendet werden können.
Dritter Schritt, Plugin ausführen
Wir bestimmen, ob wir diese Anfrage blockieren müssen, indem wir die konfigurierten Regeln und den erhaltenen URI abgleichen. Wenn eine Blockierung erforderlich ist, rufen wir respond
auf, um direkt zu antworten, andernfalls lassen wir sie durch.
Zukunftsausblick
Immer mehr APISIX-Plugins werden auf Envoy laufen, und schließlich werden alle APISIX-Plugins (auch die, die in Zukunft entwickelt werden) auf Envoy verfügbar sein.
Gleichzeitig hoffen wir, dass wir mit der Envoy-Community in Richtung Lua-Filter zusammenarbeiten können, um Lua-Filter zu optimieren und zu verbessern, die Erweiterungsfähigkeiten von Envoy zu verbessern und die Schwierigkeit der Envoy-Erweiterung zu verringern.