Java로 MSA를 구축하기 위한 방법

9north·2024년 9월 29일

유명 서비스 기업들이 앞다투어 사용하는 아키텍처가 MSA다. 프로젝트에서도 이를 다루면 좋을 것 같아 학습하려 한다. MSA란 무엇인지 다른 아키텍처와 비교해 알아보고, Java로 구축하려면 무엇이 필요한지 살펴보자.

MSA의 정의

MSA(Micro Service Architecture)란, 독립적인 서비스들의 모음이 경량화 API를 통해 통신하는 애플리케이션 아키텍처의 한 유형이다. 하나의 애플리케이션 내에 있는 각 핵심 기능이 독립적으로 존재하게끔 소프트웨어를 구축하는 클라우드 네이티브 접근 방식이다.

분리는 협력을 이끈다. 개발팀과 운영팀은 분리된 애플리케이션을 통해, 서로 방해되지 않게 협력할 수 있다. 따라서 동일한 애플리케이션 개발에 더 많은 개발자들이 동시 참여할 수 있어, 개발에 소요되는 시간을 단축할 수 있다.

MA VS MSA

MA(Monolithic Architecture, 모놀로식 아키텍처)는 전통적인 애플리케이션 빌드 방식으로, 애플리케이션 내의 모든 기능과 서비스가 맞물려 단일 유닛으로 운영되는 방식이다.

MA에서는 애플리케이션이 추가되거나 개선될 경우 아키텍처는 복잡해지며, 하나의 프로세스가 확장되기 위해서는 전체 애플리케이션도 확장되어야 했다.
MSA에서는 각 핵심 기능이 독립적으로 작동하게끔 빌드된다. 따라서 모든 애플리케이션을 중단하지 않고 부분 구축 및 업데이트가 가능하다.

SOA VS MSA

SOA(Service Oriented Architecture, 서비스 지향 아키텍처)는 네트워크에서 공통의 통신 언어를 사용하는 서비스 인터페이스를 활용하여 소프트웨어 구성 요소를 다시 사용할 수 있게 만드는 소프트웨어 설계 유형이다.

MSA는 SOA가 진화한 형태이다. 크고 복잡한 애플리케이션을 작업하기 쉬운 작은 구성요소로 세분화한다는 점이 유사하다. 그러나 SOA가 전사적인 아키텍처 접근 방식이라 레거시 인프라, 즉 표준 네트워크 프로토콜을 이용하는 반면, MSA는 애플리케이션 개발 팀의 구현 전략이므로 쿠버네티스 등을 사용한다.

MSA의 장점

더 빠른 출시

  • 개발 주기 단축

높은 확장성

  • 필요에 따라 특정 서비스를 여러 서버와 인프라에 배포 가능

뛰어난 복구 능력

  • 한 부분에 장애 생겨도 전체가 중단되지 않음

손쉬운 배포

  • 모듈화되고 규모가 작아져서 배포에 용이

편리한 액세스

  • 세분화했기에, 부분별 업데이트 및 개선 용이

향상된 개방성

  • 다중 언어 지원 API 사용

MSA의 향후 과제

확장

수동으로 배포하기엔 너무 복잡하기에 자동화를 진행해야 한다. 초기에는 시간을 들여 서비스 간의 종속성을 파악해야 역호환성을 감소할 수 있다.

로그

모든 로그를 한 곳에 모으는 과정이 필요하다.

모니터링

모든 문제를 중앙에서 모니터링하여야 한다.

디버깅

로컬 환경에서만이 아니라, 외부 조건을 모두 고려해야 한다.

연결성

중앙집중식 또는 통합형 여부에 관계 없이 서비스 검색을 고려해야 한다.

Java에서 MSA를 적용하기 위한 단계

1. 서비스 경계 정의

  • 비즈니스 영역을 신중히 분석
  • 전체 구성 요소 식별
  • 요소별 상호 작용 정의
  • 캡슐화하여 모듈 간의 높은 응집력과 낮은 결합 보장
  • DDD(Domain-Driven Design) 등의 도구 사용

2. 적절한 도구 및 프레임워크 선택

  • SpringBoot로 포괄적 개발
  • 도커, 쿠버네티스 등의 컨테이너화 기술 사용
  • 도커로 가볍고 이식 가능한 배포 단위 제공
  • 쿠버네티스로 CI/CD 자동화

3. 서비스 간 통신 설정

RESTful API, 비동기 메시지 큐 및 이벤트 기반 아키텍처와 같은 다양한 통신 패턴 사용

4. 확장성 및 내결함성 보장

  • 고가용성 유지, 수평성 확장성 보장
  • Netflix/Hystrix 및 resilience4j 라이브러리로 내결함성 매커니즘 패턴 구현
  • Redis, Memcached로 분산 캐싱 적용
  • 데이터베이스 파티셔닝 기술 사용

5. 지속적인 통합 및 배포 (CI/CD)

  • 빠르고 안정적인 소프트웨어 제공을 달성하려면 빌드, 테스트 및 배포 프로세스를 자동화하는 강력한 CI/CD 파이프라인이 필요
  • Jenkins, GitLab CI 및 CircleCI로 자동화
  • Docker Hub, Amazon ECR로 배포 간소화
  • 도커로 컨테이너 패키징
  • AWS ECS, Azure Kubernetes Service, Google Kubernetes Engine(GKE)로 쿠버네티스 제품을 적용해 MSA 구현

참고 자료

자바를 사용해 복원력 있는 MSA를 구축하는 법

마이크로서비스란

profile
FE / JAVA 개발자

0개의 댓글