Menggabungkan Permintaan API dengan API Gateway

Bobur Umurzokov

Bobur Umurzokov

May 23, 2023

Technology

Seiring dengan meningkatnya jumlah API yang perlu diintegrasikan, mengelola kompleksitas interaksi API menjadi semakin menantang. Dengan menggunakan API Gateway, kita dapat membuat urutan panggilan API, yang memecah alur kerja API menjadi langkah-langkah yang lebih kecil dan lebih mudah dikelola. Misalnya, dalam situs web belanja online, ketika pelanggan mencari produk, platform dapat mengirim permintaan ke API pencarian produk, kemudian mengirim permintaan ke API detail produk untuk mengambil informasi lebih lanjut tentang produk tersebut. Dalam artikel ini, kita akan membuat plugin kustom untuk Apache APISIX API Gateway untuk menangani permintaan klien yang harus dipanggil secara berurutan.

Tujuan pembelajaran

Anda akan mempelajari hal-hal berikut sepanjang artikel ini:

  • Apa itu permintaan API berantai?
  • Contoh panggilan API berurutan.
  • Cara membangun plugin pipeline-request kustom untuk Apache APISIX.
  • Demo plugin pipeline-request.

Pipelining API requests with API Gateway

Apa itu permintaan API berantai dan mengapa kita membutuhkannya?

Permintaan API berantai (atau permintaan pipeline, atau panggilan API berurutan) adalah teknik yang digunakan dalam pengembangan perangkat lunak untuk mengelola kompleksitas interaksi API di mana perangkat lunak membutuhkan beberapa panggilan API untuk menyelesaikan suatu tugas. Ini mirip dengan pemrosesan permintaan batch di mana Anda mengelompokkan beberapa permintaan API menjadi satu permintaan dan mengirimkannya ke server sebagai batch. Meskipun terlihat mirip, permintaan pipeline melibatkan pengiriman satu permintaan ke server yang memicu serangkaian permintaan API untuk dieksekusi dalam urutan yang telah ditentukan. Setiap permintaan API dalam urutan tersebut dapat memodifikasi data permintaan dan respons, dan respons dari satu permintaan API diteruskan sebagai input ke permintaan API berikutnya dalam urutan tersebut. Permintaan pipeline dapat berguna ketika klien perlu mengeksekusi serangkaian permintaan API yang saling bergantung dan harus dieksekusi dalam urutan tertentu.

Di setiap langkah pipeline, kita dapat mentransformasi atau memanipulasi data respons sebelum meneruskannya ke langkah berikutnya. Ini dapat berguna dalam situasi di mana data perlu dinormalisasi atau ditransformasi atau menyaring data sensitif sebelum dikembalikan ke klien. Ini dapat membantu mengurangi latensi secara keseluruhan. Misalnya, satu panggilan API dapat dilakukan sementara yang lain menunggu respons, sehingga mengurangi waktu keseluruhan yang dibutuhkan untuk menyelesaikan alur kerja.

sequential API calls with API Gateway

Plugin pipeline-request kustom untuk Apache APISIX

API gateway dapat menjadi tempat yang tepat untuk mengimplementasikan fungsi ini karena dapat mencegat semua permintaan aplikasi klien dan meneruskannya ke tujuan yang dimaksud. Kami akan menggunakan Apache APISIX karena ini adalah solusi API Gateway open-source populer dengan banyak plugin bawaan. Namun, pada saat mengembangkan posting blog ini, APISIX belum memiliki dukungan resmi untuk plugin pipeline-request. Dengan pengetahuan tentang kemampuan pengembangan plugin kustom APISIX, kami memutuskan untuk memperkenalkan plugin baru yang dapat menawarkan fitur yang sama. Ada repositori di GitHub dengan kode sumber yang ditulis dalam bahasa pemrograman Lua dan deskripsi tentang plugin pipeline-request.

Dengan plugin ini, Anda dapat menentukan daftar API upstream yang harus dipanggil secara berurutan untuk menangani satu permintaan klien. Setiap API upstream dapat memodifikasi data permintaan dan respons, dan respons dari satu API upstream diteruskan sebagai input ke API upstream berikutnya dalam pipeline. Pipeline dapat didefinisikan dalam konfigurasi Route, dan Anda juga dapat menentukan urutan untuk URL API ketika pipeline harus mengeksekusinya.

Mari kita pahami penggunaan plugin ini dengan contoh. Misalkan Anda memiliki dua API - satu yang membuat permintaan GET /credit_cards untuk mengambil informasi kartu kredit dan yang lain yang menerima data respons sebelumnya di badan permintaan POST /filter dan kemudian menyaring data sensitif (seperti nomor kartu kredit dan tanggal kedaluwarsa) sebelum mengembalikan respons ke klien. Karena endpoint API kartu kredit mengembalikan informasi sensitif yang tidak boleh diungkapkan kepada pihak yang tidak berwenang. Diagram di bawah ini menggambarkan aliran data secara keseluruhan:

sequential API calls with API Gateway to filter

  1. Ketika klien membuat permintaan ke endpoint API kartu kredit dari API Gateway untuk mengambil semua informasi kartu kredit, API Gateway meneruskan permintaan untuk mengambil data kartu kredit dari layanan backend kartu kredit.
  2. Jika permintaan berhasil dan mengembalikan data kartu kredit, maka itu diteruskan ke langkah berikutnya dalam pipeline yaitu layanan keamanan.
  3. Ketika respons yang telah disaring diterima dari layanan keamanan, itu mengembalikan respons gabungan ke klien.

Demo plugin pipeline-request

Untuk demo ini, kami akan memanfaatkan proyek demo yang telah disiapkan di GitHub di mana Anda dapat menemukan semua contoh perintah curl yang digunakan dalam tutorial ini, menjalankan APISIX dan mengaktifkan plugin kustom tanpa konfigurasi tambahan dengan file Docker compose.yml.

Prasyarat

  • Docker digunakan untuk menginstal etcd dan APISIX yang telah dikontainerisasi.
  • curl digunakan untuk mengirim permintaan ke API Admin APISIX. Anda juga dapat menggunakan alat mudah seperti Postman untuk berinteraksi dengan API.

Langkah 1: Instal dan jalankan APISIX dan etcd

Anda dapat dengan mudah menginstal APISIX dan etcd dengan menjalankan docker compose up dari folder root proyek setelah Anda fork/klon proyek. Anda mungkin memperhatikan bahwa ada volume ./custom-plugins:/opt/apisix/plugins:ro yang ditentukan dalam file docker-compose.yml. Ini memasang direktori lokal ./custom-plugins di mana file pipeline-request.lua kami dengan implementasi plugin kustom sebagai volume baca-saja di kontainer docker di path /opt/apisix/plugins. Ini memungkinkan plugin kustom ditambahkan ke APISIX saat runtime (Pengaturan ini hanya berlaku jika Anda menjalankan APISIX dengan docker).

Langkah 2: Buat Route pertama dengan plugin pipeline-request

Setelah APISIX berjalan, kami menggunakan perintah cURL yang digunakan untuk mengirim permintaan HTTP PUT ke endpoint /routes API Admin APISIX untuk membuat route pertama kami yang mendengarkan path URI /my-credit-cards.

curl -X PUT 'http://127.0.0.1:9180/apisix/admin/routes/1' \ --header 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \ --header 'Content-Type: application/json' \ --data-raw '{ "uri":"/my-credit-cards", "plugins":{ "pipeline-request":{ "nodes":[ { "url":"https://random-data-api.com/api/v2/credit_cards" }, { "url":"http://127.0.0.1:9080/filter" } ] } } }'

Bagian penting dari konfigurasi adalah bagian "plugins", yang menentukan bahwa plugin "pipeline-request" harus digunakan untuk route API ini. Konfigurasi plugin berisi array "nodes", yang mendefinisikan urutan permintaan API yang harus dieksekusi dalam pipeline. Anda dapat mendefinisikan satu atau beberapa API di sana. Dalam kasus ini, pipeline terdiri dari dua node: node pertama mengirim permintaan ke API https://random-data-api.com/api/v2/credit_cards untuk mengambil data kartu kredit, dan node kedua mengirim permintaan ke API lokal di http://127.0.0.1:9080/filter untuk menyaring data sensitif dari informasi kartu kredit. API kedua ini hanya akan menjadi fungsi serverless menggunakan plugin serverless-pre-function APISIX. Ini bertindak hanya sebagai layanan backend untuk memodifikasi respons dari API pertama.

Langkah 3: Buat Route kedua dengan plugin serverless

Selanjutnya, kami mengkonfigurasi route baru dengan ID 2 yang menangani permintaan ke endpoint /filter dalam pipeline. Ini juga mengaktifkan plugin serverless-pre-function APISIX yang ada di mana kami menentukan fungsi Lua yang harus dieksekusi oleh plugin. Fungsi ini hanya mengambil badan permintaan dari respons sebelumnya, mengganti field nomor kartu kredit, dan membiarkan sisa respons tidak berubah. Akhirnya, ini mengatur badan respons saat ini ke badan permintaan yang telah dimodifikasi dan mengirim respons HTTP 200 kembali ke klien. Anda dapat memodifikasi skrip ini sesuai kebutuhan Anda, seperti menggunakan badan yang telah didekode untuk melakukan pemrosesan atau validasi lebih lanjut.

curl -X PUT 'http://127.0.0.1:9180/apisix/admin/routes/2' \ --header 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \ --header 'Content-Type: application/json' \ --data-raw ' { "uri": "/filter", "plugins":{ "serverless-pre-function": { "phase": "access", "functions": [ "return function(conf, ctx) local core = require(\"apisix.core\") local cjson = require(\"cjson.safe\") -- Get the request body local body = core.request.get_body() -- Decode the JSON body local decoded_body = cjson.decode(body) -- Hide the credit card number decoded_body.credit_card_number = \"****-****-****-****\" core.response.exit(200, decoded_body); end" ] } } }'

Langkah 3: Uji setup

Sekarang saatnya untuk menguji konfigurasi secara keseluruhan. Dengan perintah curl di bawah ini, kami mengirim permintaan HTTP GET ke endpoint http://127.0.0.1:9080/my-credit-cards.

curl http://127.0.0.1:9080/my-credit-cards

Kami memiliki route yang sesuai yang dikonfigurasi pada langkah kedua untuk menggunakan plugin pipeline-request dengan dua node, permintaan ini akan memicu pipeline untuk mengambil informasi kartu kredit dari endpoint https://random-data-api.com/api/v2/credit_cards, menyaring data sensitif menggunakan endpoint http://127.0.0.1:9080/filter, dan mengembalikan respons yang telah dimodifikasi ke klien. Lihat outputnya:

{ "uid":"a66239cd-960b-4e14-8d3c-a8940cedd907", "credit_card_expiry_date":"2025-05-10", "credit_card_type":"visa", "credit_card_number":"****-****-****-****", "id":2248 }

Seperti yang Anda lihat, ini mengganti nomor kartu kredit dalam badan permintaan (Sebenarnya, ini adalah respons dari panggilan API pertama dalam rantai) dengan tanda bintang.

Ringkasan

Sampai sekarang, kami telah mempelajari bahwa plugin pipeline request kustom kami untuk API Gateway Apache APISIX memungkinkan kami untuk mendefinisikan urutan panggilan API sebagai pipeline dalam urutan tertentu. Kami juga dapat menggunakan plugin baru ini dengan kombinasi plugin yang ada untuk mengaktifkan autentikasi, keamanan, dan fitur API Gateway lainnya untuk endpoint API kami.

Sumber daya terkait

Tags: