반응형

마이크로서비스 패턴 (Microservices Pattern)

마이크로서비스 패턴은 애플리케이션을 여러 개의 독립적인 서비스로 분리하여 구축하고 배포하는 아키텍처 스타일입니다.

각 서비스는 고유의 비즈니스 기능을 담당하며 독립적으로 배포, 확장, 유지보수가 가능합니다.


주요 특징

  1. 독립적 배포
    각 서비스는 다른 서비스와 분리되어 독립적으로 배포 가능합니다.

  2. 작은 단위
    하나의 서비스는 특정 비즈니스 도메인을 담당하며, 비교적 작은 코드베이스로 관리됩니다.

  3. 다양한 기술 스택 허용
    각 서비스는 독립적이므로 서로 다른 프로그래밍 언어나 데이터베이스를 사용할 수 있습니다.

  4. 느슨한 결합
    서비스 간의 통신은 보통 HTTP REST API, 메시지 큐, 또는 gRPC를 통해 이루어집니다.

  5. 확장성
    개별 서비스만 스케일링하거나 업그레이드할 수 있습니다.


주요 패턴

  1. API Gateway Pattern

    • 모든 클라이언트 요청은 API Gateway를 통해 처리됩니다.
    • API Gateway는 요청을 적절한 마이크로서비스로 라우팅합니다.
  2. Database per Service

    • 각 서비스는 독립적인 데이터베이스를 가집니다.
    • 데이터 공유는 서비스 간 API를 통해 이루어집니다.
  3. Event Sourcing

    • 데이터 변경 내역을 이벤트로 저장합니다.
    • 서비스는 이벤트를 구독해 데이터 상태를 동기화합니다.
  4. Service Discovery

    • 서비스가 동적으로 배포되므로, 클라이언트는 서비스의 위치를 알아야 합니다.
    • Consul, Eureka 같은 도구를 사용합니다.

예제 코드

1. Node.js - 간단한 마이크로서비스

User 서비스 (user-service.js):

javascript

const express = require('express');
const app = express();
app.use(express.json());

const users = [{ id: 1, name: 'Alice' }];

app.get('/users', (req, res) => {
    res.json(users);
});

app.listen(3001, () => {
    console.log('User service running on port 3001');
});
Order 서비스 (order-service.js):

javascript

const express = require('express');
const app = express();
app.use(express.json());

const orders = [{ id: 1, userId: 1, product: 'Book' }];

app.get('/orders', (req, res) => {
    res.json(orders);
});

app.listen(3002, () => {
    console.log('Order service running on port 3002');
});
API Gateway (gateway.js):

javascript

const express = require('express');
const axios = require('axios');
const app = express();

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

2. Python (Flask + Docker)

User 서비스 (user_service.py):

python

from flask import Flask, jsonify

app = Flask(__name__)

users = [{"id": 1, "name": "Alice"}]

@app.route('/users', methods=['GET'])
def get_users():
    return jsonify(users)

if __name__ == "__main__":
    app.run(port=5001)
Dockerfile:

dockerfile

FROM python:3.9-slim
WORKDIR /app
COPY user_service.py /app
RUN pip install flask
CMD ["python", "user_service.py"]
docker-compose.yml:

yaml

version: '3.8'
services:
  user-service:
    build:
      context: .
    ports:
      - "5001:5001"

마이크로서비스 장단점

장점

  1. 서비스별 독립적인 확장 가능.
  2. 유지보수성과 개발 속도 향상.
  3. 기술 스택 다양성 수용.

단점

  1. 서비스 간 통신 복잡도 증가.
  2. 배포와 테스트가 복잡해질 수 있음.
  3. 데이터 일관성 문제 발생 가능.

이 아키텍처는 대규모 애플리케이션에서 매우 유용하지만, 초기 설계와 구축 시 고려해야 할 점이 많습니다. 필요에 따라 적절히 사용해야 합니다! 😊

728x90
반응형

+ Recent posts