장점
단점
주요 장점
주요 단점
| 특징 | 모놀리식 아키텍처 | MSA |
|---|---|---|
| 구조 | 하나의 큰 애플리케이션 코드베이스로 구성됨. | 여러 독립적인 서비스로 나뉘어 있음. |
| 개발 및 배포 | 모든 코드 변경 시 전체 애플리케이션을 다시 빌드하고 배포해야 함. | 개별 서비스만 수정 및 배포 가능. |
| 확장성 | 애플리케이션 전체를 확장해야 하므로 비효율적. | 필요한 서비스만 확장 가능 (예: 특정 기능 트래픽 급증 시 해당 서비스만 확장). |
| 유지보수 | 코드베이스가 커질수록 유지보수가 어려움. | 작은 단위로 유지보수 가능하며, 다른 서비스에 영향을 최소화함. |
| 기술 선택의 자유 | 하나의 기술 스택에 의존함. | 각 서비스마다 적합한 기술 스택을 선택 가능. |
| 의존성 관리 | 모듈 간 의존성 증가로 인해 복잡도가 높아질 수 있음. | 서비스 간 느슨한 결합을 통해 의존성 감소. |
| 장애 영향 범위 | 하나의 모듈 오류가 전체 시스템에 영향을 미침. | 오류가 난 서비스에만 영향이 국한됨. |
| 배우기 및 초기 설정 | 초기 학습 및 설정이 상대적으로 쉬움. | 러닝커브 존재, 초기 설정이 복잡할 수 있음. |
| 운영 복잡도 | 단일 시스템 관리로 운영이 단순함. | 서비스가 많아질수록 네트워크, 배포 및 모니터링 관리가 복잡해짐. |
요약
MSA는 규모가 크고 복잡한 시스템에서 특히 유용하다. 애플리케이션 개발 속도와 확장성을 요구하는 환경에 적합하다. 하지만 작은 팀이나 초기 단계의 프로젝트에서는 자원을 고려하여 모놀리식 아키텍처가 더 적합할 수도 있다.
서비스 디스커버리(Service Discovery)
API 게이트웨이(API Gateway)
설정 관리(Configuration Management)
로드 밸런싱(Load Balancing)
분산 트랜젝션 관리
서킷 브레이커(Circuit Breaker)
메시징과 이벤트 기반 아키텍처
서비스 보안(Security)
볼드 처리된 부분을 많이 사용하지만, 현업 환경에서는 Hystrix나 Zuul을 사용하는 경우도 많음. 버전 업은 까다로운 일이기 때문에..
| 모듈 | 설명 |
|---|---|
| Spring Cloud Config | 중앙 집중식 구성 관리. Git 등 외부 저장소를 지원. |
| Spring Cloud Netflix | Eureka, Hystrix, Ribbon 등의 Netflix OSS 기반 기술 통합. |
| Spring Cloud Gateway | API Gateway 역할로, 요청 라우팅과 필터링 기능 제공. |
| Spring Cloud Stream | 메시지 브로커(Kafka, RabbitMQ)와 통합된 메시징 기능 제공. |
| Spring Cloud Sleuth | 분산 트랜잭션 추적을 위한 로깅, Zipkin과의 통합 지원. |
| Spring Cloud Bus | RabbitMQ 또는 Kafka를 통해 설정 변경이나 이벤트를 브로드캐스트. |
주요 개념
1. Eureka Server
주요 기능
1. 서비스 등록 및 해제
작동 흐름
1. 서비스 등록
장점
주요 구성 요소
| 구성 요소 | 설명 |
|---|---|
| Eureka Server | 서비스 레지스트리 역할을 하는 중앙 서버. 모든 서비스 정보를 관리. |
| Eureka Client | 서버와 통신하여 자신의 정보를 등록하고 다른 서비스 정보를 조회. |
| Registry | 서비스의 이름, 주소, 포트 등의 정보를 저장. |
| Ribbon | Eureka와 함께 사용하여 로드 밸런싱을 지원. |
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
@EnableEurekaServer 어노테이션 추가@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
spring.application.name=server
server.port=19090
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.instance.hostname=localhost
eureka.client.service-url.defaultZone=http://localhost:19090/eureka/
+eureka.client.register-with-eureka: Eureka Client로 등록 유무-서버는 등록 x
+eureka.client.fetch-registry: 서버로부터 레지스트리를 가져올 것인가?-이게 서버임
실행 후 http://localhost:19090/ 에서 대시보드 확인 가능

spring.application.name=first
server.port=19091
eureka.client.service-url.defaultZone=http://localhost:19090/eureka/
포트를 다르게 설정해주고, 서비스 url을 설정함
그리고 실행하면 여기에 인스턴스가 추가되어야 하는데..
콘솔에 뭔가 심상치 않은(불길한) 경고가 계속 뜨고는

없었다.
진짜 힘들게 찾았는데 그냥 오타 문제였다.
properties에서 eureka.client.service-url.defaultZone을 eureka.client.service-url.defaulfZone으로 작성해버렸는데, 웬만하면 자동완성을 쓰는 게 좋다.

정상적으로 등록되면 이렇게 인스턴스 목록에 추가된다.
@EnableEurekaClient
위의 문제를 해결하기 위해 여러가지를 찾아보았는데,
@EnableEurekaClient어노테이션도 있다는 것을 알게 되었다.
나는 서버에만@EnableEurekaServer을 추가하고 실행하였고 문제가 없었는데, 클라이언트에@EnableEurekaClient는 필요없는 걸까?
@EnableEurekaClient 어노테이션 없이도 Eureka Client로 사용할 수 있다. Spring Boot 2.4 이상과 Spring Cloud에서 도입된 변경 사항 때문에.spring-cloud-starter-netflix-eureka-client 의존성 추가시 어노테이션 없이도 Eureka Client가 자동 설정된다.그럼
@EnableEurekaServer은 필수인가? 얘도 없어도 되는건가?
-> 필수다. 왜?
1. Eureka Server 역할 활성화
EurekaServerAutoConfiguration 클래스를 활성화하는 역할을 함요약
@EnableEurekaServer를 추가하지 않고 애플리케이션 실행 시 이 애플리케이션은 단순한 Spring Boot 애플리케이션으로 동작하며 Eureka Server의 역할을 수행하지 않는다.
클라이언트처럼 자동 설정 매커니즘으로 대체되지 않아 명시적으로 선언해야 함.
대시보드도 못 봄.
클라이언트는 의존성 설정만으로 잘 굴러간다.
클라이언트 사이드 로드 밸런싱
특징
- 클라이언트가 로드 밸런싱 알고리즘을 수행
- 클라이언트는 서버 목록과 연결 상태를 알고 있음
- 서버 목록은 서비스 디스커버리에서 가져옴
- Spring Cloud LoadBalancer, Ribbon, Feign 등을 사용
장점
- 중앙 로드 밸런서 없이 동작하여 부하를 줄일 수 있음
- 서버 간 상태 정보를 클라이언트가 직접 반영 가능
단점
- 클라이언트에서 구현해야 하므로 복잡성 증가
- 서버 목록의 변경 사항을 실시간으로 클라이언트가 받아야 함
서버 사이드 로드 밸런싱
클라이언트의 요청이 중앙 로드 밸런서(서버)를 거쳐 적절한 서버로 분배됨
특징
- 클라이언트는 중앙 로드 밸런서만 알면 됨
- 로드 밸런서가 서버 상태, 부하 등을 고려해 요청을 분배함
- NGINX, HAProxy, AWS Elastic Load Balancer, GCP Load Balancing 등 사용
장점
- 클라이언트는 로드 밸런싱에 대해 알 필요가 없음
- 중앙 관리로 서버 목록 및 상태 변경이 자동 반영됨
단점
- 로드 밸런서에 부하 집중될 수 있음
- 로드 밸런서가 장애를 일으키면 전체 시스템에 영향을 줄 가능성 있음
비교
| 구분 | 클라이언트 사이드 로드 밸런싱 | 서버 사이드 로드 밸런싱 |
|---|---|---|
| 로드 밸런싱 주체 | 클라이언트가 직접 서버를 선택. | 로드 밸런서가 서버를 선택. |
| 관리 방식 | 클라이언트가 서버 목록을 관리. | 로드 밸런서가 서버 목록을 관리. |
| 복잡성 | 클라이언트가 구현해야 하므로 다소 복잡. | 클라이언트는 단순하지만 로드 밸런서 설정이 필요. |
| 실시간 상태 반영 | 클라이언트가 서비스 디스커버리로 상태를 갱신. | 로드 밸런서가 상태를 자동으로 반영. |
| 장애 처리 | 클라이언트에서 직접 처리해야 함. | 로드 밸런서가 자동으로 장애 서버를 제외. |
| 예시 | Spring Cloud Ribbon, Feign, Eureka 등. | NGINX, HAProxy, AWS/GCP Load Balancer 등. |
장점
단점
특징
특징
Spring Cloud의 최신 버전에서는 Spring Cloud LoadBalancer로 대체되었다고 함
Feign Client와 Ribbon의 관계
server -> order -> product(3)
order에 요청을 보내고, 각각 서로 다른 포트로 열린 product 서비스들이 라운드 로빈 알고리즘으로 요청을 수행함
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
}
spring:
application:
name: order-service
server:
port: 19091
eureka:
client:
service-url:
defaultZone: http://localhost:19090/eureka/
spring:
application:
name: product-service
server:
port: 19092
eureka:
client:
service-url:
defaultZone: http://localhost:19090/eureka/
@FeignClient(name="product-service")
public interface ProductClient {
@GetMapping("/product/{id}")
String getProduct(@PathVariable("id") String id);
}