Pengembangan software pada awalnya dilakukan secara monolitik, yaitu dengan menggabungkan semua komponennya dalam satu aplikasi . Namun, model ini memerlukan upaya ekstra untuk merespons perubahan yang terjadi dalam sistem. Jika ada komponen tertentu yang mengalami kesalahan, seluruh sistem dapat terpengaruh.
Untuk mengatasi hal itu, pengembangan software di era sekarang dilakukan menggunakan model microservice. Model ini dilakukan dengan membuat komponen2 software secara terpisah. Jika ada kesalahan pada satu komponen, tidak akan mempengaruhi fungsi keseluruhan software.
Pada artikel ini, kita akan membahas tentang konsep microservice, implementasi microservice dengan Node.js, dan membahas tentang bagaimana microservice mengubah praktik pengembangan perangkat lunak.
Aplikasi Microservice vs Monolitik
Aplikasi monolitik adalah aplikasi yang semua komponennya disusun sebagai sebuah kesatuan. Misal ketika kita sedang membangun sistem manajemen perpustakaan. Semua komponen sistem perpustakaan seperti buku, anggota, layanan dan databasenya digabungkan menjadi satu unit. Jika ada kesalahan pada salah satu komponen, seluruh sistem perlu dioffkan untuk memperbaiki kesalahan tersebut.
Oleh karena itu, aplikasi monolitik tidak fleksibel. Kita tidak dapat membangun fitur secara bersamaan dan akan kesulitan jika perlu pengembangan sistem yang berkelanjutan. Kebutuhan untuk membuat sistem dimana satu komponen yang salah tidak akan memengaruhi keseluruhan sistem menjadi penting.
Microservice hadir untuk menjawab kekurangan model monolitik. Pada microservice, setiap fitur aplikasi perangkat lunak dipisahkan dari yang lain, bahkan dalam banyak kasus dipisahkan antara server dan database untuk masing-masing fitur. Aplikasi yang dibangun dengan microservice bersifat lebih fleksibel, dan sering dikenal sebagai distributed application. Sebagai contoh untuk membangun e-commerce. Kita perlu membuat fitur pembayaran, keranjang, pelanggan, admin, dan pesanan. Masing-masing fitur ini akan memiliki server dan database tersendiri.
Masing2 fitur Layanan e-commerce akan berkomunikasi satu sama lain menggunakan REST-API. Dengan fitur yang dikembangkan secara independen satu sama lain, kita dapat dengan mudah mengidentifikasi fitur mana yang akan di-debug jika sistem mengalami kesalahan dan menghindari keharusan untuk mengofflinekan seluruh aplikasi.
Berbeda dengan aplikasi monolitik, aplikasi yang dikembangkan menggunakan layanan mikro dapat dengan mudah diperbesar. Kita dapat menggunakan bahasa pemrograman apa pun untuk mengembangkan microservice. Bahkan, Kita juga dapat menggunakan bahasa pemrograman yang berbeda untuk setiap fitur yang dibuat.
Microservice menawarkan pengalaman development yang lebih baik. Developer baru dalam tim tidak perlu memahami seluruh kode, melainkan hanya fitur yang akan dikerjakan. Hal ini akan meningkatkan produktivitas developer tersebut. Selain itu, microservice juga mendukung unit test yang dapat digunakan untuk menguji fungsionalitas tertentu.
Namun, penting untuk diingat bahwa membangun microservice memerlukan adaptasi terlebih dahulu, karena integrasi dan pengujian dari seluruh sistem bisa sangat sulit. Selain itu, microservice yang sudah sangat besar, menyebabkan biaya pemeliharaan yang tinggi. Dan, tidak selalu mudah untuk memigrasikan software yang telah dikembangkan menggunakan arsitektur monolitik ke micorservice, dan dapat menjadi tantangan tersendiri bagi aplikasi untuk menemukan lokasi fitur yang lain dalam jaringan yang kompleks.
Mengembangkan aplikasi microservice menggunakan Node.js
Untuk mengembangkan microservice, kita dapat menggunakan bahasa pemrograman apa pun, seperti Java, C#, atau Python. Tetapi disini kita akan menggunakan Node.js karena beberapa alasan. Salah satunya karena Node.js menggunakan arsitektur berbasis event (event-driven) yang memungkinkan untuk pengembangan aplikasi real-time yang efisien. Dukungan Node.js terhadap single-threading and asynchronous memungkinkan adanya mekanisme non-blocking yang menjadikan developer Node.js memiliki alur yang tidak terputus, koding yang cepat, scalable, dan mudah untuk dimaintain.
Untuk mengilustrasikan pengembangan aplikasi microservice dengan Node.js, Kita akan membuat aplikasi yang menggunakan layanan OpenWeather API. Berikut langkah2 yang perlu dilakukan:
- Membuat free account openweather. Klik disini untuk membuat akun di openweather.
- Buat folder proyek baru misalnya dengan nama weathermicroservice.
- Masuk ke folder weathermicroservice
- Pastikan kita telah menginstal Node.js dengan menjalankan perintah berikut:
node -v
- Jika belum terinstall, anda bisa mendownload nya di website resmi. Untuk menginstall anda bisa melihat artikel berikut.
- Jalankan perintah berikut untuk membuat file package.json
npm init -y
- Install dependency yang diperlukan (express, nodemon, request) dengan perintah berikut
npm install express nodemon request
- Berikut tampilan package.json setelah dependency terinstall
{ "name": "weathermicroservice", "version": "1.0.0", "description": "Build microservice architecture app that use weather api", "main": "server.js", "scripts": { "start": "nodemon server.js" }, "keywords": [ "microservice", "api", "weather" ], "author": "Choirul Ihwan", "license": "ISC", "dependencies": { "express": "^4.17.3", "nodemon": "^2.0.15", "request": "^2.88.2" } }
- Buat file server.js di root direktori dan tuliskan kode berikut.
// require express const express = require("express") //create an app using express constructor const weatherApp = express() // declare your port const port = 5000 // declare route const routes = require("./api/routes") // routing app routes(weatherApp) // app listening weatherApp.listen(port, ()=>{ console.log("Server is running on:" + port) })
- Buat folder api. Kemudian buat file route.js didalam folder api. Tuliskan kode berikut di file route.js
// create a controller object const controller = require("./controllers"); // declare a function and export it to be used in another file module.exports = function(weatherApp) { weatherApp.route("/").get(controller.home); weatherApp.route("/about").get(controller.about); weatherApp.route("/weather/:lat/:long").get(controller.getWeather); weatherApp.route("/location/:lat/:long").get(controller.getLocation); };
Route.js menggunakan WeatherApp sebagai parameter yang bertugas untuk menentukan routing untuk aplikasi kita. weatherApp.route(“/”) digunakan untuk memproses halaman index.
weatherApp.route(“/about”) digunakan untuk memproses halaman about.
weatherApp.route(“/weather/:lat/:long”).get(controller.getWeather) digunakan untuk memproses halaman weather dengan parameter querystring latitude dan longitude.
Begitu juga weatherApp.route(“/location/:lat/:long”).get(controller.getLocation) digunakan untuk mendapatkan nama lokasi dengan parameter latitude dan longitude.
Permintaan ini kemudian ditangani oleh fungsi2 yang ada di file controller.js.
- Buat file controller.js dan isikan kode berikut:
//create a variable referencing to the package.json file let properties = require("../package.json"); //create a variable and require the weather file inside the service folder let weather = require("../service/weather"); let location = require("../service/location"); // create an object let controllers = { home: (req, res) => { res.json('Welcome to weather API'); }, about: (req, res) => { let aboutinfo = { name: properties.name, description: properties.description, author: properties.author } res.json(aboutinfo); }, getWeather: (req, res) => { weather.find(req, res, function(err, weath) { if (err) res.send(err); res.json(weath); }); }, getLocation: (req, res) => { location.find(req, res, function(err, weath) { if (err) res.send(err); res.json(weath); }); } }; module.exports = controllers;
- Selanjutnya, buat folder bernama service. Kemudian, buat file bernama weather.js. Di file itulah, kita akan menghubungkan aplikasi kita dengan API weather. File weather.js digunakan untuk mengambil data cuaca terbaru, Tulis kode berikut di dalam file weather.js.
// declare the request package we added to the package.json let request = require("request"); // assign your api key and api url to a variable //sewon const exclude = "hourly,daily,minutely"; const apiKey = "your api key"; const apiUrl = "https://api.openweathermap.org/data/2.5/onecall?"; let weather = { find: (req, res, next) => { let lat = req.params.lat; let long = req.params.long; request(apiUrl + "lat=" + lat + "&lon=" + long + "&exclude=" + exclude + "&appid=" + apiKey, function(error, response, body) { if(!error && response.statusCode == 200) { response = JSON.parse(body); res.send(response); } else { console.log(response.statusCode + response.body); res.send("Error occured"); } }); } }; module.exports = weather;
- Buat file location.js yang nantinya digunakan untuk mengambil nama lokasi. Tulis kode berikut di dalam file location.js.
// declare the request package we added to the package.json let request = require("request"); // assign your api key and api url to a variable const apiKey = "your api key"; const apiUrl = "http://api.openweathermap.org/geo/1.0/reverse?"; let weather = { find: (req, res, next) => { let lat = req.params.lat; let long = req.params.long; request(apiUrl + "lat=" + lat + "&lon=" + long + "&limit=1" + "&appid=" + apiKey, function(error, response, body) { if(!error && response.statusCode == 200) { response = JSON.parse(body); res.send(response); } else { console.log(response.statusCode + response.body); res.send("Error occured"); } }); } }; module.exports = weather;
Test aplikasi microservice
Setelah pengembangan selesai, lakukan test dengan menjalankan aplikasi kita. Untuk menjalankan aplikasi, ketikkan perintah berikut:
npm run start
Akses aplikasi dengan web browser di alamat http://localhost:5000. Kemudian akses halaman http://localhost:5000/about, http://localhost:5000/weather/ dengan menginputkan latitude dan longitude lokasi yang akan kita pantau. Berikut tampilan ketika kita mengakses halaman weather.
Penutup
Dalam tutorial ini, kita belajar tentang perbedaan antara microservice dan monolitik. Kita juga mempelajari Node.js untuk membangun microservice yang memanggil API OpenWeather. Menggunakan microservice akan meningkatkan fleksibilitas dan manfaat kinerja yang tidak dapat dicapai dengan aplikasi monolitik. Arsitektur Node.js yang berbasis event menjadikannya pilihan yang pas untuk microservice, karena cepat, skalabel, dan mudah dimantain.
Fullstack Developer yang tinggal di yogyakarta. Suka eksplorasi hal baru yang berhubungan dengan pemrograman dan ilmu keislaman. Berpengalaman dalam pemrograman PHP, Delphi dan sedang upgrade skill dengan python. Just as simple that.