클라이언트 사이드 로드 밸런싱, FeignClient
1. 클라이언트 사이드 로드 밸런싱이란?

일반적으로 로드 밸런싱은 네트워크 트래픽을 여러 서버로 분산시켜 서버 부하를 줄이고 시스템 가용성을 높이는 기술을 뜻합니다. 그중에서도 클라이언트 사이드 로드 밸런싱(Client-Side Load Balancing)은 독특한 방식을 취합니다.
- 클라이언트가 직접 여러 서버 중 하나를 선택하여 요청을 보냅니다.
- 클라이언트 내부에 서버 인스턴스 목록을 가지고 있으며, 이를 바탕으로 트래픽을 스스로 분산합니다.
2. FeignClient와 Ribbon의 환상적인 조합
Spring Cloud에서는 이러한 통신을 우아하게 처리하기 위해 두 가지 주요 기술을 사용해왔습니다.
1) FeignClient
- Spring Cloud에서 제공하는 선언적 HTTP 클라이언트입니다.
- 복잡한 설정 없이 인터페이스와 어노테이션만 작성하면 RESTful 웹 서비스 API를 쉽게 호출할 수 있습니다.
- Eureka와 같은 서비스 디스커버리 서버와 연동하여 동적으로 인스턴스를 찾아냅니다.
2) Ribbon
- 넷플릭스(Netflix)가 개발한 클라이언트 사이드 로드 밸런서입니다.
- Eureka로부터 서비스 리스트를 제공받아 다양한 알고리즘을 통해 부하를 분산합니다.
- 지원 알고리즘: 순차적으로 요청을 분배하는 라운드 로빈(Round Robin), 서버 상태에 따라 비중을 두는 가중치 기반, 연결 수가 적은 곳으로 보내는 최소 연결, 속도가 빠른 곳으로 보내는 응답 시간 기반 등이 있습니다.
3. 코드 한눈에 보기: Order 서비스가 Product 서비스를 호출할 때
실제 서비스 아키텍처에서는 다음과 같은 시나리오가 흔히 발생합니다. 1개의 Order 서비스가 3개로 스케일 아웃된 Product 서비스를 호출하는 상황입니다.
Step 1: Application 설정
애플리케이션이 FeignClient를 사용할 수 있도록 어노테이션을 선언합니다.
@SpringBootApplication
@EnableFeignClients
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
Step 2: FeignClient 인터페이스 작성
호출하고자 하는 product-service의 이름을 명시하고, 컨트롤러를 작성하듯 인터페이스를 만듭니다.
@FeignClient(name = "product-service")
public interface ProductClient {
@GetMapping("/product/{id}")
String getProduct(@PathVariable("id") String id);
}
Step 3: 비즈니스 로직 적용
이제 Order 서비스에서는 ProductClient를 주입받아 마치 로컬 메서드를 호출하듯 사용하면 됩니다. 뒷단에서는 Eureka가 Product 인스턴스 3개의 주소를 가져오고, Ribbon이 라운드 로빈 방식으로 번갈아 가며 트래픽을 분산시킵니다.
💡알아야 할 포인트!
1. Netflix Ribbon의 Deprecated 이슈
자료에서 다룬 Ribbon은 한때 마이크로서비스의 표준이었으나, 현재 Spring Cloud 생태계에서는 유지보수 모드(Deprecated)에 들어갔습니다.
Spring Cloud 2020.0.0 버전(Spring Boot 2.4 이상)부터는 Ribbon 대신 Spring 자체 기술인Spring Cloud LoadBalancer를 기본으로 사용2. Spring 6의 HTTP Interfaces 등장
최근 Spring Framework 6.0 및 Spring Boot 3.0이 릴리즈되면서, 외부 라이브러리인 FeignClient를 대체할 수 있는@HttpExchange(Declarative HTTP Client)가 Spring Native 기능으로 추가되었습니다.
아직은 생태계 지원(예: Resilience4j 연동 등) 면에서 OpenFeign이 강력하지만, 향후 신규 프로젝트에서는 Native 클라이언트로 넘어가는 추세이다.3. Failover 처리는 필수
클라이언트 사이드 로드 밸런서는 대상 서버가 죽었을 때 빠른 대처(Failover)가 중요합니다.
실무에서는Resilience4j와 같은 서킷 브레이커(Circuit Breaker)를 FeignClient에 덧붙여,
특정 인스턴스에 장애가 발생하면 즉시 다른 인스턴스로 요청을 우회하거나 Fallback 데이터를 내려주도록 아키텍처를 고도화 해야한다