취미겸생업

[Spring boot] Spring Cloud 로드밸런싱 본문

IT/Spring Boot

[Spring boot] Spring Cloud 로드밸런싱

nohumb 2026. 6. 30. 15:53

로드밸런싱

로드 밸런싱이란

  • 네트워크 트래픽을 여러 서버로 분산, 특정 서버에 부하가 집중되는 것을 방지해 안정성 및 성능 향상
  • 클라이언트 사이드 로드 밸런싱
    • 클라이언트가 서버 목록을 갖고, 하나를 선택해 요청하여 로드밸런싱

FeignClient

서비스 간 통신은 RetTemplate, RestClient 등을 사용할 수 있지만, @FeignClient는 인터페이스를 통해 선언적으로 별도의 복잡한 설정 없이 서비스와 통신할 수 있다.

  • 연동

    • Eureka와 같은 서비스 디스커버리와 연동되어 동적으로 서비스 인스턴스 조회
    • Spring Cloud Loadbalancer와 연동되어 있기 때문에 로드밸런싱 또한 자동으로 수행
  • build.gradle

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

      @Configuration
      @EnableFeignClints
      public class FeignClientConfig {}
  • MyServiceClient.java

      @FeignClient(name = "my-service")
      public interface MyServiceClient {
          @GetMapping("/api/data") // http://my-service/api/data
          String getData();
      }

Ribbon

  • SCG(Spring Cloud Gateway)에 WebFlux 기반의 SCL(Spring Cloud LoadBalancer)가 포함되어 있기 때문에 Ribbon은 현재는 쓰이지 않으나 소개를 위해 작성

  • 넷플릭스가 개발한 클라이언트 사이드 로드 밸런서로, 마이크로서비스 아키텍처에서 서비스 인스턴스 간의 부하를 분산

  • 다양한 로드 밸런싱 알고리즘을 지원하며, Eureka와 같은 서비스 디스커버리와 연동하여 사용

  • 주요 특징

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

      my-service:
        ribbon:
          eureka:
            enabled: true

SCL (Spring Cloud LoadBalancer)

Ribbon은 Spring Cloud LoadBalancer(이하 SCL)에 대체되었다. 별도의 복잡한 설정 없이도 Eureka, OpenFeign 등 Spring Cloud 구성요소와 연동되어 자동으로 로드밸런싱을 수행한다.

  • build.gradle

      dependencies {
          implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer'
      }
  • application.yml, 로드밸런싱 알고리즘 또는 캐싱 튜닝이 필요할 경우 작성한다

      spring:
        cloud:
          loadbalancer:
            # 로드밸런서가 유레카로부터 받아온 서버 목록을 캐싱하는 시간 설정 (기본 35초)
            # 서비스 인스턴스가 자주 켜고 꺼진다면 이 시간을 줄여야 에러가 안남
            cache:
              ttl: 10s 
            # 알고리즘을 바꾸고 싶을 때 (기본값: round-robin)
            # configurations: random