Envoy et Apache APISIX : Une autre manière de mettre en œuvre Envoy Filter
API7.ai
December 16, 2020
Méthodes pour implémenter un filtre Envoy
Filtre Envoy
Envoy est un proxy L7 et un bus de communication conçu pour les grandes architectures orientées services modernes. Un mécanisme de chaîne de filtres pluggable permet d'écrire des filtres pour effectuer différentes tâches et de les insérer dans le serveur principal.
Méthode d'extension
Les filtres existants peuvent ne pas répondre aux besoins personnalisés de l'utilisateur. Dans ce cas, Envoy doit être étendu. Personnalisez de nouveaux filtres en fonction de la chaîne de filtres existante pour répondre aux exigences de personnalisation.
Les développeurs peuvent étendre Envoy de trois manières :
Difficulté de prise en main | Stabilité | Efficacité de développement | Déploiement et compilation | |
---|---|---|---|---|
C++ | élevée | stable | faible | temps de compilation long |
Lua | faible | stable | élevée | pas besoin de compilation, déploiement direct |
WASM | moyenne-élevée | incertaine | dépend du langage | temps de compilation dépend du langage |
- Utilisation de C++ pour l'extension
Dans cette méthode, du code C++ est écrit directement sur la base d'Envoy pour améliorer les fonctionnalités. Après avoir implémenté un filtre personnalisé, le nouveau fichier binaire est recompilé pour terminer la mise à niveau. Cette méthode présente deux problèmes :
- Limité par le langage C++, difficulté de prise en main, rareté des développeurs.
- Augmentation de la complexité du déploiement, de l'exploitation et de la maintenance, et des mises à niveau. Envoy deviendra de plus en plus lourd, et chaque changement nécessite une recompilation du fichier binaire, ce qui n'est pas propice à l'itération et à la gestion.
- Utilisation de Lua pour l'extension
Lua est conçu pour être intégré dans l'application, afin de fournir des fonctionnalités d'extension et de personnalisation flexibles pour l'application, et est largement utilisé.
Le filtre Lua permet d'exécuter des scripts Lua dans le processus de demande et de réponse. Les principales fonctionnalités actuellement prises en charge incluent : l'inspection des en-têtes, du corps et des trailers pendant le streaming dans le flux de demande ou de réponse ; la modification des en-têtes et des trailers ; le blocage et la mise en mémoire tampon du corps complet de la demande/réponse pour inspection ; l'exécution d'un appel HTTP asynchrone sortant à un hôte en amont ; l'exécution d'une réponse directe et la saut de l'itération ultérieure des filtres, etc.
Actuellement, de nombreuses personnes distribuent directement du code Lua dans la configuration, ce qui n'est pas propice à l'organisation et à la gestion du code, et il est difficile de le partager avec d'autres pour former un écosystème.
- Utilisation de l'extension WASM
Les développeurs peuvent écrire des filtres dans leur propre langage de programmation, les compiler au format WASM à l'aide d'outils, et les intégrer dans Envoy pour les exécuter.
Il prend actuellement en charge peu de langages, et l'utilisation de ces langages pour l'extension n'est toujours pas si simple. D'autre part, de nombreuses personnes ont encore des réserves concernant WASM et peuvent ne pas l'utiliser directement.
Solution Apache APISIX
Sur la base de l'analyse ci-dessus, nous pouvons voir que Lua est très adapté pour étendre Envoy, et il est facile à apprendre, et l'efficacité de développement est extrêmement élevée. Comme il est intégré dans Envoy, il n'y a pas de surcharge réseau supplémentaire, et les performances sont bonnes.
La communauté Apache APISIX propose sa propre solution basée sur Lua, qui consiste à fournir une bibliothèque de base puissante et flexible pour implémenter tous les plugins d'Apache APISIX et les plugins qui seront développés à l'avenir pour fonctionner sur Envoy. Les développeurs pourraient également développer leurs propres plugins personnalisés basés sur cette bibliothèque de base.
Apache APISIX est une passerelle API dynamique, en temps réel et haute performance, basée sur la bibliothèque Nginx et Lua. Apache APISIX fournit des fonctionnalités riches de gestion du trafic telles que l'équilibrage de charge, l'amont dynamique, la publication canari, la rupture de circuit, l'authentification, l'observabilité, et plus encore.
Exemple
Veuillez consulter le dépôt pour le code spécifique et la manière de l'exécuter : https://github.com/api7/envoy-apisix.
La configuration pertinente d'Envoy est la suivante :
Définir un filtre :
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
Activer le filtre pour une route et le configurer avec des métadonnées :
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+
Comment cela fonctionne
Nous n'avons pas besoin d'apporter de modifications majeures à Envoy, seulement quelques optimisations adaptées aux besoins publics.
Nous masquons les différences de plateforme pour la couche de plugins. Toutes les interfaces qui doivent être utilisées sont abstraites dans le framework sous-jacent, que nous appelons apisix.core, afin que tous les plugins puissent fonctionner sur Envoy et Apache APISIX en même temps.
Nous utilisons l'exemple précédent pour montrer comment le plugin fonctionne :
Première étape, lire la configuration
Nous configurons via les métadonnées pour déterminer quels plugins doivent fonctionner sur chaque route et quelle configuration est nécessaire pour chaque plugin. Dans l'exemple, nous avons configuré le plugin uri-blocker
pour la route dont le préfixe est /foo
, ainsi que la règle de blocage du plugin et le statut de réponse lorsqu'un blocage est nécessaire.
Deuxième étape, analyser la demande
Nous avons encapsulé les données de la demande du client dans ctx
afin qu'elles puissent être utilisées directement dans tout le processus.
Troisième étape, exécuter le plugin
Nous déterminons si nous devons bloquer cette demande en faisant correspondre les règles configurées et l'uri obtenu. Si un blocage est nécessaire, nous appelons respond
pour répondre directement, sinon nous la laissons passer.
Perspectives futures
De plus en plus de plugins APISIX sont disponibles pour fonctionner sur Envoy, et enfin tous les plugins APISIX (même ceux qui seront développés à l'avenir) seront disponibles pour fonctionner sur Envoy.
En même temps, nous espérons pouvoir collaborer avec la communauté Envoy dans la direction du filtre Lua, optimiser et améliorer le filtre Lua, renforcer les capacités d'extension d'Envoy, et réduire la difficulté d'extension d'Envoy.