Spring Cloud 프레임워크에 대한 개요, 주요 패키지 목록 및 마이크로서비스 아키텍처 패턴과의 관계를 확인할 수 있습니다.
분산 애플리케이션의 개념은 확실히 새로운 것이 아니다. 오랜 IT 경력을 가진 사람이라면 초창기에도 분산 구성요소를 구현하는 여러 가지 다양한 기술을 기억할 것입니다. 요즘은 마이크로서비스가 전부입니다. 오늘날 분산 컴퓨팅의 개념을 고려하는 새로운 형태입니다.
특징은 통신이 본질적으로 REST와 메시징 프로토콜에 기반을 두고 있다는 것인데, 널리 퍼져 있는 표준이라는 장점이 있습니다. 핵심 개념은 본질적으로 동일하며, 전체 시스템의 일부가 서로 완전히 독립적이고 각각의 프로세스에서 실행됩니다.
클라우드 플랫폼의 등장과 함께 마이크로서비스 세계는 관련 기술의 번영을 위한 기반을 마련했습니다. 이러한 새로운 건축 양식에는 단점이 있으며 이를 극복하기 위해서는 여러 가지 구체적인 패턴이 필요합니다. Spring Cloud는 Spring Boot에 기반을 둔 Spring 프로젝트로, 자체 솔루션과 타사 통합(Netflix OSS 도구와 같은)을 통해 이러한 패턴을 다루는 특정 패키지를 포함합니다. 주요 마이크로서비스 패턴의 목록과 Spring Cloud가 이러한 패턴에 대처하는 방법에 대한 간략한 개요를 보여 줍니다.
단일 애플리케이션
단일 응용 프로그램을 독립적인 시스템으로 설명할 수 있으며, 목표는 단일 처리 장치에서 다양한 기능을 해결하는 것입니다. 다음 그림은 단일 응용프로그램의 모양을 보여줍니다. 주요 개념은 모든 애플리케이션이 비즈니스 논리 및 데이터베이스 계층과 같은 일부 일반적인 설계 논리에 특화된 계층으로 분해되지만 이러한 모든 계층은 일반적으로 동일한 프로세스에서 실행되며 내부 메서드 호출(실행되는 Java Virtual Machine 내부)을 통해 서로 통신한다는 것입니다.
마이크로서비스 애플리케이션
마이크로서비스 애플리케이션은 더 복잡한 구조를 가지고 있습니다. 마이크로서비스 시스템은 주요 기능이 독립적인 애플리케이션으로 분리되어 각각 자체 프로세스에서 실행되며, 위에서 설명한 모노리식 스키마에서와 같이 내부적으로 계층으로 분해되는 모노리식 시스템의 진화라고 생각할 수 있습니다.
다음 그림은 마이크로서비스 시스템의 대략적인 예를 보여줍니다. 지나치게 단순화된 스키마이지만 일반적인 이해를 위한 목적을 가지고 있습니다. 그림에서 외부 세계의 시스템 진입을 나타내는 게이트웨이와 일부 마이크로서비스가 각각 별도의 노드(하드웨어 또는 가상 머신)에 있습니다.
위 그림에서 각 마이크로서비스는 별도의 노드에서 실행되는 자체 데이터베이스 인스턴스도 사용합니다. 실제로 단일 서비스를 구현하는 방법은 엄격한 규칙을 따르지 않으며, 데이터베이스를 호스팅하는 단일 공유 노드 또는 각각 별도의 프로세스에서 실행되는 3개의 서비스를 호스팅하는 단일 노드를 가질 수도 있습니다(단순하고 일반적인 것을 유지하기 위해 컨테이너에 대해서는 언급하지 않습니다).
특정 배포 스키마 외에도 단일 시나리오와 비교했을 때 주요 차이점은 다양한 기능이 자체 프로세스에서 실행되고 있으며 이러한 기능은 일반적으로 REST 또는 메시징 프로토콜과 연결되어 있다는 것입니다. 즉, 원격 호출을 통해 통신하며 "분산" 구성 요소라는 것입니다.
이러한 "분산형" 특성을 통해 시스템의 각 부분을 독립적으로 개발할 수 있습니다. 이러한 방식으로 재사용 논리를 강화할 수 있습니다. 이러한 특수 구성요소에서 깨끗하고 강력한 설계를 고안하는 것이 더 간단하며, 단일 구성요소는 완전히 독립적인 팀에 의해 개발될 수 있습니다. 불행하게도, 이것은 또한 많은 단점을 동반합니다
- 이러한 분산된 구성요소를 어떻게 조정할 수 있을까요?
- 중앙 집중식으로 일관된 방식으로 구성을 처리하는 방법은 무엇입니까?
이 새로운 소프트웨어 패러다임을 활용하기 위해서는 주요 단점을 해결할 수 있는 기술이 필요합니다. 클라우드 기술의 등장은 이러한 문제를 개선되고 효과적으로 처리할 수 있는 방법을 제공했습니다. 그렇다고 마이크로서비스가 모든 문제에 대한 해결책이 되는 것은 아니다. 때로는 단일 솔루션이 더 자연스러운 선택이 될 수 있습니다. 우리는 마이크로서비스가 크고 복잡한 시스템에는 훌륭한 선택이 될 수 있지만, 더 단순한 시스템에는 매력을 일부 잃었다고 말할 수 있습니다.
Spring Cloud, Microservices 및 Netflix OSS
Spring Cloud는 Spring Boot 프레임워크를 기반으로 합니다. 자체적으로 다양한 솔루션을 제공하고 외부 도구와 통합되어 주요 마이크로서비스 아키텍처 문제를 해결합니다. Netflix OSS는 주요 마이크로서비스 패턴을 다루는 일련의 소프트웨어 솔루션입니다. Spring Cloud 패키지는 이러한 솔루션에 대한 통합 계층을 제공합니다. 관련 Spring Boot 스타터 종속성 및 일부 특정 구성을 사용하기에 충분합니다.
종속성을 릴리스 트레인으로 설정
종속성 관리를 단순화하기 위해 릴리스 트레인의 개념이 도입되었습니다. Spring Cloud는 특정 기능에 특화된 모듈 모음으로, 각 모듈은 독립적으로 개발됩니다. 릴리스 트레인은 서로 완전히 호환되는 것으로 확인된 모듈 릴리스 집합을 식별합니다. 사용할 Spring Boot 버전을 선택한 후에는 해당 버전과 호환되는 Spring Cloud 릴리스 트레인을 선택하여 Maven 종속성 관리 섹션에 설정해야 합니다:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
그런 다음 "의존성" 섹션에서 Spring Cloud 시작자별로 특정 모듈의 의존성을 설정할 수 있습니다 종속성 관리 섹션은 사용하려는 전체 모듈 집합 및 관련 버전을 지정하는 유일한 목적으로 사용됩니다. 이렇게 하면 종속성 섹션에서 개별 모듈에 대한 버전을 지정할 필요가 없습니다. 이 메이븐 피쳐를 BOM(Bill of Materials)이라고 합니다.
위의 종속성 관리 설정에 따라 애플리케이션에서 Spring Cloud Config 모듈의 기능을 사용하도록 하려면 다음과 같은 구성을 추가하기만 하면 됩니다:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
애플리케이션을 처음부터 설정할 때 스프링 문서에서 호환성 매트릭스를 검색하지 않으려면 start.spring.io 사이트를 사용하는 것이 실질적인 방법입니다. 먼저 Spring Boot 버전을 선택한 다음 원하는 Spring Cloud 모듈을 선택할 수 있습니다.
스프링 클라우드 및 마이크로 서비스 패턴
여기에는 마이크로서비스 아키텍처와 관련된 주요 패턴과 Spring Cloud 패키지가 제공하는 기능이 나열되어 있습니다:
- 분산/버전 구성
- 서비스 등록 및 검색을 수행
- 라우팅
- 서비스 대 서비스 호출
- 로드 밸런싱
- 서킷 브레이커
- 분산 메시징
- 분산 구성
마이크로서비스 아키텍처에서 중요한 문제는 구성을 처리하는 방법입니다. 우리는 각각의 프로세스에서 실행되는 많은 서비스를 가지고 있기 때문에, 우리는 단순히 각 서비스가 자체 구성에 책임이 있다고 생각할 수 있습니다. 시스템 관리의 관점에서 이것은 악몽이 될 것입니다. Spring Cloud는 중앙 집중식 구성 기능을 제공하고 Spring Cloud Config라는 이름의 이 문제를 해결하기 위한 자체 솔루션을 제공합니다. Spring Cloud Config는 백엔드 저장 기능의 첫 번째 선택으로 Git를 사용합니다(또는 Hashicorp의 Vault). Spring Cloud Config의 두 가지 대안은 Hashicorp와 Apache ZooKeeper의 Console입니다(둘 다 분산 구성에만 엄격하게 제한되지 않는 기능 포함).
서비스 등록 및 검색을 수행
마이크로서비스 아키텍처의 주요 특징 중 하나는 서비스 등록 및 검색입니다. 각 서비스는 중앙 서버(고가용성을 위해 두 개 이상의 노드에 분산되어 있을 수 있음)에 자체 등록하고 해당 중앙 서버를 사용하여 통신할 다른 서비스를 찾습니다. Spring Cloud는 Netflix OSS 툴 Eureka와의 통합을 제공합니다. Eureka는 클라이언트와 서버 패키지를 모두 가지고 있습니다. 클라이언트는 spring-cloud-starter-eureka에 의해 제공되고 서버는 spring-cloud-starter-eureka 서버 종속성에 의해 제공됩니다. 클라이언트 측을 구현하는 서비스는 서버를 사용하여 자체 등록함과 동시에 이미 등록된 다른 서비스를 찾습니다.
분산 로깅 및 추적
마이크로서비스 애플리케이션에서의 로깅 및 추적은 사소한 작업이 아닙니다. 로깅 작업을 중앙 집중식으로 수집하는 동시에 전체 시스템에서 서비스 상호 작용을 추적하는 고급 방법을 제공해야 합니다. Spring Cloud Sleuth 라이브러리는 이러한 문제를 해결하는 데 사용할 수 있는 선택입니다. Sleuth의 더 중요한 기능은 마이크로서비스 전반의 모든 보조 요청을 트리거한 단일 입력 요청과 연결하는 것입니다.
따라서 일부 식별 정보와 관련된 모든 로깅을 수집하는 동시에 타이밍 정보를 포함하여 각 요청에 관련된 상호 작용의 전체 그림을 제공합니다. 그런 다음 이러한 정보를 Zipkin이라는 다른 도구로 내보낼 수 있습니다. Zipkin은 마이크로서비스 아키텍처에서 지연 시간 문제를 분석하는 데 특화되어 있습니다.
라우팅
외부 세계와 마이크로서비스 시스템 간의 통신을 설정하려면 수신 요청을 올바른 서비스로 전달해야 합니다. Netflix OSS 솔루션은 Zuul이며, Spring-cloud-starter-zuul 스타터 종속성 및 관련 구성을 통해 Spring 애플리케이션 내에서 사용할 수 있습니다. Zuul은 시스템에 대한 API 게이트웨이 역할을 수행할 수 있으며 서버 측 로드 밸런서 역할도 수행할 수 있습니다.
서비스 대 서비스 호출
서비스 간 통신의 주요 형태는 REST 프로토콜입니다. Spring은 REST 호출을 수행하기 위한 동기 클라이언트로 RestTemplate를 제공합니다(최근의 비동기식 대안은 WebClient). Spring Cloud는 또한 봄 클라우드-starter-feek 스타터 의존성에 의해 REST 기반 클라이언트로서 Netflix Feign을 지원합니다. Feign은 프레임워크 자체에서 구현될 인터페이스를 정의할 수 있는 특정 주석을 사용합니다.
로드 밸런싱 수행
로드 밸런싱은 마이크로서비스 시스템이 구현해야 하는 또 다른 중요한 기능입니다. 단순 라운드 로빈, 오버로드된 서버 건너뛰기, 평균 응답 시간에 기반한 알고리즘 사용 등 다양한 규칙을 사용할 수 있습니다. 스프링 클라우드는 넷플릭스 OSS의 라이브러리인 리본을 통합하여 로드 밸런싱을 지원할 수 있습니다.
서킷 브레이커
마이크로서비스 시스템에서 일반적인 시나리오는 일부 서비스 장애가 다른 서비스와 전체 시스템에 영향을 미칠 가능성입니다. Circuit Breaker는 서비스가 즉시 실행을 중단하고 미리 정의된 결과를 반환하는 장애 임계값을 정의하여 이 문제를 해결하려는 패턴입니다. 히스트릭스는 이 패턴을 구현하는 넷플릭스 OSS 라이브러리입니다. Hystrix를 Spring Cloud 프로젝트에 포함시키려면 Spring-cloud-starter-Hystrix Spring Boot Starter를 사용해야 합니다.
분산 메시징
서비스 간의 전통적인 REST 스타일 통신 외에도 메시징 아키텍처 패턴을 사용할 수 있는 옵션도 있습니다. 전체 아키텍처 또는 일부 아키텍처를 게시/구독 또는 이벤트 중심의 포인트 투 포인트 메시징에 기반할 수 있습니다. Spring Cloud Stream 패키지를 사용하면 메시지 기반 마이크로 서비스를 구현하고 RabbitMQ 및 Apache Kafka와 같은 더 인기 있는 메시지 브로커를 통합할 수 있습니다.
결론
마이크로서비스 아키텍처는 고유한 복잡성을 극복하기 위해 여러 가지 패턴을 필요로 합니다. Spring Cloud는 자체 구현 및 타사 툴과의 통합을 통해 이러한 패턴에 대한 솔루션을 제공합니다. Spring Cloud의 주요 모듈에 대해 간략하게 설명했습니다.
'SW > Spring' 카테고리의 다른 글
온라인 뱅킹 애플리케이션을 위한 스프링 시큐리티 활용 가이드 (0) | 2024.05.01 |
---|---|
스프링 WebFlux를 사용하여 요청의 회복력을 높이는 방법: 재시도 기능 활용하기 (0) | 2024.04.20 |
Spring : Spring Cloud 개념, 정보, 설명 (0) | 2023.06.03 |
Spring Boot : 기본 프로젝트 세팅, 구조, 예제, 사이트 (0) | 2020.09.09 |
Spring Boot : 소개, 목표, 장단점 (0) | 2020.09.08 |