Envoy dan Apache APISIX: Cara Lain untuk Mengimplementasikan Envoy Filter
API7.ai
December 16, 2020
Cara Mengimplementasikan Envoy Filter
Envoy Filter
Envoy adalah proxy L7 dan bus komunikasi yang dirancang untuk arsitektur layanan modern berskala besar. Mekanisme rantai filter yang dapat dipasang memungkinkan filter ditulis untuk melakukan berbagai tugas dan dimasukkan ke dalam server utama.

Metode Perluasan
Filter yang ada mungkin tidak memenuhi kebutuhan kustomisasi pengguna. Dalam hal ini, Envoy perlu diperluas. Kustomisasi filter baru sesuai dengan rantai filter yang ada untuk memenuhi kebutuhan kustomisasi.
Pengembang dapat memperluas Envoy dengan tiga cara:
| Tingkat Kesulitan Memulai | Stabilitas | Efisiensi Pengembangan | Proses Deploy dan Kompilasi | |
|---|---|---|---|---|
| C++ | tinggi | stabil | rendah | waktu kompilasi lama |
| Lua | rendah | stabil | tinggi | tidak perlu kompilasi, langsung deploy |
| WASM | sedang-tinggi | belum pasti | tergantung bahasa | waktu kompilasi tergantung bahasa |
- Menggunakan C++ untuk Perluasan
Dalam cara ini, kode C++ ditulis langsung di atas basis Envoy untuk peningkatan fungsional. Setelah mengimplementasikan filter kustom, file biner baru dikompilasi ulang untuk menyelesaikan pembaruan. Ada dua masalah dengan cara ini:
- Terbatas oleh bahasa C++, kesulitan memulai, dan kelangkaan pengembang.
- Meningkatkan kompleksitas deployment, operasi, dan pemeliharaan. Envoy akan menjadi semakin berat, dan setiap perubahan memerlukan kompilasi ulang file biner, yang tidak mendukung iterasi dan manajemen.
- Menggunakan Lua untuk Perluasan
Lua dirancang untuk disematkan dalam aplikasi, sehingga menyediakan fitur perluasan dan kustomisasi yang fleksibel, dan digunakan secara luas.
Lua Filter memungkinkan skrip Lua dijalankan dalam proses permintaan dan respons. Fitur utama yang saat ini didukung meliputi: inspeksi header, body, dan trailer saat streaming dalam aliran permintaan atau respons; modifikasi header dan trailer; memblokir dan mem-buffer seluruh body permintaan/respons untuk inspeksi; melakukan panggilan HTTP async ke host upstream; melakukan respons langsung dan melewati iterasi filter lebih lanjut, dll.
Saat ini, banyak orang langsung mendistribusikan kode Lua dalam konfigurasi, yang tidak mendukung organisasi dan manajemen kode, serta sulit untuk dibagikan dengan orang lain untuk membentuk ekosistem.
- Menggunakan WASM untuk Perluasan
Pengembang dapat menulis filter dalam bahasa pemrograman mereka sendiri, mengkompilasinya ke format WASM menggunakan alat, dan menyematkannya ke Envoy untuk dijalankan.
Saat ini hanya mendukung sedikit bahasa, dan menggunakan bahasa-bahasa ini untuk perluasan masih tidak semudah itu. Di sisi lain, banyak orang masih ragu-ragu terhadap WASM dan mungkin tidak langsung menggunakannya.
Solusi Apache APISIX
Berdasarkan analisis di atas, kita dapat melihat bahwa Lua sangat cocok untuk memperluas Envoy, mudah dipelajari, dan efisiensi pengembangannya sangat tinggi. Karena disematkan dalam Envoy, tidak ada overhead jaringan tambahan, dan performanya baik.
Komunitas Apache APISIX mengusulkan solusinya sendiri berdasarkan Lua, yaitu menyediakan library dasar yang kuat dan fleksibel untuk mengimplementasikan semua plugin Apache APISIX dan plugin yang akan dikembangkan di masa depan agar dapat berjalan di Envoy. Pengembang juga dapat mengembangkan plugin kustom mereka sendiri berdasarkan library dasar ini.
Apache APISIX adalah API gateway yang dinamis, real-time, dan berkinerja tinggi, berbasis library Nginx dan Lua. Apache APISIX menyediakan fitur manajemen lalu lintas yang kaya seperti load balancing, upstream dinamis, canary release, circuit breaking, autentikasi, observabilitas, dan banyak lagi.
Contoh
Silakan periksa repo untuk kode spesifik dan cara menjalankannya: https://github.com/api7/envoy-apisix.
Konfigurasi Envoy yang relevan adalah sebagai berikut:
Mendefinisikan Filter:
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
Mengaktifkan Filter untuk suatu rute dan mengkonfigurasinya dengan metadata:
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+
Bagaimana Cara Kerjanya
Kita tidak perlu melakukan perubahan besar pada Envoy, hanya beberapa optimasi yang sesuai dengan kebutuhan umum.
Kita menyamarkan perbedaan platform untuk lapisan plugin. Semua antarmuka yang perlu digunakan diabstraksi dalam framework dasar, yang kita sebut apisix.core, sehingga semua plugin dapat berjalan di Envoy dan Apache APISIX secara bersamaan.

Kita menggunakan contoh sebelumnya untuk menunjukkan bagaimana plugin berjalan:

Langkah pertama, membaca konfigurasi
Kita mengkonfigurasi melalui metadata untuk menentukan plugin apa yang perlu dijalankan pada setiap rute dan konfigurasi apa yang diperlukan untuk setiap plugin. Dalam contoh, kita mengkonfigurasi plugin uri-blocker untuk rute dengan prefiks /foo, serta aturan blokir plugin dan status respons yang diperlukan saat blokir diperlukan.
Langkah kedua, memparsing permintaan
Kita membungkus data permintaan klien ke dalam ctx sehingga dapat digunakan langsung dalam seluruh proses.
Langkah ketiga, menjalankan plugin
Kita menentukan apakah perlu memblokir permintaan ini dengan mencocokkan aturan yang dikonfigurasi dan uri yang diperoleh. Jika blokir diperlukan, kita memanggil respond untuk langsung merespons, jika tidak, kita membiarkannya.
Pandangan ke Depan
Semakin banyak plugin APISIX yang tersedia untuk berjalan di Envoy, dan akhirnya semua plugin APISIX (bahkan yang akan dikembangkan di masa depan) akan tersedia untuk berjalan di Envoy.
Pada saat yang sama, kami berharap dapat bekerja sama dengan komunitas Envoy dalam arah Lua Filter, mengoptimalkan dan meningkatkan Lua Filter, meningkatkan kemampuan perluasan Envoy, dan mengurangi kesulitan perluasan Envoy.