Medium

스프링 마이크로서비스와 사이드카 패턴

ppthejake 2023. 10. 19. 17:58

해당 포스트는 Meduim 의 아티클 "Spring Microservices and Sidecar Pattern" 을 번역한 내용이다.

[ 원문 ]

 

지난 몇 년 동안 마이크로 서비스는 소프트웨어 아키텍처의 선두에 있었습니다. 그 이유는 분명합니다. 마이크로 서비스는 모듈성, 확장성 및 전체 시스템에 영향을 주지 않고 개별 구성 요소를 유지 관리 및 배포할 수 있습니다. 마이크로 서비스 패턴을 Spring Boot와 같은 프레임워크와 Sidecar 같은 패턴을 결합하면 더욱 강력해 집니다. 이 글에서는 Spring 마이크로 서비스의 본질을 이해하고 Sidecar 패턴을 어떻게 보완하는지 알아보겠습니다.

Spring Microservices 소개

일반적으로 마이크로 서비스는 소프트웨어 디자인 패턴을 나타내며, 어플리케이션이 느슨하게 결합된 서비스의 모음으로 구성됩니다. 각 서비스는 특정 비즈니스 기능을 제공하며 독립적으로 개발, 배포 및 확장할 수 있습니다. 이 아키텍처 스타일은 모든 구성 요소가 하나의 대형 어플리케이션으로 묶이는 전통적인 모놀리식 디자인과 대조를 이룹니다. 

스프링 부트는 마이크로 서비스 세계에서 게임 체인저 역할을 한 스프링 프레임워크의 진화입니다. 마이크로 서비스 구축 시 스프링 부트가 제공하는 다양한 요소과 장점에 대해 알아보겠습니다.

  • Auto-Configuration을 통한 설정 간소화 : 이전에는 스프링 어플리케이션은 광범위한 XML 설정이 필요했습니다. 스프링 부트를 사용하면서 설정 구성이 현저히 줄었습니다. 스프링은 합리적인 기본값을 사용하고, 클래스패스에 있는 라이브러리에 기반한 자동 구성 옵션을 제공합니다. 예를 들어, 클래스패스에 데이터베이스 드라이버가 있다면 자동으로 DataSource 빈을 구성합니다. 
  • Embedded Web Servers를 통한 독립 실행 : 스프링 부트 이전에 스프링 어플리케이션을 배포한다는 것은 일반적으로 WAR 파일로 패키징하고 톰캣과 같은 어플리케이션 서버에 배포하는 것을 의미했습니다. 그러나 스프링 부트를 사용하면 웹서버(Tomcat, Jetty, Undertow 등)를 어플리케이션 내에 직접 포함시킬 수 있습니다. 이로써 개발자는 전동적인 'java -jar' 방식으로 어플리케이션을 독립적인 자바 어플리케이션으로 실행할 수 있습니다. 
  • Actuator :  스프링 부트의 뛰어난 기능 중 하나는 Actuator 모듈을 통한 프로덕션 준비 기능입니다. 이 모듈은 어플리케이션 모니터링, 메트릭스 수집, 트래픽 분석 및 간단한 관리 기능을 제공합니다. 이로써 어플리케이션을 프로덕션 준비 상태로 유지하기 위한 노력을 줄일 수 있습니다. 
  • Spring Cloud : 고급 마이크로서비스 패턴을 위하여 Spring Cloud 프로젝트는 분산 시스템의 일반적인 패턴에 대한 해결책을 제공하는 도구 모음을 제공합니다. 이에는 Service Discovery, 설정 관리, Circuit Breaker, 지능형 라우팅 등이 포함됩니다. 스프링 부트와 조합하면, 개발자들은 마이크로서비스 아키텍처에서 제기되는 대부분의 과제를 처리하기 위한 강력한 도구 모음을 사용할 수 있습니다. 
  • 모듈성 과 유연성 : 스프링 부트의 모듈 설계는 필요한 것만 포함시킨다는 것을 의미합니다. 예를 들어, 웹 어플리케이션을 구축하는 경우 웹 모듈을 포함시킬 수 있습니다. JPA 기반 데이터 저장소에 연결해야 하는 경우 JPA 모듈을 포함시킬 수 있습니다. 이를 통하여 어플리케이션을 가볍게 유지할 수 있습니다.
  • 풍부한 개발도구 : 스프링 부트는 개발자 경험을 향상시키기 위한 도구 모음을 제공합니다. Spring Boot DevTools 모듈은 자동 재시작, 라이브 리로드 및 구성을 제공합니다. 

스프링 부트의 마이크로서비스 접근 방식은 어플리케이션 개발과 배포에 민첩성, 확장성 및 운영 효율성을 제공하는 것입니다. Conventions over Configuration 방식과 기능 세트를 결합한 구성으로 개발자가 분산 시스템 개발에 일반적으로 연관된 복잡성에 갖히지 않고 마이크로서비스 세계로 빠져들기 쉽게 만들어줍니다.

Sidecar 패턴이란?

광범위한 마이크로서비스 패턴에서 사이드카 패턴은 중요한 위치를 차지합니다. 이 이름은 명확한 이미지를 떠올리게 합니다. 마치 오토바이의 사이드카가 오토바이와 함께 작동하여 추가 기능이나 공간을 제공하는 것처럼, 마이크로서비스의 사이드카 패턴은 메인 서비스와 함께 실행되어 운영을 보완하거나 향상시킵니다.

핵심 개념

사이드카 패턴의 핵심은 메인 어플리케이션의 핵심 기능은 변경하지 않고, 추가 책임을 부여하는 것 입니다. 이러한 디커플링을 통하여 메인 어플리케이션은 주요 역할에 집중하도록 보장하고, 사이드카는 기타 부수적인 작업을 처리합니다.

작동원리

  • Co-location: 사이드카와 메인 서비스는 동일한 생명주기를 공유합니다. 함께 시작되고 함께 중지되면 동일한 환경에서 실행됩니다. (Docker 혹은 Kubernetes와 같은 컨테이너 환경에서 동일한 컨테이너에서 실행됩니다)
  • Communication: 일반적으로 사이드카는 로컬 루프백 네트워크를 통해 메인 서비스와 통신하여 낮은 지연 시간과 높은 신뢰성을 보장합니다. 이로써 실시간 상호작용, 모니터링 또는 수정이 가능해집니다.

사용사례

  • 로깅 & 모니터링: 사이드카는 메인 어플리케이션으로부터 로그, 메트릭스 혹은 트레이스를 수집하여 중앙 모니터링 솔루션으로 전달할 수 있습니다.
  • 보안: 사이드카는 데이터의 암/복호화, 인증 토큰 처리 또는 보안 통신 관련(TLS 설정 및 유지관리)와 같은 작업을 담당할 수 있습니다.
  • 네트워킹: 사이드카는 네트워크 트래픽을 조절하여 속도 제한, 라우팅, 로드밸런싱 혹은 테스트를 위한 네트워크 오류처리 작업을 수행할 수 있습니다. 
  • 데이터 변환: 데이터를 다른 서비스로 보내거나 받기 전에 데이터를 변환해야 하는 상황에서(데이터 형식 변환), 사이드카는 데이터 변환기 역할을 수행할 수 있습니다.

사이드카 vs 라이브러리

왜 이러한 추가 기능을 처리하기 위해 메인 어플리케이션 내부의 라이브러리를 사용하지 않는 것일까요? 차이점은 디커플링 수준과 운영의 유연성에 있습니다. 사이드카를 사용하면 다음과 같은 이점이 있습니다. 

  1. 언어 중립성: 사이드카는 어떤 언어로도 작성할 수 있으므로 가장 적합한 도구를 적용할 수 있습니다. 메인 서비스의 언어나 런타임에 제약을 받지 않습니다. 
  2. 독립적인 확장성: 필요한 경우 사이드카는 메인 서비스와 독립적으로 확장할 수 있습니다.
  3. 버전관리 및 업그레이드: 메인 서비스를 건드리지 않고도 사이드카를 업데이트하거나 패치할 수 있으므로 유지 관리가 용이합니다.

사례

사이드카 패턴은 단순히 이론적인 것이 아니라, 수많은 어플리케이션에서 사용되고 있습니다. 대표적으로 Istio 서비스 메시에서 사용되는 Envoy 프록시입니다. 여기서 Envoy 는 사이드카 역할을 하며, 마이크로서비스간의 네트워크 통신을 관리하고 보안 정책을 시행하며 텔레메트리 데이터를 수집합니다.

사이드카 패턴은 핵심 로직을 수정하지 않고 메인 어플리케이션의 기능을 향상시키거나 확장하는 것입니다. 이러한 모듈식의 유연한 접근 방식은 어플리케이션이 발전함에 따라 아키텍처가 견고하고 유지 관리 및 확장성을 유지하게 해 줍니다.

Integration Sidecar with Spring Microservices

빠르게 진화하는 마이크로서비스 생태계에서 Integration 패턴은 중요한 역할을 합니다. 사이드카 패턴과 스프링 마이크로서비스의 통합은 시스템 모듈성을 유지하면서 향상된 기능을 달성하는데 있어 한 단계 더 나아감을 의미합니다.

Spring Cloud and Sidecar

Spring Cloud는 클라우드 네이티브 어플리케이션을 구축하는데 사용되는 다양한 도구를 포함하는 연합 프로젝트로, 스프링 부트 기반 마이크로서비스오 Sidecar 패턴을 통합하기 위한 최고 수준의 지원을 제공합니다. 

Spring Micorservices 와 사이드카를 통합하는 단계

  • Bootstrapping Sidecar Application: 먼저 Spring initializr 를 사용하여 스프링 부트 어플리케이션을 생성합니다. 이 어플리케이션은 사이드카 역할을 수행할 것입니다. 사이드카가 다루려는 횡단관심사항에 부합하는 디펜던시를 선택합니다. 예를 들어, 로깅을 위한 사이드카를 생성하고자 한다면 Spring Cloud Sleuth나 Zipkin 과 같은 종속성을 포함시킬 수 있습니다.
  • Configuration and Discovery: 사이드카는 메인 어플리케이션을 인식해야 하는 경우가 많으며 그 반대의 경우도 마찬가지 입니다. 중앙 집중식 설정관리를 위해 Spring Cloud Config를 활용하세요. 또한, Eureka 나 Consul 과 같은 서비스 검색 메커니즘을 사용하고 있다면, 메인 어플리케이션과 사이드카가 모두 스스로 등록되는지 확인하세요. 이렇게 하면 쉬운 검색 및 상호작용이 가능해 집니다.
  • Inter-service Communication: 사이드카와 메인 서비스는 근접한 위치에서 실행되기 때문에(예: 동일한 컨테이너), 일반적으로 localhost를 통해 통신합니다. Spring의 RestTemplate 혹은 최신 WebClient 를 사용하여 통신을 용이하게 할 수 있습니다. 로컬 엔드포인트를 가리키도록 구성하는 것을 잊지 마세요.

@Autowired
private RestTemplate restTemplate;

public void sendDataToSidecar(Object data) {
    restTemplate.postForEntity("http://localhost:sidecar-port/data", data, Void.class);
}
  • Actuator를 통한 모니터링 및 관리: 메인 어플리케이션과 사이드카가 모두 정상적으로 작동하는지 확인하기 위해 Spring Boot Actuator를 통합하세요. 이는 사이드카 설정에서 문제를 진단하려고 할때 유용할 수 있는 상태 확인, 메트릭스, 기타 모니터링 기능을 제공합니다. 
  • 배포 고려사항: 컨테이너 환경에서 사이드카를 이용하여 스프링 마이크로서비스를 배포할 때, Docker Compose 또는 Kubernetes와 같은 도구를 사용하세요. 특히, Pod 모델을 갖춘 Kubernetes는 이에 적합하며, 마이크로 서비스와 사이드카가 동일한 Pod 내에서 공존하고 동일한 네트워크 네임스페이스를 공유하도록 보장합니다.
  • 통합 테스트: 통합테스트를 철저하게 하는것이 중요합니다. Spring Cloud Contract 와 같은 도구는 여기에 유용합니다. 이를 통해 메인 서비스와 사이드카가 상호작용해야 하는 방식을 정의하고 이를 기반으로 자동으로 테스트를 생성할 수 있습니다.

Adapting to Evolving Needs

마이크로서비스 생태계가 성숙해짐에 따라 사이드카의 역할도 변화할 수 있습니다. 처음에는 로깅으로 시작했지만 이후에 속도 제한이나 캐싱과 같은 기능을 추가하고 싶을 수 있습니다. 스프링의 유연한 특성으로 인하여 사이드카 기능은 쉽게 확장하거나 수정할 수 있습니다. Spring Cloud Gateway와 같은 도구는 사이드카가 고급 라우팅, 필터링 또는 변환 로직을 처리해야 하는 경우에 특히 유용할 수 있습니다. 

스프링 마이크로서비스와 사이드카 패턴을 통합하는 작업은 복잡할 수 있지만, Spring Cloud가 제공하는 도구와 라이브러리로 인해 단순화 됩니다. 이러한 통합은 마이크로서비스가 강력하고, 확장 가능하며, 유지보수가 가능하도록 보장하며 끊임없이 발전하는 비즈니스 요구사항을 적절하게 대응할 수 있습니다.

사이드카 패턴과 함께 Spring 마이크로서비스를 사용할 때의 이점

스프링 마이크로서비스와 사이드카 패턴의 통합은 견고하고, 확장 가능하며, 효율적인 분산 어플리케이션을 위한 다양한 이점을 제공합니다. 이 통합의 주요 이점에 대해 살펴보겠습니다.

관심사항의 명확한 분리

  • 핵심 비즈니스 로직에 집중: 횡단 관심사항을 분리함으로써 마이크로서비스는 핵심 비즈니스 기능에 더 집중할 수 있습니다. 이로 인해 코드가 더 깔끔하고 가독성이 좋으며 유지보수가 쉬워집니다.
  • 표준화: 사이드카는 로깅, 모니터링, 보안과 같은 기능을 여러 마이크로서비스에 도입하는 표준화된 방법을 제공합니다. 이를 통해 일관된 구현 패턴을 보장하고 불일치 가능성을 줄입니다.

향상된 확장성

  • 독립적 향상: 사이드카 접근 방식의 큰 장점중 하나는 마이크로서비스와 독립적으로 사이드카를 확장할 수 있다는 것입니다. 특히, 로깅이나 캐싱과 같은 측면이 더 만흔 리소스를 필요로 하는 경우에 중요합니다.
  • 최적화된 리소스 활용: 사이드카를 사용하면 리소스를 적절한 곳에 할당하여 각 구성 요소가 필요한 만큼 사용 할 수 있습니다. 

개발 및 배포의 민첩성

  • 빠른 반복: 사이드카는 메인서비스와 디커플링 되어 있으므로 팀은 메인서비스에 영향을 미치지 않고 사이드카를 반복적으로 개선할 수 있습니다. 이러한 모듈성을 통해 빠른 개발 주기가 가능해지고 배포와 관련된 위험이 줄어듭니다. 
  • 언어 및 기술 중립성: 사이드카는 다른 언어로 개발되거나 메인 서비스와 다른 기술을 사용할 수 있으므로 작업에 최적화된 도구를 선택할 수 있는 유연성을 제공합니다. 

향상된 탄력성

  • 오류 격리: 사이드카에 문제가 발생하더라도 메인 서비스를 다운시킬 가능성이 적습니다. 이러한 오류 격리를 통해 문제확산의 범위를 줄이고 잠재적인 문제의 반경을 줄여줄 수 있습니다. 
  • 점진적 성능저하: 사이드카가 향상된 기능을 제공(예: 캐싱)하지만 핵심 기능에는 중요하지 않는 상황을 가정할 때, 사이드카에서 장애가 발생하더라도 메인 서비스에서 성능이 저하되더라도 계속 운영될 수 있습니다. 

유지보수의 용이성

  • 업그레이드의 단순화: 사이드카는 메인 서비스와 독립적으로 업데이트나 패치를 할 수 있으므로, 유지보수 절차가 더욱 간결해지고 다운타임을 줄일 수 있습니다. 
  • 일관된 로깅 및 모니터링: 표준화된 사이드카가 로그와 메트릭스를 처리하면 데이터 기록 및 보고 방식에 일관성이 생기므로 문제 진단이 간소화 됩니다. 

컨테이너 환경에서의 효율적인 리소스 활용

  • 공유 리소스: Kubernetes 와 같은 환경에서 배포될 때, 동일한 Pod의 사이드카와 메인 서비스가 특정 리소스를 공유하여 최적화된 활용이 가능해집니다. 
  • 네트워크 효율성: 사이드카와 관련된 마이크로서비스와 근접성을 고려하면 네트워크 지연 시간이 최소화되어 빠른 서비스 간 통신이 가능해집니다. 

스프링 마이크로서비스와 사이드카 패턴의 통합은 단순히 이론적인 모범 사례가 아니라 실질적인 이점을 가져다 줍니다. 보다 명확한 코드베이스와 빠른 개발 주기부터 견고한 오류 격리와 효율적인 리소스 활용에 이르기까지, 이러한 조합은 조직이 현대 소프트웨어 개발의 도전에 대비할 준비가 충분하다는 것을 보장합니다.

결론

스프링 마이크로서비스능 어플리케이션의 개발, 배포, 확장을 단순화 했습니다. 사이드카 패턴과 결합되면, 개발자는 핵심 비즈니스 로직을 혼동시키지 않으면서 횡단관심사항을 도입할 수 있습니다. 이 두가지 패턴은 소프트웨어 업계가 분산 시스템으로 계속 전환함에 따라 개발자가 탄력적이고 확장 가능하며 유지보수가 용이한 어플리케이션을 구축 할 수 있는 강력한 도구와 패턴을 마음대로 사용할 수 있도록 보장합니다.

  1. Spring Boot 공식 문서
  2. Netflix OSS를 Spring Boot와 통합하는 방법에 대한 문서
  3. 일반적으로 사이드카로 사용되는 Envoy 프록시 공식 사이트
  4.  Kubernetes 공식 문서