마이크로서비스 아키텍처는 애플리케이션을 독립적으로 배포 및 관리할 수 있는 작은 서비스들로 나누는 아키텍처 패턴이다.
각 서비스는 특정 도메인에 집중하여 독립적으로 개발, 배포, 확장할 수 있다.
다음과 같은 문제를 해결하기 위해 마이크로서비스 아키텍처가 사용된다:
전자 상거래 플랫폼은 일반적으로 다음과 같은 기능이 필요하다:
- 사용자 관리
- 상품 카탈로그
- 주문 처리
- 결제
마이크로서비스 아키텍처에서는 각각의 기능을 독립적인 서비스로 분리하여 관리한다.
[Client]
|
[API Gateway]
|
[Service A] [Service B] [Service C]
| | |
[DB A] [DB B] [DB C]
const express = require('express');
const app = express();
app.use(express.json());
// 사용자 데이터
const users = [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }];
// 사용자 목록 반환
app.get('/users', (req, res) => {
res.json(users);
});
// 사용자 추가
app.post('/users', (req, res) => {
const user = { id: users.length + 1, name: req.body.name };
users.push(user);
res.status(201).json(user);
});
app.listen(3001, () => {
console.log('User Service running on port 3001');
});
const express = require('express');
const app = express();
app.use(express.json());
// 주문 데이터
const orders = [{ id: 1, user: 1, product: 'Book' }];
// 주문 목록 반환
app.get('/orders', (req, res) => {
res.json(orders);
});
// 주문 추가
app.post('/orders', (req, res) => {
const order = { id: orders.length + 1, user: req.body.user, product: req.body.product };
orders.push(order);
res.status(201).json(order);
});
app.listen(3002, () => {
console.log('Order Service running on port 3002');
});
const express = require('express');
const axios = require('axios');
const app = express();
app.use(express.json());
// 사용자 서비스로 요청 전달
app.get('/users', async (req, res) => {
const response = await axios.get('http://localhost:3001/users');
res.json(response.data);
});
// 주문 서비스로 요청 전달
app.get('/orders', async (req, res) => {
const response = await axios.get('http://localhost:3002/orders');
res.json(response.data);
});
app.listen(3000, () => {
console.log('API Gateway running on port 3000');
});
http://localhost:3000
)를 통해 요청을 보낸다.마이크로서비스 아키텍처는 대규모 시스템에서 확장성과 독립성을 극대화하는 데 적합하다.
그러나, 설계와 관리가 복잡하므로 신중한 접근이 필요하다.
아래 글에서 다른 아키텍쳐 패턴들을 확인할 수 있다.
아키텍처 패턴 모음