@LoadBalanced
2024. 12. 11. 16:50ㆍSpring Microservice
Spring Boot에서 @LoadBalanced
는 Spring Cloud의 Spring Cloud LoadBalancer
기능과 관련된 애너테이션으로, 주로 클라이언트 측 로드 밸런싱을 제공하기 위해 사용됩니다. 이 애너테이션을 이해하려면 로드 밸런싱과 Spring Cloud LoadBalancer의 작동 원리를 간단히 알아야 합니다.
@LoadBalanced
의 역할
@LoadBalanced
는 RestTemplate
또는 WebClient
객체에 부여되어, 서비스 간 통신에서 로드 밸런싱이 가능하도록 설정합니다.
작동 방식
서비스 레지스트리와 통합:
- Spring Cloud에서
Eureka
,Consul
같은 서비스 레지스트리를 사용하면, 서비스가 등록될 때 이름(예:service-name
)으로 접근할 수 있습니다. @LoadBalanced
는 이러한 서비스 이름을 기반으로, 여러 인스턴스 중 하나를 선택해 요청을 라우팅합니다.
- Spring Cloud에서
클라이언트 측 로드 밸런싱:
- 클라이언트(예:
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
은 서비스 레지스트리를 조회해 해당 서비스 이름과 매칭되는 인스턴스를 선택합니다.
장점
부하 분산:
- 서비스 간 요청을 효율적으로 분산하여 특정 인스턴스에 과부하가 걸리는 것을 방지합니다.
확장성:
- 서비스가 동적으로 추가되거나 제거되어도 서비스 레지스트리를 통해 자동으로 반영됩니다.
유연성:
- 기본 로드 밸런싱 알고리즘 외에도, 필요에 따라 사용자 정의 로드 밸런싱 전략을 구현할 수 있습니다.
사용 가능한 클라이언트
@LoadBalanced
는 주로 아래 두 가지 클라이언트와 함께 사용됩니다.
RestTemplate:
- 간단한 HTTP 요청을 보낼 때 사용.
- 위에서 설명한 코드와 같이 동작.
WebClient (Spring WebFlux):
- 비동기식 HTTP 요청을 지원.
- 사용법:
@Bean @LoadBalanced public WebClient.Builder webClientBuilder() { return WebClient.builder(); }
주의사항
서비스 이름 사용 필수:
- URL에 반드시 서비스 이름(예:
http://service-name
)을 사용해야 합니다. - IP나 호스트명을 직접 사용하면 로드 밸런싱이 적용되지 않습니다.
- URL에 반드시 서비스 이름(예:
Spring Cloud 환경 필요:
@LoadBalanced
는 Spring Cloud 프로젝트의 일부로, Spring Boot 애플리케이션에 Spring Cloud 의존성을 추가해야 동작합니다.- 예:
spring-cloud-starter-loadbalancer
또는spring-cloud-starter-netflix-eureka-client
의존성 추가.
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 |