νλμ λκ·λͺ¨ μΉ μλΉμ€(Netflix, Amazon, Google, μΉ΄μΉ΄μ€ν‘, λ°°λ¬μλ―Όμ‘± λ±)λ λͺ¨λ λ§μ΄ν¬λ‘μλΉμ€ μν€ν μ²λ₯Ό μ¬μ©ν©λλ€. νμ§λ§ κΈ°μ‘΄μ λͺ¨λ리μ(λ¨μΌ) μ ν리μΌμ΄μ λ§ κ²½νν κ°λ°μμκ²λ λ€μκ³Ό κ°μ μ΄λ €μμ΄ μμ΅λλ€:
- π€·ββοΈ "μλΉμ€λ₯Ό μ΄λ»κ² λλμ΄μΌ νμ§?"
- π° "μλΉμ€λΌλ¦¬ μ΄λ»κ² ν΅μ νμ§?"
- π± "νλμ μλΉμ€κ° μ£½μΌλ©΄ μ μ²΄κ° λ§λΉλλ κ±° μλκ°?"
- π€― "λ‘κ·Έλ μ΄λ»κ² μΆμ νμ§? λλ²κΉ μ μ΄λ»κ² νμ§?"
μ΄ νλ‘μ νΈλ μ€μ μμΌλ‘ λ§μ Έλ³΄κ³ μ€νν μ μλ μ΅μνμ MSA νκ²½μ μ 곡νμ¬, μ΄λ‘ μ΄ μλ 체νμ ν΅ν νμ΅μ λͺ©νλ‘ ν©λλ€.
- λ¨μΌ μ ν리μΌμ΄μ vs λΆμ° μ ν리μΌμ΄μ μ μ°¨μ΄μ μ λͺΈμΌλ‘ λλΌκΈ°
- λ 립μ μΈ λ°°ν¬κ° μ μ€μνμ§ μ΄ν΄νκΈ°
- μλΉμ€ κ° μμ‘΄μ±μ΄ μ΄λ€ λ¬Έμ λ₯Ό μΌμΌν€λμ§ κ²½ννκΈ°
- π¨ "UserServiceκ° κ°μκΈ° μ£½μμ΄μ!" β PostServiceλ μ΄λ»κ² λμν΄μΌ ν κΉ?
- π "νΈλν½μ΄ λͺ°λ €μ UserServiceλ§ νμ₯νκ³ μΆμ΄μ" β μ΄λ»κ² ν΄μΌ ν κΉ?
- π "μ΄λ μλΉμ€μμ μλ¬κ° λ°μνλμ§ λͺ¨λ₯΄κ² μ΄μ" β μ΄λ»κ² μΆμ ν κΉ?
- Spring Cloud μνκ³ μ΄ν΄
- Docker/Kubernetes νκ²½μμμ λ°°ν¬ κ²½ν
- λͺ¨λν°λ§ λ° λ‘κΉ μμ€ν κ΅¬μΆ λ°©λ²
- λͺ¨λ리μ vs λ§μ΄ν¬λ‘μλΉμ€: μ ν΅μ μΈ λ¨μΌ μ ν리μΌμ΄μ κ³Ό λ§μ΄ν¬λ‘μλΉμ€μ μ°¨μ΄μ μ΄ν΄
- μλΉμ€ λΆλ¦¬: λλ©μΈλ³λ‘ μλΉμ€λ₯Ό λΆλ¦¬νλ λ°©λ²κ³Ό κ·Έ μ₯λ¨μ νμ΅
- λ 립μ λ°°ν¬: κ° μλΉμ€κ° λ 립μ μΌλ‘ κ°λ°, λ°°ν¬, νμ₯λ μ μμμ 체ν
- HTTP REST API: μλΉμ€ κ° HTTP κΈ°λ° λκΈ° ν΅μ ꡬν
- RestTemplate μ¬μ©λ²: Spring Bootμμ λ€λ₯Έ μλΉμ€ νΈμΆ λ°©λ²
- μλΉμ€ μ£Όμ κ΄λ¦¬: νλμ½λ©λ URL vs μλΉμ€ λμ€μ»€λ²λ¦¬ κ°λ μ΄ν΄
- Graceful Degradation: μμ‘΄ μλΉμ€ μ₯μ μ μ°μν μ±λ₯ μ ν μ²λ¦¬
- Fallback λ©μ»€λμ¦: κΈ°λ³Έκ° λ°νμ ν΅ν μλΉμ€ μ°μμ± λ³΄μ₯
- Circuit Breaker ν¨ν΄: μ°μ μ₯μ λ°©μ§λ₯Ό μν κΈ°λ³Έ κ°λ μ΄ν΄
- Docker 컨ν μ΄λ: κ° λ§μ΄ν¬λ‘μλΉμ€λ₯Ό λ 립μ μΈ μ»¨ν μ΄λλ‘ ν¨ν€μ§
- Docker Compose: λ€μ€ 컨ν μ΄λ μ ν리μΌμ΄μ κ΄λ¦¬
- λ€νΈμν¬ λΆλ¦¬: 컨ν μ΄λ κ° λ΄λΆ λ€νΈμν¬ ν΅μ ꡬμ±
- λ‘κ·Έ μμ§: λΆμ° μμ€ν μμμ λ‘κ·Έ κ΄λ¦¬μ μ€μμ±
- μλΉμ€ μν νμΈ: Health Check λ° μν λͺ¨λν°λ§
- λΆμ° μΆμ : μ¬λ¬ μλΉμ€λ₯Ό κ±°μΉλ μμ²μ νλ¦ μ΄ν΄
βββββββββββββββββββ HTTP Request ββββββββββββββββββββ
β Client β ββββββββββββββββββ β PostService β
β (Browser/Tool) β β (Port: 8080) β
βββββββββββββββββββ ββββββββββββ¬ββββββββ
β
β HTTP Call
β GET /users/{id}
β
ββββββββββββββββββββ
β UserService β
β (Port: 8081) β
ββββββββββββββββββββ
- ν΄λΌμ΄μΈνΈ β PostServiceμ κ²μκΈ μ 보 μμ²
- PostService β UserServiceμ μμ±μ μ 보 μμ²
- UserService β μ¬μ©μ λ°μ΄ν° λ°ν
- PostService β κ²μκΈ + μμ±μ μ 보 μ‘°ν©νμ¬ μ΅μ’ μλ΅
β UserService μ₯μ λ°μ
β
β
PostServiceλ "Unknown User"λ‘ λ체νμ¬ μλΉμ€ κ³μ μ 곡
(Graceful Degradation)
- 700κ° μ΄μμ λ§μ΄ν¬λ‘μλΉμ€ μ΄μ
- ν루μ μμμ΅ κ±΄μ API νΈμΆ μ²λ¦¬
- μ₯μ 볡ꡬ μκ°: μ 체 μλΉμ€ μ€λ¨ μμ΄ κ°λ³ μλΉμ€λ§ 볡ꡬ
- κ°λ°ν: κ° μλΉμ€λ³λ‘ λ 립μ μΈ ν κ΅¬μ± (2-Pizza Team)
- μ£Όλ¬Έ, κ²°μ , λ°°μ‘, μν λ± λλ©μΈλ³ μλΉμ€ λΆλ¦¬
- λΈλνλΌμ΄λ°μ΄ κ°μ λμ©λ νΈλν½ μ νμν μλΉμ€λ§ νμ₯
- A/B ν μ€νΈ: νΉμ μλΉμ€λ§ μ λ²μ μΌλ‘ λ°°ν¬νμ¬ μ€ν
- λ©μμ§, μΉκ΅¬, νλ‘ν, κ²μ λ± κΈ°λ₯λ³ μλΉμ€ λΆλ¦¬
- μ€μκ° λ©μμ§: κ° μλΉμ€ κ° λΉλκΈ° ν΅μ μΌλ‘ λΉ λ₯Έ μλ΅
- κΈλ‘λ² μλΉμ€: μ§μλ³λ‘ λ 립μ μΈ μλΉμ€ λ°°ν¬
UserService (μ¬μ©μ κ΄λ¦¬) ββ PostService (κ²μκΈ κ΄λ¦¬)
π AuthService ββ π OrderService
β β
π€ UserService ββ π³ PaymentService
β β
π PostService ββ π¦ DeliveryService
β β
π AnalyticsService ββ π§ NotificationService
-
μ€κΈ κ³Όμ (3-6κ°μ)
- λ°μ΄ν°λ² μ΄μ€ λΆλ¦¬ (κ° μλΉμ€λ³ λ 립 DB)
- λ©μμ§ ν λμ (RabbitMQ, Kafka)
- API Gateway ꡬν
-
κ³ κΈ κ³Όμ (6-12κ°μ)
- Kubernetes ν΄λ¬μ€ν° ꡬμΆ
- Service Mesh λμ
- λΆμ° μΆμ μμ€ν ꡬμΆ
-
μ€λ¬΄ μ μ© (1λ +)
- λμ©λ νΈλν½ μ²λ¦¬
- λ©ν° 리μ λ°°ν¬
- DevOps νμ΄νλΌμΈ ꡬμΆ
- β "MSA νκ²½μμ κ°λ° κ²½ν μμ"
- β "μλΉμ€ κ° ν΅μ μ€κ³ κ°λ₯"
- β "Docker/Kubernetes κΈ°μ΄ μ΄ν΄"
- β "λκ·λͺ¨ λΆμ° μμ€ν μ€κ³ κ²½ν"
- β "μ₯μ λμ λ° λ³΅κ΅¬ μ λ΅ μ립"
- β "ν κ° νμ μ μν API μ€κ³"
- "μλΉμ€ κ° λ°μ΄ν° μΌκ΄μ±μ μ΄λ»κ² 보μ₯νλμ?" β μ΄ νλ‘μ νΈμμ κ²½νν Fallback λ©μ»€λμ¦μ΄ κΈ°μ΄
- "νλμ μλΉμ€ μ₯μ κ° μ 체μ μν₯μ μ£Όμ§ μμΌλ €λ©΄?" β Circuit Breaker ν¨ν΄μ νμμ± μ΄ν΄
- "μλΉμ€ λ°°ν¬ μ 무μ€λ¨ λ°°ν¬λ μ΄λ»κ² νλμ?" β λ 립μ λ°°ν¬μ μ€μμ± μ²΄ν
- λͺ¨λ μλΉμ€κ° μ μ μλν λμ μμ² νλ¦
- μλΉμ€ κ° λ°μ΄ν° μ‘°ν© λ° μλ΅ μμ±
- UserService μ€λ¨ μ PostServiceμ λμ
- Fallback λ©μ»€λμ¦μ ν΅ν μλΉμ€ μ°μμ±
- μ₯μ μλΉμ€ 볡ꡬ ν μ μ λμ μ¬κ°
- μμ€ν μ μκ° λ³΅κ΅¬ λ₯λ ₯
- κ° μλΉμ€μ λ 립μ μΈ μ€μΌμΌλ§
- λ‘λλ°Έλ°μ± λ° λΆν λΆμ°
- μλΉμ€ λΆλ¦¬ λ° λ 립 μ€ν
- HTTP κΈ°λ° μλΉμ€ κ° ν΅μ
- κΈ°λ³Έμ μΈ μ₯μ μ²λ¦¬ (Fallback)
- Docker 컨ν μ΄λν
- Service Discovery ꡬν (Eureka)
- API Gateway μΆκ° (Spring Cloud Gateway)
- Circuit Breaker ν¨ν΄ (Resilience4j)
- λΆμ° μ€μ κ΄λ¦¬ (Spring Cloud Config)
- Kubernetes μ€μΌμ€νΈλ μ΄μ
- Service Mesh λμ
- λΆμ° μΆμ μμ€ν
- μ€μνλ λ‘κΉ (ELK Stack)
- "λ§μ΄ν¬λ‘μλΉμ€ ν¨ν΄" - Chris Richardson
- "Building Microservices" - Sam Newman
- "Microservices AntiPatterns and Pitfalls" - Mark Richards
- λ°μ΄ν°λ² μ΄μ€ λΆλ¦¬ (κ° μλΉμ€λ³ λ 립 DB)
- λΉλκΈ° λ©μμ§ (RabbitMQ, Apache Kafka)
- 보μ λ° μΈμ¦ (OAuth2, JWT)
- λͺ¨λν°λ§ λμ보λ (Prometheus + Grafana)
- Spring Boot 3.1.2 - λ§μ΄ν¬λ‘μλΉμ€ κΈ°λ³Έ νλ μμν¬
- Java 17 - μ΅μ LTS λ²μ μΌλ‘ ν₯μλ μ±λ₯κ³Ό 보μ
- RestTemplate - μλΉμ€ κ° HTTP ν΅μ
- Docker - κ° μλΉμ€μ λ 립μ μΈ μ»¨ν μ΄λν
- Docker Compose - λ€μ€ 컨ν μ΄λ νκ²½ κ΄λ¦¬
- Gradle Wrapper - λΉλ λꡬ λ° μμ‘΄μ± κ΄λ¦¬
- Spring Boot Test - λ¨μ ν μ€νΈ λ° ν΅ν© ν μ€νΈ
- HTTP Client - API μλν¬μΈνΈ ν μ€νΈ
- Docker Logs - 컨ν μ΄λ μμ€ λ‘κΉ
| Method | Endpoint | Description | Response |
|---|---|---|---|
| GET | /users/{id} |
μ¬μ©μ μ 보 μ‘°ν | {"id": 1, "name": "User 1"} |
| Method | Endpoint | Description | Response |
|---|---|---|---|
| GET | /posts/{id} |
κ²μκΈ μ 보 μ‘°ν (μμ±μ μ 보 ν¬ν¨) |
{"id": 1, "title": "Post 1", "content": "...", "author": "User 1"} |
PostService β UserService
GET http://userservice:8081/users/{id} # Docker λ΄λΆ λ€νΈμν¬
GET http://localhost:8081/users/{id} # λ‘컬 κ°λ° νκ²½
msa/
βββ UserService/ # μ¬μ©μ μλΉμ€
β βββ src/main/java/
β β βββ com/example/userservice/
β β βββ UserServiceApplication.java
β β βββ UserController.java
β β βββ UserDto.java
β βββ Dockerfile # 컨ν
μ΄λ λΉλ μ€μ
β βββ build.gradle # μμ‘΄μ± κ΄λ¦¬
β
βββ PostService/ # κ²μκΈ μλΉμ€
β βββ src/main/java/
β β βββ com/example/postservice/
β β βββ PostServiceApplication.java
β β βββ PostController.java
β β βββ PostDto.java
β β βββ UserClient.java # UserService νΈμΆ ν΄λΌμ΄μΈνΈ
β β βββ RestTemplateConfig.java
β βββ Dockerfile
β βββ build.gradle
β
βββ src/test/ # ν
μ€νΈ νμΌ
β βββ request.http # API ν
μ€νΈμ© HTTP νμΌ
β βββ post-check.http # ν΅ν© ν
μ€νΈμ© HTTP νμΌ
β
βββ docker-compose.yml # λ€μ€ 컨ν
μ΄λ μ€μ
βββ docker-setup.sh # μλ νκ²½ μ€μ μ€ν¬λ¦½νΈ
βββ test-msa.sh # ν΅ν© ν
μ€νΈ μ€ν¬λ¦½νΈ
βββ README.md # νλ‘μ νΈ λ¬Έμ
run-services.batThis script will automatically:
- Set up Gradle wrappers for both services
- Build UserService and PostService
- Start both services on their respective ports
- Test the services
# Step 1: Build both services
build-services.bat
# Step 2: Run UserService (in one terminal)
cd UserService
java -jar build\libs\user-service-0.0.1-SNAPSHOT.jar
# Step 3: Run PostService (in another terminal)
cd PostService
java -jar build\libs\post-service-0.0.1-SNAPSHOT.jartroubleshooting.batUse this script to:
- Check service status
- Restart services
- Diagnose connection issues
- Test service communication
- UserService: http://localhost:8081
- PostService: http://localhost:8080
- Test Endpoints:
- UserService:
GET http://localhost:8081/users/1 - PostService:
GET http://localhost:8080/posts/1
- UserService:
- μλΉμ€ μ€ν νμΈ
# Docker 컨ν μ΄λ μν νμΈ docker ps # λλ λ‘컬 μ€ν μ νλ‘μΈμ€ νμΈ curl http://localhost:8081/users/1 curl http://localhost:8080/posts/1
νλ‘μ νΈμ ν¬ν¨λ .http νμΌμ VS Code λλ IntelliJμμ μ€ν:
- UserService λ¨λ ν μ€νΈ
- PostService μ μ νΈμΆ ν μ€νΈ
- PostService μ₯μ μν© ν μ€νΈ
- PostServiceμ UserService κ°μ ν΅μ ν μ€νΈ
- μ₯μ 볡ꡬ μλλ¦¬μ€ ν μ€νΈ
# UserService ν
μ€νΈ
curl -X GET http://localhost:8081/users/1 \
-H "Accept: application/json"
# PostService ν
μ€νΈ (UserService νΈμΆ ν¬ν¨)
curl -X GET http://localhost:8080/posts/1 \
-H "Accept: application/json"μμ κ²°κ³Ό:
// UserService μλ΅
{"id":1,"name":"User 1"}
// PostService μλ΅ (UserService νΈμΆ μ±κ³΅)
{"id":1,"title":"Post 1","content":"This is the content of post 1","author":"User 1"}# UserService μ€λ¨
docker stop userservice
# PostService νΈμΆ (μ₯μ μν©)
curl -X GET http://localhost:8080/posts/1 \
-H "Accept: application/json"μμ κ²°κ³Ό:
// UserService νΈμΆ μ€ν¨ μ
{"id":1,"title":"Post 1","content":"This is the content of post 1","author":"Unknown User"}# UserService μ¬μμ
docker start userservice
# μ μ λκΈ° ν λ€μ ν
μ€νΈ
sleep 10
curl -X GET http://localhost:8080/posts/1 \
-H "Accept: application/json"# μ 체 νκ²½ μ€μ λ° ν
μ€νΈ
./docker-setup.sh
# λλ Windowsμμ
docker-setup.bat# μλνλ MSA ν
μ€νΈ μ€ν
./test-msa.shμ΄ μ€ν¬λ¦½νΈλ λ€μμ μλμΌλ‘ μνν©λλ€:
- β Docker 컨ν μ΄λ μν νμΈ
- β UserService μ°κ²° ν μ€νΈ
- β PostService μ μ νΈμΆ ν μ€νΈ
- β μ₯μ μλλ¦¬μ€ ν μ€νΈ (UserService μ€λ¨)
- β μλΉμ€ 볡ꡬ ν μ€νΈ
- β μ΅μ’ μν νμΈ
#!/bin/bash
echo "=== MSA μλΉμ€ ν
μ€νΈ μμ ==="
echo "1. UserService ν
μ€νΈ..."
curl -s http://localhost:8081/users/1 | jq .
echo "2. PostService μ μ ν
μ€νΈ..."
curl -s http://localhost:8080/posts/1 | jq .
echo "3. UserService μ€λ¨..."
docker stop userservice
echo "4. PostService μ₯μ ν
μ€νΈ..."
curl -s http://localhost:8080/posts/1 | jq .
echo "5. UserService 볡ꡬ..."
docker start userservice
sleep 5
echo "6. PostService 볡ꡬ ν
μ€νΈ..."
curl -s http://localhost:8080/posts/1 | jq .
echo "=== ν
μ€νΈ μλ£ ==="μ€μκ° λ‘κ·Έ νμΈ:
# λͺ¨λ μλΉμ€ λ‘κ·Έ μ€μκ° νμΈ
docker-compose logs -f
# κ°λ³ μλΉμ€ λ‘κ·Έ νμΈ
docker logs -f userservice
docker logs -f postserviceκ°λ¨ν λΆν ν μ€νΈ:
# Apache Bench μ¬μ© (μ€μΉ νμ)
ab -n 100 -c 10 http://localhost:8080/posts/1
# curlμ μ΄μ©ν λ°λ³΅ ν
μ€νΈ
for i in {1..10}; do
echo "Test $i:"
time curl -s http://localhost:8080/posts/1
echo
doneTo build the project:
./gradlew build- Spring Boot Starter Web
- Spring Boot Starter Test (for testing)
UserServiceλ 8081PostServiceλ 8080μμ μ€νλμ΄μΌ ν©λλ€
- κ° μλΉμ€ λλ ν 리μ
Dockerfileμ μ§μ μμ±νμΈμ
docker network create msa-network# μ 체 μλΉμ€ ν λ²μ μ€ν
docker-compose up -d --build
# μλΉμ€ μ€μ§
docker-compose down# UserService λΉλ λ° μ€ν
cd UserService
docker build -t userservice .
docker run -d --name userservice --network msa-network -p 8081:8081 userservice
# PostService λΉλ λ° μ€ν
cd PostService
docker build -t postservice .
docker run -d --name postservice --network msa-network -p 8080:8080 postservice# Linux/Mac
./docker-setup.sh
# Windows
docker-setup.bat- λ΄λΆ DNS μ΄λ¦μ μ¬μ©ν΄μΌ νλ―λ‘
http://userservice:8081λ‘ νΈμΆν΄μΌ ν©λλ€
.httpνμΌμ μ¬μ©ν΄PostServiceμ λμμ νμΈν΄λ³΄μΈμ- μ€ν¨ μ€νμ μν΄
UserServiceλ₯Ό μ€λ¨ν μνμμλ νΈμΆν΄λ³΄μΈμ
# UserService λ‘κ·Έ
docker logs userservice
# PostService λ‘κ·Έ
docker logs postservice# λ€νΈμν¬ λͺ©λ‘ νμΈ
docker network ls
# λ€νΈμν¬ μμΈ μ 보 νμΈ
docker network inspect msa-network# κ°λ³ 컨ν
μ΄λ μ¬μμ
docker restart userservice
docker restart postservice
# λλ Docker Compose μ¬μ©
docker-compose restart