Berkenalan dengan Kong API Gateway dan mencobanya dengan Docker

Wuriyanto
TelkomDev
Published in
7 min readDec 29, 2019
https://konghq.com/

Microservices problem

Pada arsitektur aplikasi modern dengan menerapkan arsitektur microservices, mau tidak mau kita akan berhadapan dengan banyaknya microservices yang akan kita kelola secara bersamaan. Selain itu jumlah service yang banyak dan lokasinya (host+port) dapat berubah sewaktu-waktu, hal ini akan menyulitkan client (mobile app, web frontend, service lain) ketika client-client tersebut mengakses service-service tersebut secara individual. Atau bisa dikatakan setiap client tadi akan mengakses setiap publik endpoint service tersebut. Misal (https://serviceName.api.company.name).

https://www.nginx.com/blog/building-microservices-using-an-api-gateway/

Nah berdasarkan masalah diatas, maka dibutuhkan entitas yang bertindak sebagai penerus dan penengah diantara client (mobile app, web frontend, service lain) dengan aktual service kita. Atau biasa disebut dengan API Gateway, API middleware, atau service mesh.

API Gateway

API Gateway adalah aplikasi/server yang bertindak sebagai single entry point pada sistem yang kita bangun. Dalam hal ini adalah aplikasi yang kita bangun dengan arsitektur microservices. Selain itu API Gateway juga bertindak sebagai middleware, sehingga sistem internal yang kita bangun dibelakangnya bisa kita enkapsulasi. API Gateway juga bisa kita beri tanggung jawab lain seperti logging, authentication, rate limiting, caching, transforming, dan load balancing.

https://www.nginx.com/blog/building-microservices-using-an-api-gateway/

Dengan adanya API Gateway, aplikasi client kita hanya berhubungan dengan entry point-nya saja.

Berkenalan dengan Kong

Kong adalah open source API Gateway yang digunakan untuk orchestrator microservices yang menyediakan fleksibilitas sebagai abstraction layer. Kong ditulis dengan bahasa pemrograman Lua dan berjalan diatas Nginx. Ketika kita membangun aplikasi mobile, web, atau IOT misalnya, maka Kong yang akan bertindak sebagai API Gateway untuk berkomunikasi dengan service-service internal yang kita bangun. Sehingga fitur seperti logging, authentication, rate limiting, caching, transforming, dan load balancing, akan ditangani oleh Kong dan kita tidak perlu membuatnya sendiri untuk setiap service yang kita bangun.

https://github.com/Kong/kong/blob/master/README.md

Dengan adanya Kong, pada saat pengembangan aplikasi kita bisa fokus dengan fitur utama saja. Termasuk akan mempermudah client, karena client-client kita akan berhubungan dengan entry point-nya saja.

Mempersiapkan Kong dengan Docker

Pada saat artikel ini ditulis, terdapat satu issue di halaman Github resmi milik Kong. Dan issue tersebut saat ini belum disolve. Anda bisa melihatnya disini https://github.com/Kong/kong/issues/5324. Saya akan mengedit artikel ini ketika issue tersebut sudah solve. Dengan alasan tersebut, saya menggunakan Docker image resmi Kong versi 1.3.0 dengan jenis distribusi Linux Alpine. Selain itu kita juga akan menggunakan Postgres Database dan Konga (Kong Admin API) yang masing-masing akan kita jalankan menggunakan Docker.

Membuat network untuk menghubungkan beberapa container yang akan kita jalankan.

$ docker network create kong-net

Untuk melihat apakah kita berhasil membuat network dengan nama kong-net , kita cek dengan perintah berikut.

$ docker network list | grep kong
$ 56b17bda010f kong-net bridge local

Untuk menyimpan data konfigurasi Kong, kita akan menggunakan Postgres Database. Anda juga bisa menggunakan alternatif lain yaitu Apache Cassandra. Kita akan menggunakan Postgres versi 9.6 dengan distribusi Linux Debian. Untuk mempermudah, akan kita buatkan satu shell script untuk menjalankan Postgres Database container-nya.

Kita akan menjalankan container Postgres Database dengan menggunakan network kong-net dan kita beri nama container-nya dengan kong-database . Kemudian ubah permission dari shell script diatas

$ chmod 775 start_postgres

Kemudian jalankan shell script start_postgres .

$ ./script/start_postgres

Supaya Kong dan Postgres Database kita dapat terkoneksi dengan baik, kita akan melakukan migrasi manual untuk tabel-tabel yang diperlukan oleh Kong untuk menyimpan data-data konfigurasinya. Seperti sebelumnya, kita akan buat shell script untuk perintah migrasi.

Ingat, selalu gunakan network name yang sama, yaitu kong-net. Ubah permission dari shell script migration_bootstrap .

$ chmod 775 migration_bootstrap

Kemudian jalankan shell script migration_bootstrap .

$ ./script/migration_bootstrap

Sampai saat ini, kita sudah siap dengan Postgres Database dan tabel-tabel yang diperlukan oleh Kong. Selanjutnya kita akan jalankan Kong dengan Docker.

Buat shell script dengan nama start_kong .

Shell script yang kita buat berisi environment variable yang diperlukan oleh Kong. Seperti KONG_DATABASE=postgres karena pada demo ini saya menggunakan Postgres Database. Anda bisa mengubahnya menjadi cassandra , jika anda menggunakan database Apache Cassandra. Beberapa port penting yang kita expose seperti 8001 (admin API) dan 8000 (port API Gateway Kong).

Ubah permission dari shell script start_kong .

$ chmod 775 start_kong

Kemudian jalankan shell script start_kong. Jika semuanya lancar, anda bisa mencoba memanggil endpoint admin API dari Kong.

$ curl -i http://localhost:8001
$ HTTP/1.1 200 OK
Date: Sun, 29 Dec 2019 13:11:43 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: *
Server: kong/1.3.0
Content-Length: 6079
{"plugins":{"enabled_in_cluster":[],"available_on_server":{"correlation-id":true,"pre-function":true,"cors":true,...

Kong menyediakan admin API untuk mempermudah kita melakukan komunikasi dan konfigurasi dengan API Gateway Kong yang kita bangun. Untuk mempermudah lagi, kita akan menggunakan Konga. Konga adalah Admin UI untuk Kong yang dibelakang layar sebenarnya berkomunikasi dengan admin API milik Kong.

Sebelum menjalankan Konga didalam Docker container, sama seperti Kong, kita juga perlu melakukan migrasi manual untuk membuat tabel-tabel yang diperlukan oleh Konga.

Buat shell script dengan nama prepare_konga.

Ubah permission dari shell script prepare_konga.

$ chmod 775 prepare_konga

Kemudian jalankan shell script prepare_konga .

$ ./script/prepare_konga

Setelah manual migrasi untuk tabel-tabel milik Konga selesai, tahap selanjutnya adalah menjalankan Konga didalam Docker container.

Buat shell script baru dengan nama start_konga.

Ubah permission dari shell script start_konga.

$ chmod 775 start_konga 

Kemudian jalankan shell script start_konga .

$ ./script/start_konga

Setelah sukses, Konga admin UI akan running pada port 1337. Buka http://localhost:1337.

Konga Dashboard

Kemudian pilih menu connections . Kita akan tambahkan koneksi baru dengan Kong admin API yang sudah kita jalankan sebelumnya.

Membuat koneksi baru untuk Konga

Karena kita menggunakan Docker dan menggunakan network name yang sama yaitu kong-net untuk menjalankan Kong dan Konga, jadi kita menggunakan nama container-nya untuk membuat koneksi antara Konga dengan Kong. Tekan create connection .

Daftar koneksi

Kong Services dan Routes

Dua komponen penting dari Kong adalah services dan routes. Services adalah upstream server yang kita daftarkan dan akan kita proxy didalam API Gateway kita. Untuk mempermudah istilah upstream server, bisa kita bayangkan satu service adalah satu upstream server yang mewakili satu microservice kita. Jadi misal kita punya banyak microservice seperti Product, Cart, Order, dan User. Maka tiap microservice tersebut akan dibuatkan service masing-masing.

Routes adalah entry point yang digunakan oleh client untuk mengakses service yang sudah kita buat. Ketika request dari client match dengan routes-nya, makan Kong akan meneruskan request tersebut ke service yang dituju.

Mendaftarkan service

Untuk demo ini, kita akan memerlukan dua contoh microservices yang akan kita proxy kedalam Kong. Untuk mempercepat silahkan buka repository Github yang sudah saya buat https://github.com/telkomdev/kong-demo. Didalam repository ini sudah ada dua contoh microservices yaitu employee-service dan product-service.

Masuk kedalam folder employee-service, kemudian lakukan build image dan run image.

$ cd employee-service
$ make build
$ make run-docker

Lakukan hal yang sama juga untuk product-service.

Setelah langkah diatas, container akan dijalankan dalam detach mode. Untuk melihat container-container yang sudah kita jalankan pada langkah-langkah sebelumnya, gunakan docker ps .

$ docker ps
Daftar container yang sendang berjalan

Jika semuanya lancar, maka akan ada 5 container yang berjalan dalam network kong-net .

Buka menu services , dan klik Add New Service .

Tambah service baru

Seperti yang kita lakukan sebelumnya, kita menggunakan nama container untuk nama hostnya http://employee-service-kong:8003 karena container-container untuk demo ini berjalan dalam satu network. Isi path dengan / , kemudian klik submit service.

Lakukan hal yang sama juga untuk product-service.

Daftar service

Setelah langkah diatas, kita akan mempunyai dua service yang sudah kita buat, yaitu product-service dan employee-service.

Menambah routes

Services dan routes berhubungan satu sama lain. Kita tidak bisa membuat routes tanpa membuat services terlebih dahulu.

Klik employee-service di daftar services.

Section routes

Kemudian pilih section Routes. Klik Add Route .

Menambah route baru
Menambah route baru dengan HTTP Methods dan Strip Path=Yes

Isikan Name = employees, paths= /employee-service, methods= GET, POST, DELETE dan PUT, dan strip path = Yes. Path /employee-service ini nantinya akan menjadi namespace. Hal ini berguna untuk menghindari konflik antar service, jika kebetulan memiliki nama path yang sama.

Lakukan hal yang sama juga untuk product-service. Isikan Name = products, paths= /product-service, methods= GET, POST, DELETE dan PUT, dan strip path = Yes.

Daftar routes

Service dan routes sudah selesai kita buat. Kita akan coba melakukan request ke Kong API Gateway kita. Kali ini kita akan coba hit service employee-service.

$ curl -i http://user2:pass123@localhost:8000/employee-service/employees
Request ke employee-service melewati Kong API Gateway

Kesimpulan

Dengan menggunakan API Gateway dalam demo ini kita menggunakan Kong, kita bisa melakukan enkapsulasi terhadap kompleksitas microservice ataupun sistem internal yang kita bangun. Sehingga client hanya fokus dengan satu entry point saja. Yang kita lakukan didalam demo ini hanya tahap awal saja. Anda bisa melakukan banyak hal seperti menambahkan plugin, logging, custom authentication, rate limiting, caching, dan load balancing. Selamat mencoba.

Source Code

https://github.com/telkomdev/kong-demo

--

--