Dunia pengembangan perangkat lunak terus berkembang, dan arsitektur microservices telah menjadi pendekatan yang efektif untuk membangun aplikasi yang skalabel (scalable), tangguh (resilient), dan mudah dipelihara (maintainable). Menggunakan Node.js, developer dapat menciptakan microservices yang mendukung pengembangan aplikasi berbasis produk, memastikannya agile dan efisien. Panduan ini akan membahas prinsip, pola desain, dan praktik terbaik untuk membangun arsitektur microservices dengan Node.js, lengkap dengan contoh terperinci termasuk service communicator untuk memfasilitasi komunikasi antar-layanan.
Mengenal Arsitektur Microservices:
Arsitektur microservices membangun aplikasi sebagai kumpulan layanan yang longgar (loosely coupled), masing-masing menangani domain bisnis tertentu. Layanan ini dapat diterapkan dan diubah skalanya secara mandiri, sehingga meningkatkan kelincahan (agility) dan ketangguhan (resilience) aplikasi.
Merancang Microservices:
1. Dekonstruksi Monolith:
- Identifikasi dan ekstrak domain bisnis atau fungsionalitas yang berbeda dari aplikasi monolitik menjadi layanan terpisah.
2. Mendefinisikan Kontrak Layanan:
- Tetapkan interface dan protokol komunikasi yang jelas antar microservices, biasanya menggunakan RESTful HTTP atau GraphQL.
3. Manajemen Data:
- Setiap layanan harus memiliki basis data atau penyimpanan data sendiri, sehingga meminimalkan berbagi data antar layanan untuk menghindari keterkaitan yang erat.
Membangun Microservices dengan Node.js:
Mari kita membangun tiga microservices: UserService, ProductService, dan OrderService. Selain itu, kita akan membuat modul Communicator untuk komunikasi antar layanan.
1. Persiapan Proyek Microservices:
Buat project Node.js baru untuk setiap microservice:
mkdir user-service product-service order-service communicator
cd user-service
npm init -y
npm install express axios
Ulangi langkah di atas untuk service lainnya dan modul communicator.
2. Membangun Microservices dengan Express.js:
UserService:
JavaScript
// user-service/index.js
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3001;
app.get('/api/users', (req, res) => {
res.json({ users: [{ id: 1, name: 'John Doe' }] });
});
app.listen(PORT, () => {
console.log(`User Service is running on port ${PORT}`);
});
ProductService:
// product-service/index.js
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3002;
app.get('/api/products', (req, res) => {
res.json({ products: [{ id: 1, name: 'Product A' }] });
});
app.listen(PORT, () => {
console.log(`Product Service is running on port ${PORT}`);
});
OrderService:
// order-service/index.js
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3003;
app.get('/api/orders', (req, res) => {
res.json({ orders: [{ id: 1, user_id: 1, product_id: 1 }] });
});
app.listen(PORT, () => {
console.log(`Order Service is running on port ${PORT}`);
});
3. Membuat Communicator:
Communicator akan mengelola klien HTTP untuk semua layanan, memfasilitasi komunikasi antar layanan.
Communicator:
// communicator/index.js
const axios = require('axios');
class Communicator {
constructor() {
this.userServiceClient = axios.create({ baseURL: 'http://localhost:3001/api' });
this.productServiceClient = axios.create({ baseURL: 'http://localhost:3002/api' });
this.orderServiceClient = axios.create({ baseURL: 'http://localhost:3003/api' });
}
async getUsers() {
const response = await this.userServiceClient.get('/users');
return response.data;
}
async getProducts() {
const response = await this.productServiceClient.get('/products');
return response.data;
}
async getOrders() {
const response = await this.