목표
- Client-Side Load Balancing을 수행하는 FeginClient와 Ribbon에 대해 이해한다.
- 실습한다.
Client-Side Load Balancing
- Client는 Service instance의 list를 가지고 있으며, 이를 바탕으로 하나의 Server를 선택하여 요청을 보내는 Load balancing을 수행한다.
FeignClient
- Spring Client에서 제공하는 Http Client로, annotation을 통해 선언적으로 RestFul Web Service를 호출할 수 있다.
- Eureka와 같은 Service Discovery와 연동하여 동적으로 Service instance를 조회하고 Load balancing을 수행한다.
- Ribbon과 연동되어 있어 자동으로 Client-side load balancing을 수행한다.
Ribbon
- MSA에서 Service instance 간의 부하를 분산한다.
- Eureka와 같은 Service Discovery로부터 Service instance의 list를 제공 받아서 Load balancing을 수행한다.
- 요청 실패 시 다른 instance로 자동 전환한다.
실습
- 아래의 의존성을 주입하여 order 클라이언트와 product 클라이언트를 생성한다.
- Spring Web
- Lombok
- Eureka Discovery Client
- Open Feign
실습 시 유의 사항
1. product가 없는 상태에서 order를 먼저 호출하면 에러가 발생할 수 있으므로 product를 먼저 작업한다.
2. server를 먼저 실행시킨 후 product를 실행시킨다.
- IntelliJ IDEA 상단의 Edit Configurations 메뉴에 들어가 product 2개를 복제하고 포트 번호를 19093, 19094로 설정한다.
[그림 1] - Application (server), ProductApplication (product, port=19092) 실행

- [그림 2]에서 포트 번호가 19092인 PRODUCT-SERVICE가 실행 중 (Status: UP)임을 확인할 수 있다.
[그림 2] - Eureka server

- [그림 3]처럼 http://localhost:19092/product/1에 접속하면 [그림 4]의 ProductController 내부의 getProduct()에서 반환하는 값이 잘 출력되었음을 확인할 수 있다.

[그림 4] - ProductController

- 이번에는 포트 번호가 19093, 19094인 ProductApplication들도 실행시킨다.
[그림 5] - ProductApplication:19093, ProductApplication:19094 추가 실행



- 한편, order에는 ProductClient 인터페이스를 [그림 8]처럼 정의한다.
- @FeignClient(name = "product-service")를 이용하여 order 서비스가 product-service와 통신하여 특정 상품의 정보를 가져올 수 있도록 한다.
[그림 8] - ProductClient

- order의 환경 설정 파일인 application.yml을 강의 내용대로 설정한 후 실행시키면 http://localhost:19090/에 요청했을 때 [그림 9]처럼 한 개의 order-service와 세 개의 product-service가 실행 중임을 확인할 수 있다
[그림 9] - Eureka Server

- [그림 10-1] - [그림 10-3]에서 볼 수 있듯이, http://localhost:19091/order/1에 반복적으로 요청하면 Round-Robbin Load Balancing Algorithm에 따라 매번 각기 다른 port 번호의 서비스로 요청된 것을 확인할 수 있다.


