본문 바로가기
해피 코딩/Spring

[MSA] 로드 밸런싱 Ribbon

by happy-coding 2024. 8. 4.
🔥 로드 밸런싱을 공부하고, 로드 밸런싱 알고리즘 라운드 로빈을 사용해 보자!

[ 로드 밸런싱 ]

  • 로드 밸런싱은 네트워크 트래픽을 여러 서버로 분산시켜 서버의 부하를 줄이고, 시스템의 성능과 가용성을 높이는 기술이다.
  • 서버 간 트래픽을 고르게 분배하여 특정 서버에 부하가 집중되는 것을 방지해 준다.
  • 종류로는 클라이언트 사이드 로드 밸런싱, 서버 사이드 로드 밸런싱이 있다.

[ 클라이언트 사이드 로드 밸런싱 ]

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

[ FeignClient의 주요 특징 ]

  • 선언적 HTTP 클라이언트: 인터페이스와 어노테이션을 사용하여 REST API를 호출할 수 있다.
  • Eureka 연동: Eureka와 통합하여 서비스 인스턴스 목록을 동적으로 조회하고 로드 밸런싱을 수행한다.
  • 자동 로드 밸런싱: Ribbon이랑 통합되어 있어 FeignClient를 사용하면 자동으로 로드 밸런싱을 수행한다.

[ Ribbon ]

  • 넷플릭스가 개발한 클라이언트 사이드 로드 밸런서로, 마이크로서비스 아키텍처에서 서비스 인스턴스 간의 부하를 분산한다.
  • 다양한 로드 밸런싱 알고리즘을 지원하며, Eureka와 같은 서비스 디스커버리와 연동하여 사용한다.

[ Ribbon의 주요 특징 ]

  • 서버 리스트 제공자: Eureka 등으로부터 서비스 인스턴스 리스트를 제공받아 로드 밸런싱에 사용한다.
  • 로드 밸런싱 알고리즘: 라운드 로빈, 가중치 기반 등 다양한 로드 밸런싱 알고리즘 지원한다.
  • Failover: 요청 실패 시 다른 인스턴스로 자동 전환된다.

[ 로드 밸런싱 알고리즘 ]

  • 라운드 로빈: 각 서버에 순차적으로 요청을 분배하는 방식이다.
  • 가중치 기반 로드 밸런싱: 각 서버에 가중치를 부여하고, 가중치에 비례하여 요청을 분배하는 방식이다.
  • 최소 연결: 현재 연결된 클라이언트 수가 가장 적은 서버로 요청을 보내는 방식이다.
  • 응답 시간 기반: 서버의 응답 시간을 기준으로 가장 빠른 서버로 요청을 보내는 방식이다.

[ 시나리오 설정 ]

Order 서비스 인스턴스: 1개
Product 서비스 인스턴스: 3개
  1. Order 서비스 실행: Order 서비스가 실행되면 Eureka 서버에서 Product 서비스 인스턴스 목록을 가져온다.
  2. Product 서비스 호출: Order 서비스에서 Product 서비스의 정보를 가져오기 위해 FeignClient를 사용하여 호출한다.
  3. Ribbon을 통한 로드 밸런싱: FeignClient는 Ribbon을 통해 3개의 Product 인스턴스 중 하나를 선택하여 호출한다. 이 과정에서 Round Robin 알고리즘을 사용하여 요청을 순차적으로 분배한다
  4. 응답 처리: 선택된 Product 인스턴스에서 응답을 받아 Order 서비스에 반환하고, 최종적으로 클라이언트에 응답을 전달합니다.

[ FeignClient와 Eureka 연동 ]

 @EnableFeignClients를 사용하여 FeignClient 활성화
@SpringBootApplication
@EnableFeignClients // FeignClient 활성화
public class ProductApplication {
	public static void main(String[] args) {
		SpringApplication.run(ProductApplication.class, args);
	}
}

 

FeignClient의 yaml 설정
  • Eureka와 FeignClient를 함께 사용하면 동적으로 서비스 인스턴스를 조회하여 로드 밸런싱을 수행한다.
spring:
  application:
    # Product 클라이언트 인스턴스의 Appication 이름
    name: product-service
server:
  # Product 클라이언트 인스턴스의 포트 번호
  port: 19092
eureka:
  client:
    service-url: 
      # 유레카 서버의 주소 설정
      defaultZone: http://localhost:19090/eureka/

 

Dependencies

같은 기능을 하는 Product를 3개 만들어 주기
  • Modify options / add VM options 를 통하여 포트번호를 설정해 준다.


OrderApplication에서 http://product-service/product/{id} 호출
  • FeignClient의 주요 특징
    • 선언적 HTTP 클라이언트: 인터페이스와 어노테이션을 사용하여 REST API를 호출할 수 있다.
@FeignClient(name = "product-service")
public interface ProductClient {
  @GetMapping("/product/{id}")
  String getProduct(@PathVariable("id") String id);
}

[ Run ]

1. Eureka 서버 하나에 Order 인스턴스 1개와 같은 기능의 포트만 다른 Product 인스턴스 3개를 연결한다.


2. 상품을 요청 (http://localhost:19091/order/1) 하면 ProductClient에서 @FeignClient로 설정한, 응답하는 인스턴스의 포트를 받아서 노출한다.
3. 이를 통해 라운드로빈으로 로드밸런싱이 되는것을 확인한다.

19094 포트
19093 포트
19092 포트

그림으로 이해하기


같은 기능의 포트만 다른 Product를 만들어주고, URI에 상품을 요청하여 각 서버에 순차적으로 요청을 분배하는 로드 밸런싱 알고리즘 라운드 로빈을 사용해 보았다.

 

읽어 주셔서 감사합니다 🙂‍↕️

 

Eureka 서버

😺 GitHub: https://github.com/mad-cost/Starta-MSA-study-eureka.server

 

Order Repository

😺 GitHub: https://github.com/mad-cost/Starta-MSA-study-client.order

 

Product Repository

😺 GitHub: https://github.com/mad-cost/Starta-MSA-study-client.product