[MSA알아보기] 클라이언트 사이드 로드 밸런싱(FeignClient와 Ribbon)

차차의 개발일기·2024년 8월 5일
0

msa

목록 보기
4/7

이번 블로그에서는 클라이언드 사이드 로드 밸런싱 패턴에 대해 알아보고 해당 패턴을 구현해보겠습니다. 자세한 내용은 GIT-client-loadbalancing 브랜치에서 알아보실 수 있습니다.


1. 로드밸런싱이란?

네트워크 트래픽을 여러 서버로 분산시켜 서버의 부하를 줄이고, 시스템의 성능과 가용성을 높이는 기술입니다.

1.1 종류

  • 클라이언트 사이드 로드 밸런싱
  • 서버 사이드 로드 밸런싱

두가지 종류가 있지만 이번 블로그에서는 클라이언트 사이드 로드 밸런싱에 관해서 정리하고 알아보겠습니다.

2. 클라이언트 사이드 로드 밸런싱이란?

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

3. FeignClient란?

Spring Cloud에서 제공하는 HTTP 클라이언트로, 선언적으로 RESTful 웹 서비스를 호출할 수 있고 Eureka와 같은 디스커버리와 연동하여 동적으로 서비스 인스턴스를 조회하고 로드 밸런싱을 수행합니다.

3.1 주요특징

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

4. Ribbon이란?

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

4.1 주요특징

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

5. FeignClient와 Ribbon 구현

구현할 구성도는 아래와 같습니다.

5.1 product 구현

5.1.1 의존성 추가

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
}

위와 같이 client에 해당하는 곳에 의존성을 추가해줍니다.

5.1.2 어플리케이션 설정

@SpringBootApplication
@EnableFeignClients
public class ProductApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProductApplication.class, args);
    }
}

@EnableFeignClients 어노테이션을 사용하여 FeignClients를 활성화 해줍니다.

5.1.3 controller 구현

@RestController
public class ProductController {

    @Value("${server.port}")
    private String port;

    @GetMapping("/product/{id}")
    public String getProduct(@PathVariable String id) {
        return "Product " + id + " info!!!!! From port : " + port;
    }
}

5.1.4 yml 설정

application.yml 설정입니다.

spring:
  application:
    name: product-service
server:
  port: 19092
eureka:
  client:
    service-url:
      defaultZone: http://localhost:19090/eureka/

5.1.5 port 3개로 실행하기

인텔리제이의 구성편집에서 복사를 한 후 vm옵션을 사용하여 19093,19094를 추가해줍니다.

위와 같이 하면 product 설정은 끝이납니다.

5.2 order 구현

5.2.1 의존성, 어플리케이션 구현

위 product설정과 같이 진행하면 됩니다.

5.2.2 인터페이스 구현

서비스 호출을 수행하는 인터페이스를 구현합니다.

@FeignClient(name = "product-service")
public interface ProductClient {
    @GetMapping("/product/{id}")
    String getResponse(@PathVariable("id") String id);
}

5.2.3 controller 구현

@RestController
@RequiredArgsConstructor
public class OrderController {
    
    private final OrderService orderService;

    @GetMapping("/order/{orderId}")
    public String getOrder(@PathVariable String orderId) {
        return orderService.getOrder(orderId);
    }
    
}

5.2.4 service 구현

order쪽 application.yml 설정입니다.


@Service
@RequiredArgsConstructor
public class OrderService {

    private final ProductClient productClient;

    public String getProductInfo(String productId) {
        return productClient.getProduct(productId);
    }

    public String getOrder(String orderId) {
        if(orderId.equals("1") ){
            String productId = "2";
            String productInfo = getProductInfo(productId);
            return "Your order is " + orderId + " and " + productInfo;

        }
        return "Not exist order...";
     }
}

5.2.5 yml 설정

spring:
  application:
    name: order-service
server:
  port: 19091
eureka:
  client:
    service-url:
      defaultZone: http://localhost:19090/eureka/

6. 최종 확인

위와 같이 모든 파일의 설정이 끝났다면 Eureka 서버 -> order -> product 3개 순으로 실행을 하면 됩니다.

6.1 서버 확인

실행 후 유레카 서버에 접속을 하면
와 같이 product 3개 order 1개가 떠있는 것을 확인할 수 있습니다.

6.2 order 확인

위와 같이 라운드 로빈이 일어나는 것을 확인 할 수 있고 구현을 마무리 해보도록 하겠습니다.


🔗Github Repository 링크

https://github.com/junghojune/MSA-Practice

profile
1년차 개발자 차차입니다.

0개의 댓글