2024. 9. 11. 22:19ㆍMSA
2024/09/11
※ 클라이언트 사이드 로드 밸런싱에 대해 알아보자.
▶ 클라이언트 사이드 로드 밸런싱 개요
● 로드 밸런싱이란?
○ 로드 밸런싱은 네트워크 트래픽을 여러 서버로 분산시켜 서버의 부하를 줄이고, 시스템의 성능과 가용성을 높이는 기술
○ 서버 간 트래픽을 고르게 분배하여 특정 서버에 부하가 집중되는 것을 방지한다.
○ 종류 : 클라이언트 사이드 로드 밸런싱, 서버 사이드 로드 밸런싱
● 클라이언트 사이드 로드 밸런싱이란?
○ 클라이언트 사이드 로드 밸런싱은 클라이언트가 직접 여러 서버 중 하나를 선택하여 요청을 보내는 방식
○ 클라이언트는 서버의 목록을 가지고 있으며, 이를 바탕으로 로드 밸런싱을 수행한다.
▶ FeignClient 개요
● FeignClient란?
○ FeignClient는 Spring Cloud에서 제공하는 HTTP 클라이언트로, 선언적으로 RESTful 웹 서비스를 호출할 수 있다.
○ Eureka와 같은 서비스 디스커버리와 연동하여 동적으로 서비스 인스턴스를 조회하고 로드 밸런싱을 수행한다.
● FeignClient의 주요 특징
○ 선언적 HTTP 클라이언트 : 인터페이스와 어노테이션을 사용하여 REST API를 호출할 수 있다.
○ Eureka 연동 : Eureka와 통합하여 서비스 인스턴스 목록을 동적으로 조회하고 로드 밸런싱을 수행
○ 자동 로드 밸런싱 : Ribbon이 통합되어 있어 자동으로 로드 밸런싱을 수행
▶ Ribbon 개요
● Ribbon이란?
○ 넷플릭스가 개발한 클라이언트 사이드 로드 밸런서로, 마이크로서비스 아키텍처에서 서비스 인스턴스 간의 부하를 분산시킨다.
○ 다양한 로드 밸런싱 알고리즘을 지원하며, Eureka와 같은 서비스 디스커버리와 연동하여 사용한다.
● Ribbon 주요 특징
○ 서버 리스트 제공자 : Eureka 등으로부터 서비스 인스턴스 리스트를 제공받아 로드 밸런싱에 사용한다.
○ 로드 밸런싱 알고리즘 : 라운드 로빈, 가중치 기반 등 다양한 로드 밸런싱 알고리즘 지원한다.
○ Failover : 요청 실패 시 다른 인스턴스로 자동 전환한다.
▶ FeignClient와 Ribbon 설정
● 기본 설정
○ FeignClient와 Ribbon을 사용하려면 Spring Boot 애플리케이션에 의존성을 추가해야 한다.
📌 build.gradle 파일 예시 :
Groovy
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
}
⚙️ Spring Boot 애플리케이션 설정
@SpringBootApplication
@EnableFeignClients
public class MyServiceApplication {
public static void main(String[] args) {
SpringApplication.run(MyServiceApplication.class, args);
}
}
● FeignClient 인터페이스 작성
○ FeignClient 인터페이스를 작성하여 서비스 호출을 수행한다.
📌 예시 코드 :
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와 Eureka 연동
● Eureka 설정
○ Eureka와 FeignClient를 함께 사용하면 동적으로 서비스 인스턴스를 조회하여 로드 밸런싱을 수행한다.
📌 application.yml 파일 설정 예시 :
YAML
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
● FeignClient와 Ribbon 설정
○ FeignClient에서 제공하는 서비스 인스턴스를 사용하여 로드 밸런싱을 수행한다.
📌 예시 설정 파일 :
YAML
my-service:
ribbon:
eureka:
enabled: true
● FeignClient와 Ribbon 동작 원리
1️⃣ 서비스 이름 : @FeignClient(name = "my-service") 어노테이션은 Eureka에 등록된 서비스 이름을 참조
2️⃣ 서비스 인스턴스 조회 : Eureka 서버에서 my-service 라는 이름으로 등록된 서비스 인스턴스 목록을 조회
3️⃣ 로드 밸런싱 : 조회된 서비스 인스턴스 목록 중 하나를 선택하여 요청을 보낸다. 이는 기본적으로 Ribbon을 사용하여 로드 밸런싱을 수행한다.
4️⃣ 요청 분배 : 여러 서비스 인스턴스가 있을 경우, Round Robin 또는 다른 설정된 로드 밸런싱 알고리즘을 사용하여 요청을 분배한다.
○ 시나리오로 생각해보기
💡 Order 서비스는 Product 서비스를 호출하여 상품 정보를 가져온다. 이 과정에서 어떻게 동작할까❓
- Order 서비스 인스턴스: 1개
- Product 서비스 인스턴스: 3개
① Order 서비스 실행 : Order 서비스가 실행되면 Eureka 서버에서 Product 서비스 인스턴스 목록을 가져온다.
② Product 서비스 호출 : Order 서비스에서 Product 서비스의 정보를 가져오기 위해 FeignClient를 사용하여 호출한다.
③ Ribbon을 통한 로드 밸런싱 : FeignClient는 Ribbon을 통해 3개의 Product 인스턴스 중 하나를 선택하여 호출한다. 이 과정에서 Round Robin 알고리즘을 사용하여 요청을 순차적으로 분배한다.
④ 응답 처리 : 선택된 Product 인스턴스에서 응답을 받아 Order 서비스에 반환하고, 최종적으로 클라이언트에 응답을 전달한다.
● FeignClient 인터페이스 작성 예시
○ FeignClient 인터페이스를 작성하여 서비스 호출을 수행한다.
📌 예시 코드 :
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를 사용하여 다른 서비스 호출을 수행한다.
📌 예시 코드 :
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@Autowired
private MyServiceClient myServiceClient;
@GetMapping("/call-service")
public String callService(@RequestParam String param) {
return myServiceClient.getResponse(param);
}
}
'MSA' 카테고리의 다른 글
이벤트 드리븐 아키텍처와 스트림 처리 (1) | 2024.09.24 |
---|---|
분산 추적(Spring Cloud Sleuth) 및 로깅(Zipkin) (2) | 2024.09.24 |
MSA 보안 구성 - OAuth2 + JWT (0) | 2024.09.23 |
MSA - 서킷 브레이커 (10) | 2024.09.12 |
MSA - Microservices Architecture란? (1) | 2024.09.09 |