본문 바로가기

MSA(마이크로서비스)

마이크로서비스의 핵심! Service Discovery로 유연하고 확장 가능한 아키텍처 만들기

728x90
반응형

마이크로서비스 아키텍처에서 Service Discovery의 필요성과 출연 배경

마이크로서비스 아키텍처는 각 서비스가 독립적으로 개발, 배포, 그리고 관리되는 구조입니다. 이를 통해 확장성과 유연성을 높일 수 있지만, 서비스들이 서로 통신하기 위해서는 각 서비스의 위치(IP 주소 및 포트 번호)를 알아야 합니다. 문제는 마이크로서비스 환경에서는 이러한 서비스들이 빈번하게 스케일링(증가/감소), 이동, 또는 재시작되기 때문에 각 서비스의 위치가 동적으로 변할 수 있다는 점입니다.

초기의 모놀리식 아키텍처에서는 모든 서비스가 하나의 코드베이스에 통합되어 있어 통신이 비교적 단순했습니다. 그러나 마이크로서비스로 전환하면서 서비스들이 서로 독립적으로 배포되기 때문에 서비스 간의 위치 정보를 관리하는 방식이 필요해졌습니다. 이러한 배경에서 Service Discovery 패턴이 등장하게 되었습니다.

Service Discovery 개념

Service Discovery는 동적으로 변하는 서비스의 위치를 자동으로 탐색하고 관리하는 시스템입니다. 서비스 간 통신을 가능하게 하고, 서비스의 위치(IP 및 포트)를 직접 알지 않아도 서로 연결될 수 있도록 지원합니다. 이를 통해 개발자는 마이크로서비스의 동적인 특성을 걱정하지 않고 애플리케이션을 구현할 수 있습니다.

Service Discovery는 크게 두 가지로 분류됩니다:

  1. 클라이언트 사이드 디스커버리(Client-side discovery): 클라이언트가 직접 서비스 레지스트리(서비스 정보를 저장하는 중앙 데이터베이스)에서 서비스 위치를 조회합니다. 클라이언트가 로드밸런싱도 처리할 수 있습니다.
  2. 서버 사이드 디스커버리(Server-side discovery): 클라이언트는 서비스 위치를 몰라도 되며, 요청을 서버에 보내면 서버가 서비스 위치를 찾아 요청을 전달합니다. 일반적으로 API Gateway와 연동하여 사용됩니다.
반응형

Service Discovery의 역할 및 도입 시 장점

Service Discovery는 다음과 같은 중요한 역할을 수행합니다:

  • 동적 서비스 탐색: 고정된 IP 주소와 포트번호 대신, 서비스가 동적으로 생성되고 소멸하는 환경에서 서비스를 탐색하고 연결할 수 있도록 지원합니다.
  • 자동 스케일링 지원: 서비스가 자동으로 수평 확장(Scaling)되는 상황에서 새로운 서비스 인스턴스를 자동으로 감지합니다.
  • 부하 분산(Load Balancing): 여러 인스턴스 중 하나를 선택하여 클라이언트 요청을 분산할 수 있습니다.
  • 오류 복구: 장애가 발생한 서비스는 자동으로 제외되어 트래픽을 안정적으로 관리합니다.

Service Discovery 도입 시의 주요 장점은 다음과 같습니다:

  • 유연한 서비스 통신: 서비스 간의 연결이 단순화되어 변화에 쉽게 대응할 수 있습니다.
  • 운영 효율성 향상: 서비스 위치를 수동으로 관리할 필요가 없으므로 운영 및 유지보수 부담이 줄어듭니다.
  • 장애 대응력 강화: 서비스 장애 시 자동으로 다른 인스턴스를 사용하여 서비스를 계속 제공할 수 있습니다.

Service Discovery 주요 솔루션 소개

  1. Eureka: 넷플릭스에서 개발한 오픈 소스 Service Discovery 서버로, Spring Cloud Netflix에서 널리 사용됩니다.
  2. Consul: HashiCorp에서 제공하는 서비스 등록 및 서비스 상태 모니터링 기능을 가진 솔루션입니다.
  3. Zookeeper: Apache의 분산 코디네이션 서비스로, 고가용성 및 분산 환경에서 자주 사용됩니다.
  4. Etcd: 분산 키-값 저장소로, 주로 컨테이너 오케스트레이션 시스템인 Kubernetes에서 Service Discovery에 사용됩니다.

Spring으로 Service Discovery 구현하기

Spring 환경에서 가장 많이 사용하는 Service Discovery 솔루션은 Eureka입니다. Spring Cloud Netflix 프로젝트를 통해 Eureka 서버와 클라이언트를 쉽게 설정할 수 있습니다. 간단한 예제를 통해 Eureka 기반의 Service Discovery를 구현하는 방법을 알아보겠습니다.

Eureka 서버 설정

먼저, Eureka 서버를 설정합니다. 이는 모든 서비스가 등록되는 중앙 레지스트리 역할을 합니다.

pom.xml에 의존성을 추가합니다

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

Eureka 서버 애플리케이션 설정

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

application.yml 설정

server:
  port: 8761

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false

spring:
  application:
    name: eureka-server

클라이언트 서비스 등록

이제 클라이언트 서비스가 Eureka 서버에 등록될 수 있도록 설정합니다.

pom.xml에 의존성 추가

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

클라이언트 애플리케이션 설정

@SpringBootApplication
@EnableEurekaClient
public class ClientServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(ClientServiceApplication.class, args);
    }
}

application.yml 설정

server:
  port: 8080

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

spring:
  application:
    name: client-service
728x90

이처럼 Service Discovery는 마이크로서비스 간의 통신을 단순화하고 확장성과 유연성을 높여주는 중요한 패턴입니다. Eureka를 사용한 Spring 기반의 Service Discovery 설정은 비교적 간단하며, 마이크로서비스 환경에서 필수적으로 고려해야 할 요소입니다.

728x90
반응형