Membuka Solusi yang Disesuaikan: Memanfaatkan Apache APISIX dan Node-Red Secara Harmonis

March 6, 2024

Ecosystem

Latar Belakang

Banyak pengguna Apache APISIX memerlukan kustomisasi di lingkungan perusahaan untuk memenuhi persyaratan tertentu dalam beberapa skenario, meskipun APISIX memiliki banyak fitur plugin bawaan yang kuat.

Pengguna sering memilih untuk menulis plugin dalam Lua dan memasangnya ke instance APISIX untuk digunakan. Namun, Lua memiliki audiens yang relatif terbatas. Meskipun mudah untuk memulai, menguasainya tidaklah mudah, dan mengimplementasikan logika transformasi data yang kompleks dalam Lua bisa menjadi cukup rumit. Saat ini, hanya sebagian dari hook yang diekspos oleh Java Plugin Runner untuk dipanggil oleh pengembang, sehingga memerlukan modifikasi pada kode sumber Java Plugin Runner untuk fungsionalitas yang tidak didukung secara langsung.

Diagram di bawah ini mengilustrasikan tiga pola penggunaan plugin yang umum: plugin Lua berjalan langsung di inti APISIX; Plugin Runner berkomunikasi melalui RPC dengan Plugin Runner dalam bahasa seperti Java, Golang, dll.; dan plugin WASM dikonversi ke bytecode dan dijalankan di dalam inti APISIX.

plugin dan plugin runner dari apisix

Dari umpan balik pengguna, terlihat bahwa kebutuhan akan plugin kustom sering kali terkait dengan transformasi data seperti parameter permintaan HTTP dan memanggil API eksternal untuk pemrosesan data.

Untuk mengatasi hal ini, telah diusulkan pendekatan baru untuk meningkatkan kemampuan Apache APISIX. Pendekatan ini melibatkan penggunaan hanya plugin bawaan di Apache APISIX untuk mengonfigurasi kemampuan umum seperti autentikasi dan pembatasan laju sementara menempatkan logika kustom baru di layanan eksternal. Layanan eksternal ini bisa berupa program biner atau layanan API lain, yang akan diperlakukan sebagai upstream untuk APISIX. Layanan eksternal ini akan menangani permintaan dan respons seperti middleware. Pendekatan ini juga dapat diterapkan pada gateway API atau layanan proxy lainnya.

Deskripsi Skenario

Kami memiliki serangkaian layanan yang menyediakan layanan kueri data di upstream (artikel ini menggunakan https://api-ninjas.com/api sebagai contoh). Misalnya, seseorang dapat mengambil informasi cuaca terbaru dan informasi tentang negara (seperti GDP negara, nama ibu kota, dan unit mata uang) berdasarkan nama kota.

Tujuan utama kami adalah menyediakan antarmuka permintaan yang generik untuk pengembang sementara masih dapat menentukan konten data yang ingin mereka ambil berdasarkan nama kota dan parameter cakupan data. Selain itu, untuk melindungi layanan upstream dari penyalahgunaan, kami harus menambahkan layanan autentikasi ke antarmuka pengembang, sehingga hanya permintaan dengan API Key yang benar yang akan diteruskan ke layanan upstream.

Analisis Masalah

Sebelum memperkenalkan Node-Red, untuk memenuhi persyaratan di atas, pengembang APISIX akan mempertimbangkan untuk menggunakan plugin Lua. Meskipun Apache APISIX menyediakan dokumentasi pengembangan plugin yang detail, pengembang bisnis perlu mempelajari sintaks Lua dan teknik tuning, memahami berbagai hook permintaan yang diekspos oleh APISIX, dan terus memuat ulang plugin untuk validasi sambil menulis logika untuk ekstraksi dan validasi parameter. Setelah menyelesaikan pengujian, mereka juga perlu mengemas plugin Lua ke dalam program APISIX atau mendistribusikannya ke semua instance APISIX untuk dipasang.

Contoh persyaratan yang kami berikan dalam blog ini melibatkan penguraian parameter tertentu dari permintaan klien dan kemudian membangun permintaan untuk mengambil data dari layanan upstream yang berbeda. Namun, kami menghabiskan banyak waktu untuk menangani transaksi di luar penulisan bisnis. Oleh karena itu, untuk logika yang melibatkan konversi parameter, konversi format, atau panggilan eksternal, kami dapat mengadopsi pendekatan yang lebih ringan dan intuitif, yang tepatnya adalah masalah yang dapat diselesaikan oleh Node-Red.

Pengenalan Node-Red

Node-RED adalah alat pemrograman berbasis alur yang kuat dan mudah digunakan, cocok untuk tugas otomatisasi dan pemrosesan alur data di berbagai domain. Antarmuka pemrogramannya, perpustakaan node yang kaya, dan fleksibilitas ekstensibilitas memungkinkan kami untuk dengan cepat membangun alur yang kompleks dan mengimplementasikan berbagai skenario aplikasi. Berikut adalah beberapa node yang disediakan oleh Node-RED:

  • HTTP_IN node: Mengekspos endpoint untuk pemanggilan layanan eksternal, yang akan kami gunakan sebagai layanan upstream untuk APISIX.

  • Function node: Memungkinkan pengembang untuk menulis fungsi kode dalam JavaScript untuk memodifikasi, menghapus, dll., input/output.

  • Switch node: Memungkinkan pengembang untuk menetapkan serangkaian kondisi untuk memasuki node berikutnya yang ditentukan ketika suatu kondisi terpenuhi.

  • HTTP_Request node: Dapat mengatur URL, dll., untuk mengirim data ke endpoint ini melalui Node-RED saat menjalankan seluruh alur kerja.

  • Change node: Dapat menambah, memodifikasi, atau menghapus nilai tertentu dari objek tertentu.

  • HTTP_Response node: Digunakan untuk mengembalikan respons ke klien.

Selain node yang tercantum di atas, Node-RED juga menyediakan banyak node bawaan lainnya. Artikel ini akan menunjukkan kepada pembaca bagaimana mengimplementasikan persyaratan di atas melalui Node-RED.

Demonstrasi Contoh

Penyiapan Lingkungan

Kami akan menyebarkan komponen yang diperlukan melalui kontainerisasi, menggunakan DigitalOcean Droplet sebagai sumber daya server.

$ doctl compute ssh-key list ID Name FingerPrint 25621060 Zhiyuan Ju 2c:84:b7:d8:14:0a:a0:0f:ca:fe:ca:24:06:a4:fe:39 $ doctl compute droplet create \ --image docker-20-04 \ --size s-2vcpu-4gb-amd \ --region sgp1 \ --vpc-uuid 646cf2b8-03d8-4f48-b7c8-57cdee60ad27 \ --ssh-keys 25621060 \ apisix-nodered-docker-ubuntu-s-2vcpu-4gb-amd-sgp1-01 $ doctl compute droplet list ID Name Public IPv4 Private IPv4 Public IPv6 Memory VCPUs Disk Region Image VPC UUID Status Tags Features Volumes 404094941 apisix-nodered-docker-ubuntu-s-2vcpu-4gb-amd-sgp1-01 143.198.192.64 10.104.0.3 4096 2 80 sgp1 Ubuntu Docker 25.0.3 on Ubuntu 22.04 646cf2b8-03d8-4f48-b7c8-57cdee60ad27 active droplet_agent,private_networking

Menyebarkan Apache APISIX

Kami akan menggunakan APISIX Quickstart untuk memulai instance APISIX baru, untuk dokumentasi spesifik silakan merujuk ke https://docs.api7.ai/apisix/getting-started/.

$ curl -sL https://run.api7.ai/apisix/quickstart | sh

Menyebarkan Node-RED

Node-RED menyediakan berbagai metode penyebaran, dan kami akan menyebarkannya dengan cepat melalui Docker dan mengintegrasikannya dengan lingkungan yang ada. Untuk detail penyebaran lebih lanjut, silakan merujuk ke dokumentasi resmi: https://nodered.org/docs/getting-started/.

Saat menyebarkan Node-RED, pastikan kontainer ditambahkan ke jaringan APISIX untuk memastikan dapat berkomunikasi dengan APISIX dan menangani permintaan.

$ docker run -d -it -p 1880:1880 -v $PWD/configs/nodered/data:/data --network=apisix-quickstart-net --name mynodered -u Node-Red:dialout nodered/Node-Red

Mengonfigurasi Node-RED

  1. Untuk menangani permintaan yang masuk ke Node-RED dari APISIX, Node-Red perlu memeriksa apakah parameter dalam permintaan ada dan valid. Jika parameter hilang atau tidak valid, pesan kesalahan akan dikembalikan. Jika valid, node berikutnya akan dieksekusi. Dalam skenario spesifik ini, kami hanya mengizinkan kueri data untuk dua kota, Stockholm (city=stockholm) dan Berlin (city=berlin).

Gunakan Node-Red untuk memeriksa parameter

  1. Setelah permintaan masuk ke node berikutnya, Node-RED perlu menentukan jenis data yang diminta. Dalam skenario ini, ada tiga jenis: informasi cuaca (scope=weather), informasi tentang negara tempat kota tersebut berada (scope=country), dan GDP negara tempat kota tersebut berada (scope=gdp).

Gunakan Node-Red untuk menargetkan jenis data

  1. Jika kedua parameter City dan Scope valid, Node-RED akan menentukan API mana yang akan mengambil data berdasarkan nilai scope. Setelah mengatur URL, Method, Payload, X-API-Key, dll., node Node-RED akan mengakses endpoint yang sesuai untuk mengambil data saat dipicu.

Pilih API untuk mendapatkan data sesuai scope

  1. Saat mengambil data untuk scope=gdp, Node-RED perlu mengekstrak nilai GDP dari badan respons API eksternal. Ini dapat dilakukan menggunakan node Change untuk ekstraksi atau node Function.

Parse nilai GDP dari badan respons API eksternal

  1. Akhirnya, Node-RED akan mengembalikan data yang diproses ke APISIX, yang akan meneruskannya ke klien. Diagram Node-RED akhir ditunjukkan di bawah ini.

Diagram alur kombinasi APISIX dan Node-Red

Membuat Rute APISIX

Untuk membuat layanan Node-Red tersedia untuk klien, kami perlu menggunakan APISIX sebagai proxy terbalik untuk endpoint yang diekspos oleh Node-Red. Berikut adalah langkah-langkah yang perlu Anda ikuti:

  1. Buat Rute APISIX dan atur mynodered:1880 sebagai upstream untuk Rute ini. Dengan melakukan ini, semua permintaan yang dikirim ke endpoint ini akan diteruskan ke layanan Node-Red.

  2. Aktifkan Autentikasi Kunci untuk memastikan bahwa hanya permintaan yang membawa API Key yang valid yang dapat melewati autentikasi dan mengakses layanan Node-Red.

Dengan mengikuti langkah-langkah di atas, kami dapat dengan aman mengekspos layanan Node-Red ke klien dan memastikan bahwa hanya pengguna yang berwenang yang dapat mengaksesnya.

$ curl -i "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d ' { "id": "proxy-global-data-endpoint", "uri": "/global-data", "upstream": { "type": "roundrobin", "nodes": { "mynodered:1880": 1 } }, "plugins": { "key-auth": {} } }' $ curl -i "http://127.0.0.1:9180/apisix/admin/consumers" -X PUT -d ' { "username": "tom", "plugins": { "key-auth": { "key": "secret-key" } } }'

Validasi Permintaan

Kami akan mencoba beberapa skenario secara terpisah untuk memverifikasi apakah APISIX dan Node-Red berperilaku seperti yang diharapkan:

Skenario 1

  • Deskripsi Skenario: Mengakses API dengan Key yang salah.

  • Hasil yang Diharapkan: Karena API Key yang diberikan salah, permintaan harus ditolak, dan pesan kesalahan yang sesuai harus dikembalikan.

$ curl http://143.198.192.64:9080/global-data -H "apikey: invalid-key" -i HTTP/1.1 401 Unauthorized Date: Mon, 04 Mar 2024 07:47:24 GMT Content-Type: text/plain; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Server: APISIX/3.8.0 {"message":"Invalid API key in request"}

Skenario 2

  • Deskripsi Skenario: Mengakses API dengan Key yang benar, tetapi bidang City yang tidak valid.

  • Hasil yang Diharapkan: Karena parameter permintaan tidak memenuhi persyaratan, pesan kesalahan yang sesuai harus dikembalikan, menunjukkan bahwa bidang City tidak valid.

$ curl "http://143.198.192.64:9080/global-data?city=singapore&scope=country" -H "apikey: secret-key" -i HTTP/1.1 400 Bad Request Content-Type: application/json; charset=utf-8 Content-Length: 69 Connection: keep-alive Access-Control-Allow-Origin: * X-Content-Type-Options: nosniff ETag: W/"45-IOhgB2XkDHi2Kt4PP42n1xa8Gys" Date: Mon, 04 Mar 2024 07:48:02 GMT Server: APISIX/3.8.0 {"errorCode":400,"message":"Allowed city Options: Stockholm, Berlin"}

Skenario 3

  • Deskripsi Skenario: Mengakses API dengan Key yang benar, dan bidang City dan Scope yang valid untuk mengambil data negara.

  • Hasil yang Diharapkan: Permintaan harus berhasil, dan informasi relevan tentang negara tempat City tersebut berada harus dikembalikan.

$ curl "http://143.198.192.64:9080/global-data?city=stockholm&scope=country" -H "apikey: secret-key" -i HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Content-Length: 947 Connection: keep-alive Access-Control-Allow-Origin: * X-Content-Type-Options: nosniff ETag: W/"3b3-XDlm9OHfuUrWH+g42q8L1F2uu/o" Date: Mon, 04 Mar 2024 07:48:26 GMT Server: APISIX/3.8.0 [{"gdp":556086,"sex_ratio":100.4,"surface_area":438574,"life_expectancy_male":80.8,"unemployment":6.7,"imports":158710,"homicide_rate":1.1,"currency":{"code":"SEK","name":"Swedish Krona"},"iso2":"SE","employment_services":80.7,"employment_industry":17.7,"urban_population_growth":1.1,"secondary_school_enrollment_female":157.9,"employment_agriculture":1.6,"capital":"Stockholm","co2_emissions":37.6,"forested_area":68.9,"tourists":7440,"exports":160538,"life_expectancy_female":84.4,"post_secondary_enrollment_female":82.1,"post_secondary_enrollment_male":52.7,"primary_school_enrollment_female":127.4,"infant_mortality":2,"gdp_growth":2.2,"threatened_species":98,"population":10099,"urban_population":87.7,"secondary_school_enrollment_male":148.1,"name":"Sweden","pop_growth":0.7,"region":"Northern Europe","pop_density":24.6,"internet_users":92.1,"gdp_per_capita":55766.8,"fertility":1.8,"refugees":310.4,"primary_school_enrollment_male":125.8}]

Skenario 4

  • Deskripsi Skenario: Mengakses API dengan Key yang benar, dan bidang City dan Scope yang valid untuk mengambil data GDP.

  • Hasil yang Diharapkan: Permintaan harus berhasil, dan data GDP untuk negara tempat City tersebut berada harus dikembalikan.

$ curl "http://143.198.192.64:9080/global-data?city=stockholm&scope=gdp" -H "apikey: secret-key" -i HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Content-Length: 6 Connection: keep-alive Access-Control-Allow-Origin: * ETag: W/"6-j8I5kokycgWjCeKC1c2UfJW7AQY" Date: Mon, 04 Mar 2024 07:48:48 GMT Server: APISIX/3.8.0 556086

Dengan memverifikasi empat skenario ini, kami dapat memastikan bahwa APISIX dan Node-Red bekerja seperti yang diharapkan dan dapat menangani berbagai jenis permintaan dengan benar.

Ringkasan

Kami menyediakan pendekatan baru untuk lebih cerdas mengatasi masalah pengembangan kemampuan kustom, yang ditunjukkan melalui contoh yang detail.

  1. Perutean Permintaan API dan Verifikasi Identitas: Pertama, memanfaatkan fungsionalitas perutean Apache APISIX dan plugin autentikasi, APISIX meneruskan permintaan klien ke layanan Node-Red ketika kredensial yang diberikan valid.

  2. Pemrosesan dan Transformasi Permintaan: Di Node-Red, kami membuat alur untuk memproses permintaan API yang masuk. Dengan menggunakan node input HTTP untuk menerima permintaan dari APISIX, kami mengurai dan memvalidasi parameter permintaan untuk memastikan mereka memenuhi persyaratan bisnis.

  3. Pemrosesan Logika Bisnis: Setelah menerima permintaan yang valid, kami dapat menjalankan logika bisnis di Node-Red. Misalnya, mengirim permintaan ke berbagai API bisnis berdasarkan parameter untuk mengambil data dan mengekstrak bidang yang diperlukan dari respons. Setelah menyelesaikan operasi ini, data akhir dikembalikan ke APISIX.

  4. Penanganan Kesalahan dan Pencatatan: Selama pemrosesan, jika terjadi kesalahan atau pengecualian, kami dapat menambahkan node penanganan kesalahan di Node-Red untuk menangkap dan menangani situasi yang tidak biasa. Selain itu, kami dapat menggunakan node pencatatan untuk mencatat informasi kunci selama pemrosesan untuk pemecahan masalah dan analisis selanjutnya, yang tidak ditunjukkan dalam contoh ini.

Dengan menggabungkan APISIX dan Node-Red, kami dapat secara visual mengimplementasikan proses penanganan permintaan yang lengkap, termasuk perutean permintaan, pemrosesan data, logika bisnis, dll., tanpa perlu menulis kode atau plugin yang kompleks. Solusi yang fleksibel dan dapat disesuaikan ini dapat membantu kami membangun dan menyesuaikan fungsionalitas sistem dengan lebih cepat, meningkatkan efisiensi pengembangan, mengurangi biaya pengembangan, dan memastikan stabilitas dan skalabilitas sistem.

Tags: