#1 Data Analytics Program in India
₹2,499₹1,499Enroll Now
5 min read
Question 56 of 62hard

How 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
}));