기본적으로 백엔드에서 로드 밸런서를 적용한다고 하면 하나의 인스턴스가 아니라 여러 인스턴스로 트래픽을 분산시켜 서버의 부담을 줄이는 기술이다. 나도 이전 프로젝트를 학습하면서 AWS 로드밸런서를 이용해서 2개의 인스턴스에 라운드 로빈 방식으로 부하를 분산 시키는 방법으로 적용해본 적은 있다. Spring Cloud에서 제공하는 FeignClient 등을 이용하면, MSA 환경에서도 여러 대의 서비스 인스턴스에 부하를 분산할 수 있다고 한다.
FeignClient
FeignClient란 Netflix에서 개발한 선언적 웹 서비스 클라이언트이다. 기본적으로 Spring 프레임워크에서는 RestTemplate을 이용해서 다른 서비스를 호출할 수 있는데, FeignClient는 이러한 보일러플레이트 코드를 대폭 줄여주고, 인터페이스 기반으로 간단하게 HTTP 클라이언트를 생성할 수 있게 한다.
또한, Eureka와 같은 서비스 디스커버리와 연동하여 동적으로 서비스 인스턴스를 조회할 수 있으며, Ribbon이 통합되어 있어 자동으로 로드 밸런싱을 수행한다.
그렇다면 Ribbon이란?
Netflix에서 개발한 클라이언트 사이드 로드밸런서로, 애플리케이션 내부에서 동작하여 여러 서비스 인스턴스 중 하나를 선택해서 요청을 전달하는 역할을 한다.
Rouund Robin, Random, Weighted Response Time, Best Available 등 다양한 로드 밸런서 알고리즘을 지원하고, Health Check 기능을 이용해 주기적으로 서비스 인스턴스의 상태를 확인할 수 있다. 또한 Eureka, Consul 등의 서비스 디스커버리와 연동하여 동적으로 인스턴스 목록 관리가 가능하다.
실제로 사용해보자
먼저 FeignClient를 사용하고자 하는 서비스에서 FeignClient 의존성 추가가 필요하다.
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
나의 경우에는 auth-service에서 user-service를 호출하려고 한다. 따라서 auth-service에 의존성을 추가했다.
그리고 `@EnableFeignClients`을 설정해주었다.

이런식으로 client 코드를 작성해주고

간단하게 return 받은 String을 그대로 출력하도록 설정했다.

user-service의 컨트롤러에서는 해당하는 api를 생성하고, 로드 밸런싱이 정상적을 동작하는지를 체크하기 위해 포트 값을 같이 반환하도록 했다. 이제 2개의 user-service 포트를 켜놓고, auth-service를 통해 실제 요청들이 정상적으로 동작하는 지 보려고 한다.

유레카 서버를 통해, auth 서비스는 8763번 포트로, user 서비스는 8764,8765번 포트로 2개 실행되는 것을 확인할 수 있다.
이제 포스트맨을 통해, localhost:8763/auth/test/{userId} 로 GET 요청을 보내보면

userId도 잘 가고, 첫 실행시에는 8764번

두 번째 실행시에는 8765번 포트로 정상적으로 로드밸런싱이 되는 모습을 확인할 수 있었다.
FeignClient를 사용하면 Client라는 인터페이스 객체를 관리해야하는 관리포인트는 늘어나지만, 다른 서비스와의 통신이 중요한 MSA에서 로드밸런싱까지 지원하고 어노테이션 기반으로 쉽게 서비스 디스커버리와 연동해서 사용할 수 있다는 것은 엄청난 장점이라고 생각된다.
'Back-End' 카테고리의 다른 글
| MSA 학습 - API Gateway (0) | 2025.09.25 |
|---|---|
| MSA 학습 - 서킷 브레이커 (0) | 2025.09.24 |
| MSA 학습 - Spring Cloud와 Eureka (0) | 2025.09.22 |
| 비동기 메시징 방식(RabbitMQ vs Kafka) (0) | 2025.09.19 |
| @Transactional(readOnly=true)는 왜 써야하는걸까? (0) | 2025.09.18 |