MSA - Service Discovery

twonezero·2024년 8월 1일
0

MSA - Spring Cloud

목록 보기
2/3
post-thumbnail

서비스 디스커버리

  • 서비스 디스커버리는 마이크로서비스 아키텍처에서 각 서비스의 위치를 동적으로 관리하고 찾아주는 기능으로 MSA 에서는 필수적인 기능이다.
  • 각 서비스는 등록 서버에 자신의 위치를 등록하고, 다른 서비스는 이를 조회하여 통신
  • 주요기능
    • 서비스 등록, 서비스 조회, 헬스 체크

서비스 디스커버리 기능을 하는 라이브러리는 많지만, 이번에는 넷플릭스에서 개발한 Eureka 에 대해서 알아보자.

Eureka

  • 넷플릭스가 개발한 서비스 디스커버리 서버로, 마이크로서비스 아키텍처에서 각 서비스의 위치를 동적으로 관리
  • 모든 서비스 인스턴스의 위치를 저장하는 중앙 저장소 역할을 하며, 서비스 인스턴스의 상태를 주기적으로 확인하여 가용성을 보장
  • 여러 인스턴스를 지원하여 고가용성을 유지할 수 있음

활용

  • Eureka Server 와 Client 가 필요하다. 아래 스프링 이니셜라이저에서 검색하면 해당 dependency 가 나온다.
    Eureka_Dependency

Eureka Server

  • 서비스 레지스트리를 구성하는 중앙 서버
  • Server 역할의 application.yml 예시
server:
  port: 8761

eureka:
  client:
    register-with-eureka: false  # 다른 Eureka 서버에 이 서버를 등록하지 않음
    fetch-registry: false  # 다른 Eureka 서버의 레지스트리를 가져오지 않음
  server:
    enable-self-preservation: false  # 자기 보호 모드 비활성화

Eureka Client

  • 각 서비스는 Eureka 서버에 자신을 등록해야 함
  • spring-cloud-starter-netflix-eureka-client 의존성을 사용하고, 애플리케이션 이름만 설정파일에 있으면 Eureka에 등록됨
  • 클라이언트 역할 application.yml 예시
spring:
  application:
    name: my-service

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/  # Eureka 서버 URL
    register-with-eureka: true  # Eureka 서버에 등록
    fetch-registry: true  # Eureka 서버로부터 레지스트리 정보 가져오기
  instance:
    hostname: localhost  # 클라이언트 호스트 이름
    prefer-ip-address: true  # IP 주소 사용 선호
    lease-renewal-interval-in-seconds: 30  # 리스 갱신 간격
    lease-expiration-duration-in-seconds: 90  # 리스 만료 기간

서비스 디스커버리 동작

  • Eureka client 는 Server에서 필요한 서비스의 위치를 조회할 수 있다.
  • 이때, client 간 서비스끼리 통신하기 위해 RestTemplate 또는 FeignClient 를 사용한다. FeignClient 를 사용한 통신 예시는 아래에서 로드밸런싱과 연관지어 설명하겠다.

클라이언트 사이드 로드밸런싱

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

FeignClient와 Ribbon 에 대해 설명하고 앱 설정 예시를 살펴보자.

FeignClient & Ribbon

FeignClient

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

Ribbon

  • 넷플릭스가 개발한 클라이언트 사이드 로드 밸런서로, 마이크로서비스 아키텍처에서 서비스 인스턴스 간의 부하를 분산
  • 로드 밸런싱 알고리즘을 지원하며, Eureka와 같은 서비스 디스커버리와 연동하여 사용
  • 주요 특징
    • 서버 리스트 제공자: Eureka 등으로부터 서비스 인스턴스 리스트를 제공받아 로드 밸런싱에 사용
    • 로드 밸런싱 알고리즘: 라운드 로빈, 가중치 기반 등 다양한 로드 밸런싱 알고리즘 지원
    • Failover: 요청 실패 시 다른 인스턴스로 자동 전환

FeignClient & Ribbon 적용

아래와 같이 Order 에 대한 api 콜이 들어왔을 때, 일반적으로 Order에서는 Product 에 대한 내용을 알아야 처리가 가능할 수 있다. 이때 FeignClient 를 통해 호출할 수 있다.

  • 예를 들어, Product 전체 조회 등

feignclient 와 ribbon 을 적용하기 위해선 디펜던시를 추가 해야한다.

  • build.gradle
dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
}
  • Application.java ( Order 도 동일 )
@SpringBootApplication
@EnableFeignClients
public class ProductApplication {

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

이때 각 클라이언트의 application.yml 파일을 작성해야한다.

  • Order > application.yml
spring:
  application:
    name: order-service
server:
  port: 19092
eureka:
  client:
    service-url:
      defaultZone: http://localhost:19090/eureka/
  • Product > application.yml
spring:
  application:
    name: product-service
eureka:
  client:
    service-url:
      defaultZone: http://localhost:19090/eureka/

이때, 파일에 적힌 service-url 은 Eureka Server 에도 작성해야한다. port 도 동일해야함

아래와 같이 코드를 작성한다. 이때 Order 는 ProductController 메소드에 대한 내용을 인터페이스로 작성한다.

  • Order > ProductClient.java
@FeignClient(name = "product-service") //yml에 정의한 이름
public interface ProductClient {
    @GetMapping("/product")
    String getProduct();
}
  • Product > ProductController
@RestController
public class ProductController {
    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/product")
    public String getProduct() {
        return "product info From port : " + serverPort ;
    }
}

지금까지 작성한 코드들은 아래의 그림과 같이 동작
FeignClient_Ribbon_Example

  • RibbonEurekaFeignClient 와 거의 함께 쓰인다. (고가용성)
  • Ribbon 에 대한 설정은 따로 하지 않아도 FeignClient 가 기본적으로 Ribbon 을 사용하여 로드밸런싱을 수행한다.

다음 글에서는 Spring Cloud 의 기능들을 활용해서 MSA 의 기본적인 프로젝트를 만들어보겠다. 서킷브레이커나 게이트웨이, 필터링 등의 내용을 프로젝트를 만들며 설명하겠다.

profile
소소한 행복을 즐기는 백엔드 개발자입니다😉

1개의 댓글

comment-user-thumbnail
2024년 8월 2일

잘 정리해주셨습니다~ 앞으로도 이렇게 작성해주시면 좋을 것 같습니다

답글 달기