@LoadBalanced

2024. 12. 11. 16:50Spring Microservice

Spring Boot에서 @LoadBalancedSpring CloudSpring Cloud LoadBalancer 기능과 관련된 애너테이션으로, 주로 클라이언트 측 로드 밸런싱을 제공하기 위해 사용됩니다. 이 애너테이션을 이해하려면 로드 밸런싱과 Spring Cloud LoadBalancer의 작동 원리를 간단히 알아야 합니다.


@LoadBalanced의 역할

@LoadBalancedRestTemplate 또는 WebClient 객체에 부여되어, 서비스 간 통신에서 로드 밸런싱이 가능하도록 설정합니다.

작동 방식

  1. 서비스 레지스트리와 통합:

    • Spring Cloud에서 Eureka, Consul 같은 서비스 레지스트리를 사용하면, 서비스가 등록될 때 이름(예: service-name)으로 접근할 수 있습니다.
    • @LoadBalanced는 이러한 서비스 이름을 기반으로, 여러 인스턴스 중 하나를 선택해 요청을 라우팅합니다.
  2. 클라이언트 측 로드 밸런싱:

    • 클라이언트(예: RestTemplate)가 요청을 보낼 때, 서비스 레지스트리에서 동일한 서비스 이름을 가진 여러 인스턴스를 검색하고, 로드 밸런싱 알고리즘에 따라 적절한 인스턴스를 선택합니다.
    • 기본적으로 Round-Robin 알고리즘이 사용됩니다.

예제 코드

기본 설정

@Configuration
public class AppConfig {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

사용 예

@Service
public class MyService {

    private final RestTemplate restTemplate;

    public MyService(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    public String getSomeData() {
        // 'my-service'는 서비스 레지스트리에 등록된 서비스 이름
        String url = "http://my-service/api/data";
        return restTemplate.getForObject(url, String.class);
    }
}
  • 위 코드에서 http://my-service는 실제 호스트명 또는 IP가 아닌 서비스 이름입니다.
  • @LoadBalanced가 적용된 RestTemplate은 서비스 레지스트리를 조회해 해당 서비스 이름과 매칭되는 인스턴스를 선택합니다.

장점

  1. 부하 분산:

    • 서비스 간 요청을 효율적으로 분산하여 특정 인스턴스에 과부하가 걸리는 것을 방지합니다.
  2. 확장성:

    • 서비스가 동적으로 추가되거나 제거되어도 서비스 레지스트리를 통해 자동으로 반영됩니다.
  3. 유연성:

    • 기본 로드 밸런싱 알고리즘 외에도, 필요에 따라 사용자 정의 로드 밸런싱 전략을 구현할 수 있습니다.

사용 가능한 클라이언트

@LoadBalanced는 주로 아래 두 가지 클라이언트와 함께 사용됩니다.

  1. RestTemplate:

    • 간단한 HTTP 요청을 보낼 때 사용.
    • 위에서 설명한 코드와 같이 동작.
  2. WebClient (Spring WebFlux):

    • 비동기식 HTTP 요청을 지원.
    • 사용법:
      @Bean
      @LoadBalanced
      public WebClient.Builder webClientBuilder() {
          return WebClient.builder();
      }

주의사항

  1. 서비스 이름 사용 필수:

    • URL에 반드시 서비스 이름(예: http://service-name)을 사용해야 합니다.
    • IP나 호스트명을 직접 사용하면 로드 밸런싱이 적용되지 않습니다.
  2. Spring Cloud 환경 필요:

    • @LoadBalanced는 Spring Cloud 프로젝트의 일부로, Spring Boot 애플리케이션에 Spring Cloud 의존성을 추가해야 동작합니다.
    • 예: spring-cloud-starter-loadbalancer 또는 spring-cloud-starter-netflix-eureka-client 의존성 추가.
  3. Deprecated된 Ribbon:

    • @LoadBalanced는 이전에 Ribbon과 함께 사용되었으나, Ribbon은 Spring Cloud에서 더 이상 유지보수되지 않으며, 현재는 Spring Cloud LoadBalancer로 대체되었습니다.

Spring Cloud LoadBalancer 의존성 추가

Maven 기준:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

요약

  • @LoadBalanced는 클라이언트(예: RestTemplate, WebClient)에서 서비스 이름 기반의 로드 밸런싱을 지원합니다.
  • 주로 Spring Cloud LoadBalancer와 함께 사용되며, 서비스 레지스트리(Eureka, Consul)와 통합됩니다.
  • 기본적으로 Round-Robin 알고리즘을 사용하며, 사용자 정의 로드 밸런싱 전략도 구현 가능합니다.

'Spring Microservice' 카테고리의 다른 글

Circuit Breaker 패턴  (0) 2024.12.12
@FeignClient  (0) 2024.12.11
eureka server configuration  (0) 2024.12.11
@EnableFeignClients  (0) 2024.12.11
Spring Cloud Bus  (0) 2024.12.11