Netflix Ribbon: 클라이언트 측 부하 분산(Load Balancing) 가이드¶
Netflix Ribbon은 MSA(Microservice Architecture) 환경에서 여러 서비스 인스턴스 중 하나를 선택하여 요청을 보낼 수 있게 해주는 Client-side Load Balancer 라이브러리입니다.
1. Ribbon이란?¶
전통적인 부하 분산(L4, L7 스위치 등)은 서버 앞단에 위치하지만, Ribbon은 클라이언트(요청을 보내는 서비스) 내부에 위치합니다.
핵심 작동 원리¶
- 서비스 목록 조회: Eureka와 같은 Service Discovery로부터 대상 서비스의 인스턴스 리스트를 가져옵니다.
- 부하 분산 알고리즘 적용: 라운드 로빈, 응답 시간 가중치 등 설정된 규칙에 따라 하나의 인스턴스를 선택합니다.
- 요청 수행: 선택된 인스턴스의 IP/Port로 실제 HTTP 요청을 보냅니다.
2. Zuul과 Ribbon의 관계¶
Zuul 1.x는 내부적으로 Ribbon을 사용하여 동적 라우팅과 부하 분산을 수행합니다.
- Zuul이 요청을 받으면 Ribbon을 통해 어떤 인스턴스로 보낼지 결정하고, Hystrix를 통해 장애 내성을 확보합니다.
3. Spring Cloud Gateway(SCG)에서도 Ribbon을 쓸 수 있나요?¶
결론부터 말씀드리면, SCG에서는 Ribbon을 사용하지 않습니다.
이유 및 대안¶
- 상태: Ribbon은 현재 유지보수 모드(Maintenance Mode)입니다.
- SCG의 방식: SCG는 Ribbon 대신 Spring Cloud 팀에서 직접 만든 Spring Cloud LoadBalancer를 기본으로 사용합니다.
- 호환성: Ribbon은 Blocking I/O 기반인 반면, SCG는 Non-blocking(WebFlux) 기반이므로 아키텍처적으로 어울리지 않습니다.
4. 사용 방법 (레거시 Zuul 환경 기준)¶
4.1 의존성 추가 (Gradle)¶
4.2 설정 (application.yml)¶
특정 서비스에 대한 로드 밸런싱 규칙을 정의할 수 있습니다.
# user-service에 대한 Ribbon 설정
user-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule # 응답 시간 기반
ListOfServers: localhost:8081,localhost:8082 # (Eureka 없을 시 수동 지정)
5. 어떨 때 사용하면 좋은가?¶
- 레거시 유지보수: 이미 Zuul + Ribbon 기반으로 구축된 프로젝트를 관리할 때.
- 단순 클라이언트 분산: 서버 측 로드밸런서(L4/L7)를 별도로 두기 어려운 환경에서 애플리케이션 레벨의 분산이 필요할 때.
6. 결론: 현대적인 선택¶
현재 시점에서 Ribbon을 신규 프로젝트에 도입하는 것은 권장되지 않습니다.
- Zuul 1.x 사용자: Ribbon을 계속 사용하게 됩니다.
- Spring Cloud Gateway 사용자: Spring Cloud LoadBalancer를 사용하세요. 별도의 설정 없이
lb://SERVICE-NAME형식을 사용하면 자동으로 동작합니다. - Feign Client 사용자: 최신 버전에서는 자동으로 Spring Cloud LoadBalancer와 연동됩니다.
요약¶
Ribbon은 화려했던 과거의 유산이며, 현재는 Spring Cloud LoadBalancer가 그 자리를 대체했습니다.