티스토리 뷰

반응형

웹 개발 실무 기술 A to Z

현대적인 웹 애플리케이션은 대규모 트래픽 처리와 유지보수 용이성을 위해 마이크로서비스 아키텍처(MSA)를 채택하는 경우가 많습니다.
✔️ API Gateway → 서비스 간 요청을 효율적으로 관리하는 진입점
✔️ 서비스 디스커버리 → 동적으로 서비스 위치를 찾고 로드 밸런싱 수행
✔️ 데이터 분산 및 메시징 시스템 → 서비스 간 데이터 교환을 최적화

이번 글에서는 마이크로서비스 아키텍처(MSA)를 구축하는 전략과 핵심 기술을 설명하겠습니다.


1. 마이크로서비스 아키텍처(MSA)란?

✔️ 기능별로 독립적인 서비스(마이크로서비스)로 나누어 개발 및 운영
✔️ 각 서비스는 개별적으로 배포, 확장, 유지보수 가능
✔️ Netflix, Amazon, Uber 등 대규모 서비스에서 사용 중

MSA를 적용하면 대규모 애플리케이션을 효율적으로 운영 가능!


2. API Gateway – 마이크로서비스의 진입점

2-1. API Gateway란?

✔️ 모든 클라이언트 요청을 중앙에서 관리
✔️ 서비스 간 라우팅, 로드 밸런싱, 인증, 모니터링 기능 제공
✔️ Kong, Nginx, Express Gateway, AWS API Gateway 등이 대표적인 솔루션


2-2. Express.js 기반 API Gateway 구축

(1) Express API Gateway 설정

npm install express-http-proxy express

(2) API Gateway 코드 (gateway.js)

const express = require("express");
const proxy = require("express-http-proxy");

const app = express();

app.use("/users", proxy("http://localhost:4000"));
app.use("/orders", proxy("http://localhost:5000"));

app.listen(3000, () => console.log("API Gateway running on port 3000"));

API Gateway를 활용하면 마이크로서비스 요청을 한 곳에서 관리 가능!


3. 서비스 디스커버리 – 마이크로서비스의 자동 탐색

3-1. 서비스 디스커버리란?

✔️ 마이크로서비스는 동적으로 실행되므로, 고정된 IP 주소를 사용할 수 없음
✔️ 서비스 디스커버리 시스템을 활용하여 각 서비스의 위치를 자동으로 탐색
✔️ Eureka, Consul, Kubernetes Service Discovery 등 다양한 솔루션 활용 가능


3-2. Consul을 활용한 서비스 디스커버리

(1) Consul 설치 및 실행

docker run -d --name=consul -p 8500:8500 consul

(2) 마이크로서비스 등록 (service.json)

{
  "service": {
    "name": "users-service",
    "port": 4000,
    "check": {
      "http": "http://localhost:4000/health",
      "interval": "10s"
    }
  }
}

(3) Consul에 서비스 등록

curl --request PUT --data @service.json http://localhost:8500/v1/agent/service/register

Consul을 활용하면 마이크로서비스의 위치를 자동으로 탐색 가능!


4. 마이크로서비스 간 데이터 교환 – 메시징 시스템 활용

4-1. 메시징 시스템이 필요한 이유

✔️ 마이크로서비스 간 직접 HTTP 요청을 보내면 서비스 간 강한 결합 발생
✔️ RabbitMQ, Kafka 같은 메시징 시스템을 사용하면 비동기 통신 가능
✔️ 트래픽 증가 시에도 안정적인 데이터 전송 가능


4-2. Kafka를 활용한 메시징 시스템 구축

(1) Kafka 설치 및 실행

docker run -d --name zookeeper -p 2181:2181 wurstmeister/zookeeper
docker run -d --name kafka -p 9092:9092 --link zookeeper wurstmeister/kafka

(2) Kafka 프로듀서 (데이터 전송)

const { Kafka } = require("kafkajs");

const kafka = new Kafka({ clientId: "my-app", brokers: ["localhost:9092"] });
const producer = kafka.producer();

async function sendMessage() {
  await producer.connect();
  await producer.send({
    topic: "orders",
    messages: [{ value: "New Order Created" }],
  });
  await producer.disconnect();
}

sendMessage();

(3) Kafka 컨슈머 (데이터 수신)

const consumer = kafka.consumer({ groupId: "order-group" });

async function receiveMessages() {
  await consumer.connect();
  await consumer.subscribe({ topic: "orders", fromBeginning: true });

  await consumer.run({
    eachMessage: async ({ message }) => {
      console.log(`Received order message: ${message.value.toString()}`);
    },
  });
}

receiveMessages();

Kafka를 활용하면 마이크로서비스 간 비동기 데이터 교환 가능!


5. 마이크로서비스 아키텍처 적용 전후 비교

5-1. 적용 전

  • 모놀리식(Monolithic) 아키텍처 → 모든 기능이 하나의 코드베이스에서 실행됨
  • 서비스 확장 어려움 → 트래픽 증가 시 특정 기능만 확장할 수 없음
  • 장애 발생 시 전체 서비스 다운

5-2. 적용 후

✔️ API Gateway 도입 → 마이크로서비스 간 요청을 중앙에서 관리
✔️ 서비스 디스커버리 적용 → 동적으로 실행되는 서비스 위치 자동 탐색
✔️ Kafka 메시징 시스템 활용 → 서비스 간 비동기 데이터 교환 가능

마이크로서비스 아키텍처를 적용하면 확장성과 유지보수성이 향상됨!


6. 마무리 및 다음 글 예고

이번 글에서는 API Gateway, 서비스 디스커버리, 메시징 시스템을 활용한 마이크로서비스 아키텍처(MSA) 구축 방법을 살펴봤습니다.
다음 글에서는 웹 개발 실무 기술 시리즈 마무리 – 최적의 웹 개발 프로세스 정리를 소개하겠습니다.

다음 글 예고: "웹 개발 실무 기술 A to Z 마무리 – 최적의 웹 개발 프로세스 정리" 🚀

 

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함
반응형