🔥스파르타 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로 설정한 애플리케이션을 호출하게 되면
라운드 로빈 알고리즘을 통해 순차적으로 호출되게 된다.