Kelola GraphQL API Anda dengan Efisien Menggunakan API Gateway
March 21, 2023
GraphQL adalah bahasa kueri untuk API yang kuat yang memungkinkan pengembang untuk mendefinisikan struktur data yang mereka butuhkan dari server, dan server merespons hanya dengan data tersebut. Hal ini membuatnya jauh lebih efisien dan fleksibel dibandingkan dengan REST API tradisional, yang seringkali memerlukan beberapa permintaan untuk mengambil data yang sama. Namun, mengelola API GraphQL bisa menjadi kompleks dan memakan waktu, terutama dalam skala besar. Di sinilah API Gateway berperan.
Salah satu fitur utama dari API Gateway modern seperti Apache APISIX adalah dukungannya untuk API GraphQL. APISIX memudahkan pengelolaan dan penskalaan API GraphQL menggunakan sistem konfigurasi yang fleksibel dan plugin yang kuat. Salah satu plugin tersebut adalah plugin degrapghql, yang memungkinkan kita untuk mengubah API GraphQL menjadi API REST. Dalam posting ini, kita akan menjelajahi fitur ini dengan sebuah contoh.
Tujuan pembelajaran
Anda akan mempelajari dan menemukan jawaban untuk pertanyaan-pertanyaan berikut sepanjang artikel:
- Apa itu plugin DeGraphQL?
- Apa saja kasus penggunaan dan fitur dari plugin DeGraphQL?
- Bagaimana cara menggunakan plugin DeGraphQL.
- Bagaimana cara mengubah REST menjadi GraphQL?
- Bagaimana cara mengelola lalu lintas API GraphQL?

Mengapa menggunakan plugin DeGraphQL?
Plugin ini mampu mengubah API yang diekspos oleh upstream GraphQL (layanan backend) menjadi endpoint REST tradisional dengan memetakan URI ke kueri GraphQL. Memanggil API REST dari klien biasa membuka manfaat GraphQL untuk lebih banyak orang, pertimbangkan kasus penggunaan berikut:
Kasus penggunaan 1: Pelanggan Anda yang sudah ada terbiasa menggunakan API REST dan tidak terlalu familiar dengan cara menulis kueri GraphQL. Untuk mempermudah mereka, Anda dapat menggunakan Apache APISIX API Gateway untuk mengubah API GraphQL menjadi API REST.
Kasus penggunaan 2: Anda berada di tim pengembangan front-end yang ingin mencoba fungsionalitas API GraphQL yang ada tanpa meminta tim back-end untuk mengimplementasikan server GraphQL baru.
Kasus penggunaan 3: Anda tidak memiliki akses untuk mengubah backend karena itu adalah sekumpulan API GraphQL yang sudah ada, mungkin dikelola oleh pihak ketiga.
Kasus penggunaan 4: Anda memiliki infrastruktur API REST yang sudah ada, tetapi Anda ingin mengevaluasi apakah GraphQL dapat bekerja untuk kebutuhan Anda.
Kasus penggunaan 5: Anda memiliki basis kode yang besar, dan migrasi GraphQL sedang terjadi di backend, tetapi Anda ingin menggunakan GraphQL sekarang tanpa menunggu.
Kasus penggunaan 6: Anda memiliki beberapa layanan mikro dan mereka menggunakan kombinasi dari kedua pendekatan. Anda ingin memungkinkan komunikasi yang lancar di antara mereka.
Apa saja fitur plugin DeGraphQL?
Plugin DeGraphQL menyediakan sejumlah fitur berguna yang memudahkan konfigurasi dan pengelolaan API GraphQL Anda, termasuk:
Validasi Permintaan: Ini dapat memvalidasi permintaan GraphQL yang masuk untuk memastikan mereka memenuhi kriteria tertentu. Ini dapat mencakup pemeriksaan struktur kueri, penegakan batasan tipe input, dan lainnya. Dengan memvalidasi permintaan, Anda dapat memastikan bahwa API Anda selalu menerima permintaan yang valid dan terbentuk dengan baik.
Parsing Kueri: Ini juga dapat mem-parsing kueri GraphQL, memungkinkan Anda untuk mengekstrak informasi spesifik dari kueri dan menggunakannya untuk menginformasikan perilaku API Anda. Ini dapat mencakup hal-hal seperti memilih layanan backend yang sesuai berdasarkan data yang diminta, atau memodifikasi respons berdasarkan parameter kueri tertentu.
Transformasi Respons: Terakhir, ini dapat mengubah respons GraphQL sebelum dikembalikan ke klien. Ini dapat berguna untuk hal-hal seperti menormalisasi struktur data, menghapus informasi sensitif, atau menambahkan data tambahan ke respons.
Dengan kemampuan ini, Apache APISIX tidak hanya memudahkan penggunaan REST dan GraphQL bersama-sama, tetapi Anda juga dapat menentukan batas kecepatan, menegakkan autentikasi dan otorisasi, memblokir klien yang mencoba menyalahgunakan API, dan memastikan API bekerja dengan mulus saat diperbarui dengan bantuan plugin bawaan lainnya.
Bagaimana cara menggunakan plugin DeGraphQL (Demo)
Dengan cukup pengetahuan teoritis, sekarang kita bisa melompat ke demo praktis dari plugin DeGraphQL. DeGraphQL memerlukan endpoint GraphQL untuk melakukan kueri. Sebagai contoh, kita akan menggunakan salah satu API GraphQL publik gratis yang mengambil informasi tentang negara, benua, dan bahasa https://countries.trevorblades.com/.
Jika Anda menavigasi ke tautan API Countries di atas, itu akan membuka playground di mana Anda dapat menulis beberapa kueri terhadap API GraphQL di UI.

Anda juga dapat membangun API GraphQL Anda sendiri menggunakan StepZen atau ApollographQL yang menyediakan studio GraphQL yang membantu Anda membangun dan mengimplementasikan API GraphQL Anda sendiri dengan menggabungkan API yang sudah dibangun sebelumnya seperti Accuweather, Airtable, GitHub, Twitter, Trello, dan lainnya. Misalnya, Anda menggabungkan dua API Accuteweather dan Countries bersama-sama untuk mengumpulkan informasi cuaca yang disediakan oleh nama negara/kota dan menempatkan APISIX di depan untuk mengkueri API dari REST.
Sekarang tugas kita adalah mengubah definisi kueri di atas menjadi panggilan REST sederhana dan mengirimnya sebagai data JSON. Sebagai hasilnya, Apache APISIX API Gateway mengekspos endpoint REST dan harus dapat merutekan semua permintaan ke API GraphQL.
Misalnya, semua permintaan REST ke API Gateway pada jalur URI /country-info dengan kueri dasar oleh kode negara harus dikonversi dan diteruskan ke API GraphQL countries https://countries.trevorblades.com/graphql.
Contoh perintah curl yang terlihat seperti ini:
curl -i http://127.0.0.1:9080/country-info -X POST -d \ '{ "code": "EE" }'
Dan kita harus mendapatkan respons dari API sebagai berikut:
{ "data": { "country": { "code": "EE", "capital": "Tallinn", "currency": "EUR", "languages": [ { "name": "Estonian" } ] } } }
Di bagian selanjutnya, kita akan mempelajari cara mencapai ini langkah demi langkah.
Mari kita jalankan Apache APISIX
Sebelum Anda dapat menggunakan plugin degrapghql, Anda perlu menginstal Apache APISIX. Anda dapat mengikuti instruksi instalasi di situs web Apache APISIX untuk memulai.
Prasyarat
- Docker digunakan untuk menginstal etcd dan APISIX yang dikontainerisasi.
- curl digunakan untuk mengirim permintaan ke APISIX untuk validasi. Anda juga dapat menggunakan alat mudah seperti Postman untuk berinteraksi dengan API.
APISIX dapat dengan mudah diinstal dan dijalankan dengan skrip quickstart berikut:
curl -sL https://run.api7.ai/apisix/quickstart | sh
Ini akan membuat dua kontainer Docker β etcd untuk menyimpan konfigurasi dan APISIX Gateway itu sendiri. Setelah Anda melihat pesan ββ APISIX is ready!β, kita dapat mengkonfigurasi upstream, plugin, dan rute melalui Admin API APISIX yang memproksi permintaan ke API GraphQL.
Buat Upstream
Selanjutnya, kita akan membuat objek Upstream untuk mendaftarkan API Countries GrapghQL di API Gateway:
curl "http://127.0.0.1:9180/apisix/admin/upstreams/1" -X PUT -d ' { "name": "GraphQL API upstream", "desc": "Register Countries GraphQL API as the upstream", "type": "roundrobin", "scheme": "https", "nodes": { "countries.trevorblades.com": 1 } }'
Buat Konfigurasi Plugin
Selanjutnya, buat objek konfigurasi plugin baru. Kita akan menggunakan dua plugin transformasi proxy-rewrite dan degraphql untuk menulis ulang host dan URI permintaan dan membuat kueri ke API GraphQL masing-masing.
curl http://127.0.0.1:9180/apisix/admin/plugin_configs/1 -X PUT -d ' { "plugins":{ "proxy-rewrite":{ "uri":"/graphql", "host":"countries.trevorblades.com" }, "degraphql":{ "query":"query Country($code: ID!) { country(code: $code) { code capital currency languages { name } } }", "variables":[ "code" ] } } }'
Dalam konfigurasi plugin DeGraphQL di atas, kita menetapkan dua atribut seperti query dan variables. Variabel kueri GraphQL dapat didefinisikan pada body permintaan Post atau URI dalam panggilan REST.
Kueri yang kita jalankan, dalam kasus ini, terlihat seperti berikut dan Anda dapat menggantinya dengan kueri Anda sendiri:
query ($code: ID!) { country(code: $code) { code capital currency languages { name } } }
Buat Rute dengan Plugin DeGraphQL
Langkah ini melibatkan penyiapan rute baru yang menggunakan konfigurasi plugin, dan mengkonfigurasi rute untuk bekerja dengan upstream (dengan mereferensikan ID mereka) yang kita buat di langkah sebelumnya:
curl -i http://127.0.0.1:9180/apisix/admin/routes/1 -X PUT -d ' { "name":"GraphQL API route", "desc":"Create a new route in APISIX for the Countries GraphQL API", "uri":"/country-info", "upstream_id":"1", "plugin_config_id":1 }'
Uji Aktivasi Plugin DeGraphQL
Sekarang mari kita uji setup baru ini dengan perintah curl berikut.
curl -i http://127.0.0.1:9080/country-info -X POST -d \ '{ "code": "EE" }'
Kita akan mendapatkan respons dari APISIX:
{ "data": { "country": { "code": "EE", "capital": "Tallinn", "currency": "EUR", "languages": [ { "name": "Estonian" } ] } } }
Variabel code yang sama juga dapat disediakan sebagai argumen GET:
curl -i http://127.0.0.1:9080/country-info?code=EE
Transformasi Respons
Dengan bantuan plugin response-rewrite Apisix, dimungkinkan untuk mengubah respons GraphQL sebelum dikembalikan ke klien. Mari kita gunakan plugin ini untuk menghapus kunci dan nilai currency dari respons JSON untuk hanya menampilkan yang lainnya. Untuk melakukannya, kita perlu menambahkan plugin response-rewrite ke konfigurasi plugin yang ada.
curl http://127.0.0.1:9180/apisix/admin/plugin_configs/1 -X PATCH -d ' { "plugins":{ "response-rewrite": { "filters":[ { "regex":"(?:\"currency\":\")(.*?)(?:\")", "scope":"once", "replace":"" } ], "vars":[ [ "status", "==", 200 ] ] } } }'
Setelah plugin ini diinstal, Anda dapat membuat permintaan ke /country-info sekali lagi dan melihat respons yang diubah:
{ "data": { "country": { "code": "EE", "capital": "Tallinn", "languages": [ { "name": "Estonian" } ] } } }
Ringkasan
Secara keseluruhan, plugin DeGraphQL adalah alat penting bagi pengembang yang membangun API GraphQL dengan APISIX. Fitur-fitur yang kuat dan konfigurasi yang mudah digunakan membuatnya mudah untuk diintegrasikan ke dalam API gateway yang sudah ada, sementara dukungan untuk fungsionalitas khusus GraphQL memastikan bahwa API Anda berkinerja tinggi, andal, dan dapat diskalakan.