본문 바로가기

자바 심화/TIL

MSA - 기초 2

MSA

 

MSA - 기초 1

개요추후 MSA를 사용한 프로젝트를 진행하기 앞서 MSA가 무엇이고 어떻게 사용하는지에 대해 배워보려고 한다.다만, MSA에 대한 이론부터 완벽하게 익히고 들어가기에는 너무 오래 걸리기 때문에

eleunadeu.tistory.com

 

개요

이전에 작성했던 MSA 기초에 이어서 SpringCloud의 주요 모듈의 사용법에 대해 배운 내용을 정리할 것이다.

 

Spring Cloud 주요 모듈 및 사용 방법

서비스 등록 및 디스커버리(Eureka)

서비스 디스커버리(Service Discovery)

  • 분산 시스템에서 서비스 간 통신을 위해 각 서비스의 위치(주소와 포트)를 동적으로 찾을 수 있도록 하는 메커니즘이다.
  • 이를 통해 서비스들이 고정된 주소에 의존하지 않고, 확장성과 장애 복구를 유연하게 처리할 수 있다.

Eureka

  • Netflix에서 개발한 서비스 레지스트리 및 디스커버리 서버로, Spring Cloud에서 많이 사용된다.
  • 주요 역할
    1. 서비스 등록: 각 서비스는 Eureka 서버에 자신을 등록하여 자신의 위치를 알린다.
    2. 서비스 검색: 클라이언트 또는 다른 서비스는 Eureka를 통해 필요한 서비스의 위치를 동적으로 검색한다.
  • 구성 요소
    • Eureka 서버: 서비스 레지스트리 역할을 하는 중앙 서버
    • Eureka 클라이언트: 자신을 등록하거나 다른 서비스를 검색하는 애플리케이션
  • 장점
    • 동적 스케일링: 서비스의 인스턴스가 추가/제거되어도 자동으로 반영
    • 높은 가용성: Eureka 서버는 클러스터링을 통해 장애에 대비 가능

사용 예시

yml

spring:
  application:
    name: server

server:
  port: 19090

eureka:
  client:
    ## 유레카 서버에 자신을 등록할지 여부를 설정한다.
    ## true로 설정하면 유레카 클라이언트가 유레카 서버에 자신을 등록함
    ## 서버는 false로 설정해 자기 자신을 등록하지 않게 한다.
    register-with-eureka: false
    ## 유레카 서버로부터 레지스트리를 가져올지 여부를 설정한다.
    ## true로 설정 시 유레카 클라이언트가 서버로부터 다른 서비스 인스턴스 목록을 가져온다.
    ## 서버는 false로 설정해 레지스트리를 가져오지 않도록 한다.
    fetch-registry: false
    ## 유레카 클라이언트가 서버와 통신하기 위해 사용할 기본 서비스 URL을 설정한다.
    ## 클라이언트 애플리케이션이 유레카 서버에 연결하고 등록하거나 레지스트리를 가져올 때 사용
    service-url:
      defaultZone: http://localhost:19090/eureka/
  ## 유레카 서버 인스턴스의 호스트 이름을 설정
  ## 서버가 자신의 호스트 이름을 다른 서비스에 알릴 때 사용한다.
  instance:
    hostname: localhost

 

application.java

package com.spring_cloud.eureka.server;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer
@SpringBootApplication
public class ServerApplication {

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

}
  • @EnableEurekaServer 애너테이션으로 Eureka 서버를 사용할 수 있도록 한다.

Eureka Client

dependency

implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
  • Gradle에 dependency를 위와 같이 추가하고 아래의 yml 파일을 설정한다.

yml

spring:
  application:
    name: first

server:
  port: 19091

## 유레카 클라이언트가 서버와 통신하기 위해 사용할 기본 서비스 URL 설정
## 유레카 서버의 포트와 이름을 정확히 지정해야 한다.
eureka:
  client:
    service-url:
      defaultZone: http://localhost:19090/eureka/

 

Eureka 서버와 클라이언트를 설정한 후 Server Client 순서로 실행시킨 후 Eureka 서버 주소로 접속하면 서버 정보와 인스턴스 정보를 확인할 수 있다.

 

 

클라이언트 사이드 로드 밸런싱(Client-side Load Balancing)

클라이언트 측에서 직접 로드 밸런싱을 수행하는 방식

  • 클라이언트는 서비스 디스커버리로 받은 여러 인스턴스 목록 중 하나를 선택해 요청을 보냄
  • 장점: 인프라 레벨에서 별도의 로드 밸런서를 두지 않아도 되고, 동적으로 서비스 상태를 확인할 수 있음

FeignClient

  • 선언형 HTTP 클라이언트로, 인터페이스와 어노테이션만으로 REST API 호출 가능(Ribbon을 내부적으로 사용하여 로드 밸런싱 및 서비스 디스커버리와 연동)
  • Spring Cloud에서 Feign은 Eureka와 연동해 자동으로 서비스 위치를 찾고 호출함
  • 주요 특징
    • 간결한 코드 작성(@FeignClient)
    • 서비스 디스커버리 및 로드 밸런싱 지원
    • 요청/응답 변환 자동 처리
  • 사용 예시
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
  • Gradle에 위의 dependency를 추가하고 build 한다.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients
public class OrderApplication {

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

}
  • @EnableFeignClient 어노테이션을 사용해 FeignClient를 사용할 수 있도록 한다.
@FeignClient(name = "product-service")
public interface ProductClient {
    @GetMapping("/product/{id}")
    String getProduct(@PathVariable("id") String id);
}
  • FeignClient 인터페이스를 작성해 서비스 호출을 수행하도록 한다.

 

Ribbon

클라이언트 사이드 로드 밸런싱 라이브러리로, Eureka와 함께 사용되며 Feign 내부에 통합되어 동작

  • 기본 로드 밸런싱 알고리즘은 라운드 로빈 방식이며, 사용자 정의 알고리즘도 지원
  • 주요 역할
    • 서비스 디스커버리로 가져온 인스턴스 목록 관리
    • 적합한 인스턴스를 선택해 요청 전달
  • Spring Boot 2.4 이상에서는 Ribbon이 EOL로, Spring Cloud LoadBalancer로 대체 되었다.

 

로드 밸런싱 알고리즘

  • 라운드 로빈: 각 서버에 순차적으로 요청을 분배하는 방식, 간단하고 공평하게 트래픽을 분산
  • 가충치 기반 로드 밸런싱: 각 서버에 가중치를 부여하고, 가중치에 비례하여 요청을 분배하는 방식, 서버의 성능이나 네트워크 상태에 따라 가중치를 조절
  • 기타 알고리즘
    • 최소 연결: 현재 연결된 클라이언트 수가 가장 적은 서버로 요청을 보내는 방식
    • 응답 시간 기반: 서버의 응답 시간을 기준으로 가장 빠른 서버로 요청을 보내는 방식

Ribbon 설정 예시

yml

my-service:
  ribbon:
    eureka:
      enabled: true

 

동작 원리

  1. @FeignClient(name = "service-name") 어노테이션을 통해 Eureka에 등록된 서비스 이름을 참조
  2. Eureka 서버에서 service-name 이름으로 등록된 서비스 인스턴스 목록을 조회
  3. 조회된 서비스 인스턴스 목록 중 하나를 선택해 요청을 보내면 Ribbon을 사용하여 로드 밸런싱 수행
  4. 여러 서비스 인스턴스가 있으면, Round Robbin 또는 설정도니 로드 밸런싱 알고리즘을 사용해 요청을 분배

 

정리

  • 서킷 브레이커, API Gateway 등은 다음 노트에 기록
  • MSA 애플리케이션이 어떤 식으로 통신하는지에 대한 방법을 알게 되었고, 클라이언트 측에서 로드 밸런싱을 하는 방법을 배우게 되었다.
  • 설정 및 사용 방법에 적응하는 과정이 필요할 것 같다.

'자바 심화 > TIL' 카테고리의 다른 글

MSA - 기초 4  (0) 2024.11.26
MSA - 기초 3  (0) 2024.11.25
MSA - 기초 1  (1) 2024.11.21
클린 코드 -2  (1) 2024.11.20
클린 코드 1  (2) 2024.11.19