Berkenalan dengan Kong API Gateway dan mencobanya dengan Docker
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).
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.
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.
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.
Kemudian pilih menu connections
. Kita akan tambahkan koneksi baru dengan Kong admin API yang sudah kita jalankan sebelumnya.
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
.
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
Jika semuanya lancar, maka akan ada 5 container yang berjalan dalam network kong-net
.
Buka menu services
, dan klik Add New Service
.
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.
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.
Kemudian pilih section Routes. Klik Add Route
.
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.
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
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.