5 min read
•Question 56 of 62hardHow to build microservices in Node.js?
Microservices architecture patterns.
What You'll Learn
- Microservices concepts
- Communication patterns
- Service discovery
Microservices Architecture
Each service:
- Has single responsibility
- Has its own database
- Communicates via APIs or messages
REST Communication
code.jsJavaScript
// User Service
app.get('/users/:id', async (req, res) => {
const user = await User.findById(req.params.id);
res.json(user);
});
// Order Service calling User Service
const axios = require('axios');
app.get('/orders/:id', async (req, res) => {
const order = await Order.findById(req.params.id);
// Fetch user from User Service
const { data: user } = await axios.get(
`http://user-service:3001/users/${order.userId}`
);
res.json({ ...order.toObject(), user });
});Message Queue (RabbitMQ)
code.jsJavaScript
const amqp = require('amqplib');
// Publisher (Order Service)
async function publishOrderCreated(order) {
const conn = await amqp.connect('amqp://localhost');
const channel = await conn.createChannel();
await channel.assertQueue('order-created');
channel.sendToQueue('order-created', Buffer.from(JSON.stringify(order)));
}
// Consumer (Email Service)
async function consumeOrders() {
const conn = await amqp.connect('amqp://localhost');
const channel = await conn.createChannel();
await channel.assertQueue('order-created');
channel.consume('order-created', (msg) => {
const order = JSON.parse(msg.content.toString());
sendOrderConfirmation(order);
channel.ack(msg);
});
}API Gateway
code.jsJavaScript
const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');
const app = express();
app.use('/api/users', createProxyMiddleware({
target: 'http://user-service:3001',
changeOrigin: true
}));
app.use('/api/orders', createProxyMiddleware({
target: 'http://order-service:3002',
changeOrigin: true
}));