로드 밸런싱

2026. 6. 26. 15:12·MSA

1. 로드 밸런싱이란?

  • 로드 밸런싱은 네트워크 트래픽을 여러 서버로 분산시켜 서버의 부하를 줄이고, 시스템의 성능과 가용성을 높이는 기술
  • 서버 간 트래픽을 고르게 분배하여 특정 서버에 부하가 집중되는 것을 방지
  • 종류: 클라이언트 사이드 로드 밸런싱, 서버 사이드 로드 밸런싱

 

2. FeignClient이란?

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

2-1. 주요 특징

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

 

3. Ribbon이란?

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

3-1. Ribbon의 주요 특징

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

 

4. 로드 밸런싱 알고리즘

4-1 라운드 로빈

  • 라운드 로빈: 각 서버에 순차적으로 요청을 분배하는 방식
  • 간단하고 공평하게 트래픽을 분산

4-2 가중치 기반 로드 밸런싱

  • 가중치 기반 로드 밸런싱: 각 서버에 가중치를 부여하고, 가중치에 비례하여 요청을 분배하는 방식
  • 서버의 성능이나 네트워크 상태에 따라 가중치를 조절

4-3 기타 알고리즘

  • 최소 연결: 현재 연결된 클라이언트 수가 가장 적은 서버로 요청을 보내는 방식
  • 응답 시간 기반: 서버의 응답 시간을 기준으로 가장 빠른 서버로 요청을 보내는 방식

 

5. 로드 밸런싱 테스트를 위한 설정

FeignClient와 Eureka 연동하여 사용!

Product와 Order를 새로 만들어줍니다. Server는 이전에 생성했던 거 그대로 사용

 

먼저 Product의 build.gradle

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-webmvc'
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-webmvc-test'
    testCompileOnly 'org.projectlombok:lombok'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
    testAnnotationProcessor 'org.projectlombok:lombok'
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

 

resources/application.yml

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

 

ProductApplication.java

@SpringBootApplication
@EnableFeignClients // FeignClient를 사용
public class ProductApplication {

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

}

 

ProductController.java

@RestController
public class ProductController {

    @Value("${server.port}")
    private String serverPort;
	
    // product의 id를 통해 포트 번호를 가져와 출력
    @GetMapping("/product/{id}")
    public String getProduct(@PathVariable String id){ 
        return " Product " + id + " info!! From port : " + serverPort;
    }
}

 


Order의 build.gradle

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-webmvc'
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-webmvc-test'
    testCompileOnly 'org.projectlombok:lombok'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
    testAnnotationProcessor 'org.projectlombok:lombok'
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

 

resources/application.yml

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

 

Product와 마찬가지로 OrderApplication.java 에 @EnableFeignClients 설정(Eureka 서버와 연동하기 위함)

@SpringBootApplication
@EnableFeignClients
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

}

 

OrderController.java

@RestController
@RequiredArgsConstructor
public class OrderController {

    private final OrderService orderService;

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

 

OrderService.java

@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 ...";
    }
}

 

ProductClient.java

// Order에서 Producdservice 호출 - Port를 가져옴(19092, 3, 4) 어느 포트가 호출되서 가져오는지 확인
@FeignClient(name = "product-service")
public interface ProductClient{ // order 에서 product의 id를 가져오는 역할
    @GetMapping("/product/{id}")

    String getProduct(@PathVariable String id);
}

 

 


위 코드를 통한 MSA 호출 실행 순서 (6단계)

 

1단계: 외부 요청 접수(OrderController)

  • http://localhost:19091/order/1 요청이 들어오면 orderId=1을 추출해 orderService.getOrder("1")을 호출

 

2단계: 조건 검사 및 비즈니스 로직 시작(OrderService)

  • orderId가 "1"인 것을 확인하고, 내부적으로 productId="2"를 지정해 getProductInfo("2")를 호출

 

3단계: 유레카 서버에 주소 문의 (ProductClient)

  • FeignClient가 Eureka Server(19090)에 product-service가 몇 번 포트(19092)에서 돌고 있는지 주소를 가져옴

4단계: Product 서비스로 원격 호출 (OpenFeign)

  • 유레카가 알려준 주소를 바탕으로 http://localhost:19092/product/2로 동적 HTTP 요청을 보냄

5단계: 상품 정보 및 포트 반환 (ProductController)

  • Product 서비스(19092)가 요청을 받아 상품 ID("2")와 자신의 포트 번호("19092")를 문자열로 응답

6단계: 데이터 조립 및 최종 출력 (OrderService ➡️ Controller)

  • 받아온 상품 정보와 기존 주문 정보를 하나로 묶어 브라우저 화면에 최종 출력

'MSA' 카테고리의 다른 글

API 게이트웨이 (Spring Cloud Gateway)  (0) 2026.06.27
서킷 브레이커 (Resilience4j)  (0) 2026.06.27
서비스 디스커버리 (Eureka) 와 Server/Client 설정 방법  (0) 2026.06.26
Spring Cloud란 무엇일까?  (0) 2026.06.25
MSA란 무엇일까?  (0) 2026.06.25
'MSA' 카테고리의 다른 글
  • API 게이트웨이 (Spring Cloud Gateway)
  • 서킷 브레이커 (Resilience4j)
  • 서비스 디스커버리 (Eureka) 와 Server/Client 설정 방법
  • Spring Cloud란 무엇일까?
taeyoon2
taeyoon2
taeyoon2 님의 블로그 입니다.
  • taeyoon2
    taeyoon2 님의 블로그
    taeyoon2
  • 전체
    오늘
    어제
    • 분류 전체보기 (36)
      • 심화_AI를 활용한 백엔드 아키텍처 심화 과정 (24)
      • MSA (11)
      • Study (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    spring cloud config
    이벤트 드리븐
    Resilience4j
    서킷 브레이커
    api gateway
    OAuth2
    내일배움캠프 #사전캠프 #til
    RabbitMQ
    til
    로드 밸런싱
    내일배움캠프
    JWT
    Zipkin
    Config
    보안구성
    MSA
    분산추적
    심화_AI를 활용한 백엔드 아키텍처 심화 과정
    spring cloud
    사전캠프
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
taeyoon2
로드 밸런싱
상단으로

티스토리툴바