MSA
개요
이전에 작성했던 MSA 기초에 이어서 SpringCloud의 주요 모듈의 사용법에 대해 배운 내용을 정리할 것이다.
Spring Cloud 주요 모듈 및 사용 방법
서비스 등록 및 디스커버리(Eureka)
서비스 디스커버리(Service Discovery)
- 분산 시스템에서 서비스 간 통신을 위해 각 서비스의 위치(주소와 포트)를 동적으로 찾을 수 있도록 하는 메커니즘이다.
- 이를 통해 서비스들이 고정된 주소에 의존하지 않고, 확장성과 장애 복구를 유연하게 처리할 수 있다.
Eureka
- Netflix에서 개발한 서비스 레지스트리 및 디스커버리 서버로, Spring Cloud에서 많이 사용된다.
- 주요 역할
- 서비스 등록: 각 서비스는 Eureka 서버에 자신을 등록하여 자신의 위치를 알린다.
- 서비스 검색: 클라이언트 또는 다른 서비스는 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
동작 원리
- @FeignClient(name = "service-name") 어노테이션을 통해 Eureka에 등록된 서비스 이름을 참조
- Eureka 서버에서 service-name 이름으로 등록된 서비스 인스턴스 목록을 조회
- 조회된 서비스 인스턴스 목록 중 하나를 선택해 요청을 보내면 Ribbon을 사용하여 로드 밸런싱 수행
- 여러 서비스 인스턴스가 있으면, 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 |