🔥스파르타 TIL (MSA)

Spring Cloud 란? (2) - 클라이언트 사이드 로드 밸런싱

승승장규 2025. 2. 8. 14:17

로드 밸런싱은

네트워크 트래픽을 여러 서버로 분산시켜 서버의 부하를 줄이고, 시스템의 성능과 가용성을 높이는 기술.

서버 간 트래픽을 고르게 분배하여 특정 서버에 부하가 집중되는 것을 방지하는 것.

 

클라이언트 사이드 로드 밸런싱 :

  • 클라이언트가 직접 여러 서버 중 하나를 선택하여 요청을 보내는 방식
  • 클라이언트는 서버의 목록을 가지고 있으며, 이를 바탕으로 로드 밸런싱을 수행한다.

 

FeignClient : 
  • Spring Cloud에서 제공하는 HTTP 클라이언트로, 선언적으로 REST ful 웹 서비스를 호출할 수 있다.
  • Eureka와 같은 서비스 디스커버리와 연동하여 동적으로 서비스 인스턴스를 조회하고 로드 밸런싱을 수행함.
  • 인터페이스와 어노테이션을 사용하여 REST API를 호출할 수 있는 선언적 HTTP 클라이언트
  • Ribbon이 통합되어 있어 자동으로 로드 밸런싱을 수행

 

 

Spring Cloud 란? (1)

마이크로서비스 개발을 위해 다양한 도구와 서비스를 제공하는 스프링 프레임워크의 확장이며, 마이크로서비스 아키텍처를 쉽게 구현하고 운영할 수 있도록 도와준다. 주요 기능 ▼서비스 등

seungg8361.tistory.com


 

FeignClient을 사용하려면 다음과 설정을 추가해야 한다.

 

build.gradle

implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'

 

 

 

FeignClient와 Eureka를 연동하기 위한 설정과, Ribbon 설정

 

application.yml

eureka:
 client:
  service-url:
   defalutZone: http://localhost:포트번호/eureka/
   
my-service:
 ribbon:
  eureka:
   enabled: true

 

application.properties

eureka.client.service-url.defaultZone = http://localhost:포트번호/eureka/
my-service.ribbon.eureka.enabled = true

 

로드 밸런싱 알고리즘 ▼

  • 라운드 로빈 : 각 서버에 순차적으로 요청을 분배 -> 간편하고 공평하게 트래픽 분산
  • 가중치 기반 로드 밸런싱 : 각 서버에 가중치를 부여하고, 가중치에 비례하여 요청을 분배 -> 서버의 성능이나 네트워크의 상태에 따라 가중치 조절
  • 기타 알고리즘 : 현재 연결된 클라이언트 수가 가장 적은 서버로 요청을 보냄, 서버의 응답 시간을 기준으로 가장 빠른 서버로 요청을 보냄

 

FeignClient 인터페이스 작성 ▼ ex) product-service를 호출하고 싶은 애플리케이션에 interface를 생성한다.

/* Eureka에 등록된 서비스 이름을 참조하여 이름이 product-service로 등록된 서비스 인스턴스 목록을 조회
   조회된 인스턴스 목록 중 하나를 선택하여 요청을 보낸다. 기본적으로 Ribbon을 사용하여 로드 밸런싱 수행
   같은 이름으로 등록된 인스턴스가 존재할 경우, 라운드 로빈 또는 다른 로드 밸런싱 알고리즘을 사용
*/
@FeignClient(name = "product-service") // http://product-service/product/1
public interface ProductClient {

    // 엔드 포인트 작성
    @GetMapping("/product/{id}")
    String getProduct(@PathVariable("id") String id);
}

 

작성한 interface를 호출하여 사용

public class MyController{

        private final ProductClient productClient;

        @GetMapping("call-service")
        public String getProductInfo(String productId) {
            return productClient.getProduct(productId);
        }
}

 

결론 ▼

 

interface를 설정한 서버(port = 99)에서 각각 port 번호를 100, 101, 102로 설정한 애플리케이션을 호출하게 되면

라운드 로빈 알고리즘을 통해 순차적으로 호출되게 된다.