본문 바로가기
MSA

4 - 로드밸런싱

by 젼젼39 2026. 2. 23.

1. 클라이언트 사이드 로드 밸런싱 개요

  • 1-1) 로드 밸런싱의 정의와 목적
    • 네트워크 트래픽을 단일 서버가 아닌 여러 대의 서버로 분산시켜 시스템의 처리 능력을 극대화하고 가용성을 확보하는 기술
    • 특정 서버에 과부하가 집중되는 것을 방지하여 응답 시간을 최적화하고 서비스 중단을 예방함
  • 1-2) 클라이언트 사이드 로드 밸런싱이란?
    • 서버 앞단에 별도의 로드 밸런서 장비(L4 등)를 두는 방식과 달리, 호출 주체인 클라이언트가 직접 최적의 서버를 선택하여 요청을 보내는 방식
    • 클라이언트는 서비스 디스커버리(Eureka 등)를 통해 서버 목록을 미리 확보하며, 내부 알고리즘에 따라 대상 인스턴스를 결정함

2. FeignClient 가이드

  • 2-1) FeignClient의 정의
    • Spring Cloud에서 제공하는 선언적 HTTP 클라이언트로, 인터페이스 정의만으로 외부 REST API를 호출할 수 있게 해줌
    • Eureka와 같은 서비스 디스커버리와 연동되어 동적으로 서비스 위치를 파악하고 부하를 분산함
  • 2-2) 핵심 특징
    • 선언적 구조: 복잡한 HTTP 통신 코드 없이 인터페이스와 애너테이션만으로 구현 가능함
    • 자동 로드 밸런싱: 내부적으로 로드 밸런싱 모듈(Ribbon)이 통합되어 있어 별도 설정 없이도 부하 분산이 수행됨
    • 유지보수 용이: 서비스 간 호출 로직이 직관적이며 비즈니스 로직과의 분리가 명확함

3. Ribbon 상세

  • 3-1) Ribbon이란?
    • 넷플릭스가 개발한 소프트웨어 기반의 클라이언트 사이드 로드 밸런서
    • 다양한 분산 알고리즘을 제공하며, 서비스 디스커버리로부터 받은 인스턴스 리스트를 관리함
  • 3-2) Ribbon의 주요 기능
    • 서버 리스트 공급: Eureka 등으로부터 가용한 서비스 명단을 실시간으로 수신함
    • 다양한 전략 지원: 라운드 로빈, 가중치 기반 등 여러 로드 밸런싱 알고리즘을 탑재함
    • 페일오버(Failover): 요청 실패 시 다른 인스턴스로 경로를 즉시 변경하여 가용성을 보장

4. 실전 설정 및 인터페이스 구현

  • 4-1) 프로젝트 의존성 추가
    • Eureka Client와 OpenFeign 라이브러리를 프로젝트에 포함해야 함
dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
}
  • 4-2) 애플리케이션 설정
    • 메인 클래스에 @EnableFeignClients를 선언하여 기능을 활성화
@SpringBootApplication
@EnableFeignClients
public class MyServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyServiceApplication.class, args);
    }
}
  • 4-3) FeignClient 인터페이스 작성
    • 호출하려는 대상 서비스의 이름을 지정하고 메서드를 정의함
@FeignClient(name = "my-service") // Eureka에 등록된 서비스명 지정  
public interface MyServiceClient {  
	@GetMapping("/endpoint")  
	String getResponse(@RequestParam(name = "param") String param);  
}

5. 주요 로드 밸런싱 알고리즘

  • 5-1) 라운드 로빈 (Round Robin)
    • 각 서버에 순차적으로 요청을 배분하는 가장 단순하고 공평한 방식
    • 카드게임에서 카드 나눠주는st
  • 5-2) 가중치 기반 (Weighted Response Time)
    • 서버의 응답 시간이나 성능에 따라 가중치를 부여하고, 성능이 좋은 서버에 더 많은 트래픽을 할당함
  • 5-3) 최소 연결 || 응답 시간
    • 현재 연결 수가 가장 적은 서버 || 응답 속도가 가장 빠른 서버를 우선적으로 선택하여 효율을 극대화함

6. 동작 원리 및 실전 시나리오

  • 6-1) FeignClient와 Ribbon의 연동 흐름
    1. 서비스 이름 참조: @FeignClient(name = "...")에 정의된 이름을 확인
    2. 인스턴스 조회: Eureka 서버에서 해당 이름으로 등록된 모든 인스턴스 리스트를 가져옴
    3. 알고리즘 수행: Ribbon이 설정된 전략(기본: 라운드 로빈)에 따라 하나의 인스턴스를 선택
    4. 요청 전달: 최종 결정된 IP/Port로 HTTP 요청을 전송
  • 6-2) [시나리오] 주문(Order) 서비스의 상품(Product) 정보 조회
    • 환경: 주문 서버 1대, 상품 서버 3대가 구동 중인 상태임
    • 과정:
      1. 주문 서비스가 상품 정보를 요청할 때 FeignClient를 호출
      2. 로드 밸런서는 확보한 3개의 상품 서버 주소 중 하나를 라운드 로빈 방식으로 선정
      3. 선택된 인스턴스로부터 데이터를 받아 주문 서비스에 반환
  • 6-3) 실제 서비스 사용 예제
    • FeinClient 인터페이스를 작성, 서비스 호출 수행
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@FeignClient(name = "my-service")
public interface MyServiceClient {

    @GetMapping("/endpoint")
    String getResponse(@RequestParam(name = "param") String param);
}
    • 컨트롤러에서 주입받은 FeignClient를 사용하여 외부 기능을 호출
@RestController
public class MyController {
    @Autowired
    private MyServiceClient myServiceClient;

    @GetMapping("/call-service")
    public String callService(@RequestParam String param) {
        // 내부 메서드처럼 간편하게 외부 마이크로서비스 호출 수행
        return myServiceClient.getResponse(param);
    }
}

'MSA' 카테고리의 다른 글

6 - API 게이트웨이  (0) 2026.02.23
5 - 서킷브레이커  (0) 2026.02.23
3 - 서비스 디스커버리 (Eureka)  (0) 2026.02.23
2 - Spring Cloud  (0) 2026.02.23
1 - MSA 개요  (0) 2026.02.23