🔥 로드 밸런싱을 공부하고, 로드 밸런싱 알고리즘 라운드 로빈을 사용해 보자!
[ 로드 밸런싱 ]
- 로드 밸런싱은 네트워크 트래픽을 여러 서버로 분산시켜 서버의 부하를 줄이고, 시스템의 성능과 가용성을 높이는 기술이다.
- 서버 간 트래픽을 고르게 분배하여 특정 서버에 부하가 집중되는 것을 방지해 준다.
- 종류로는 클라이언트 사이드 로드 밸런싱, 서버 사이드 로드 밸런싱이 있다.
[ 클라이언트 사이드 로드 밸런싱 ]
- 클라이언트 사이드 로드 밸런싱은 클라이언트가 직접 여러 서버 중 하나를 선택하여 요청을 보내는 방식이다.
- 클라이언트는 서버의 목록을 가지고 있으며, 이를 바탕으로 로드 밸런싱을 수행한다.
[ FeignClient의 주요 특징 ]
- 선언적 HTTP 클라이언트: 인터페이스와 어노테이션을 사용하여 REST API를 호출할 수 있다.
- Eureka 연동: Eureka와 통합하여 서비스 인스턴스 목록을 동적으로 조회하고 로드 밸런싱을 수행한다.
- 자동 로드 밸런싱: Ribbon이랑 통합되어 있어 FeignClient를 사용하면 자동으로 로드 밸런싱을 수행한다.
[ Ribbon ]
- 넷플릭스가 개발한 클라이언트 사이드 로드 밸런서로, 마이크로서비스 아키텍처에서 서비스 인스턴스 간의 부하를 분산한다.
- 다양한 로드 밸런싱 알고리즘을 지원하며, Eureka와 같은 서비스 디스커버리와 연동하여 사용한다.
[ Ribbon의 주요 특징 ]
- 서버 리스트 제공자: Eureka 등으로부터 서비스 인스턴스 리스트를 제공받아 로드 밸런싱에 사용한다.
- 로드 밸런싱 알고리즘: 라운드 로빈, 가중치 기반 등 다양한 로드 밸런싱 알고리즘 지원한다.
- Failover: 요청 실패 시 다른 인스턴스로 자동 전환된다.
[ 로드 밸런싱 알고리즘 ]
- 라운드 로빈: 각 서버에 순차적으로 요청을 분배하는 방식이다.
- 가중치 기반 로드 밸런싱: 각 서버에 가중치를 부여하고, 가중치에 비례하여 요청을 분배하는 방식이다.
- 최소 연결: 현재 연결된 클라이언트 수가 가장 적은 서버로 요청을 보내는 방식이다.
- 응답 시간 기반: 서버의 응답 시간을 기준으로 가장 빠른 서버로 요청을 보내는 방식이다.
[ 시나리오 설정 ]
Order 서비스 인스턴스: 1개
Product 서비스 인스턴스: 3개
- Order 서비스 실행: Order 서비스가 실행되면 Eureka 서버에서 Product 서비스 인스턴스 목록을 가져온다.
- Product 서비스 호출: Order 서비스에서 Product 서비스의 정보를 가져오기 위해 FeignClient를 사용하여 호출한다.
- Ribbon을 통한 로드 밸런싱: FeignClient는 Ribbon을 통해 3개의 Product 인스턴스 중 하나를 선택하여 호출한다. 이 과정에서 Round Robin 알고리즘을 사용하여 요청을 순차적으로 분배한다
- 응답 처리: 선택된 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. 이를 통해 라운드로빈으로 로드밸런싱이 되는것을 확인한다.
그림으로 이해하기
같은 기능의 포트만 다른 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
'해피 코딩 > Spring' 카테고리의 다른 글
[Redis] Spring Boot 프로젝트에 캐싱 적용하기 (0) | 2024.08.13 |
---|---|
[MSA] API 게이트웨이 Spring Cloud Gateway (0) | 2024.08.05 |
[MSA] 서비스 디스커버리 Eureka (0) | 2024.08.04 |
[NaverOpenAPI] NaverSearchAPI를 사용하여 쇼핑 상품 검색하기 (0) | 2024.07.19 |
[SpringSecurity] SpringSecurity의 Filter 동작 순서 이해하기 (1) | 2024.07.16 |