코딩공작소

MSA(1) - 스프링, 클라우드와 만나다 본문

어플리케이션개발/MSA

MSA(1) - 스프링, 클라우드와 만나다

안잡아모찌 2024. 5. 23. 10:33
마이크로서비스 아키텍쳐의 이해
기업에서 마이크로서비스를 사용하는 이유
마이크로서비스 구축을 위한 스프링, 스프링 부트, 스프링 클라우드
클라우드와 클라우드 기반 컴퓨팅 모델의 이해

 

마이크로서비스란 ?

 - 작고 느슨하게 결합된 분산 서비스 : 분해 와 분리가 핵심

 

 

왜 마이크로서비스를 사용해야 할까?

  • 복잡성의 증가
  • 제품 기능 분리를 통한 새로운 기능의 릴리즈 일시 조정
  • 안정성과 확장성
  • 회복성

 

애플리케이션을 분리하게 되면?

  • 유연성 : 새로운 기능을 신속하게 제공하며 복잡성이 낮아지고 테스트 및 배포 시간 단축
  • 회복성 : 애플케이션의 전체 장애 예방
  • 확장성 : 국지적 확장 가능 및 비용효율 증대

 

 

스프링 마이크로서비스

스프링 부트 + 스프링 클라우드

  • 개발 시간 단축, 효율성과 생산성 향상
  • 웹 애플리케이션 실행을 위한 내장형 HTTP 서버 제공
  • 많은 사용구 코드 작성 회피
  • 스프링 데이터, 스프링 시큐리티, 스프링 클라우드 같은 스프링 생테계와 통합 용이
  • 다양한 개발 플러그인 제공

 

 

정리하는 교재에서 구축하고자 하는 서비스 개요

  1. 요청 시작 --> 액세스 토큰 획득을 위한 키클록 인증
  2. API 게이트 웨이 요청 : API 게이트 웨이는 전체 아키텍처에 대한 진입점
  3. 조직 서비스에서 액세스 토큰 유효성 검증 후 DB 정보 갱신/조회 --> HTTP 응답
  4. 그 뒤에는 수많은 후작업이 존재

 

 


스프링 부트를 사용한 마이크로서비스 구현 --> 클라우드 환경에서 마이크로서비스 기반 애플리케이션 적용

 

그렇다면, 들어가기에 앞서 클라우드 컴퓨팅이란 정확히 무엇인가?

가상화된 IT서비스를 제공하는 것

  • IaaS(Infrastructure as a Service) : 컴퓨팅 자원에 접근할 수 있는 인프라스트럭처 제공 (AWS EC2, Azure Virtual Machines, Google Compute Engine...)
  • Caas(Container as a Service) : IaaS와 PaaS의 중간 모델, 컨테이너 기반 가상화된 형태 (GKE, ECS ...)
  • Paas(Platfrom as a Service) : 개발, 싱행, 유지 관리에 집중할 수 있는 플랫폼과 환경 제공 (AWS Elastic Beanstalk)
  • FaaS(Function as a Service) : 서비리스 아키텍처 (AWS lambda ...)
  • SaaS(Software as Service) : 주문 형 소프트웨어로 대부분 웹 브라우저를 통해 사용

 

 

그렇다면 왜 클라우드와 마이크로서비스 인가?

  • 간소화된 인프라스트럭처 관리
  • 대규모 수평 확장성
  • 지리적 분산을 이용한 높은 중복성

즉, 탄력성 개념을 기반에 둔다.

 

 

마이크로서비스 작성 지침

  • 적정 규모 : 적절한 서비스 크기를 유지해야 한다
  • 위치 투명성 : 다수의 서비스 인스턴스가 빠르게 시작하고 종료될 수 있어야 한다.
  • 회복성 : 전반적인 무결성을 보호해야 한다.
  • 반복성 : 인스턴스 간 동일한 구성과 코드베이스를 보장
  • 확장성 : 확장할 수 있도록 종속 관게 최소화하는 통신 방식을 구축

 

 


핵심 마이크로서비스 개발 패턴

 

  • 서비스 세분성 : 너무 크면 관리가 힘들고, 너무 세분하면 복잡성이 증가
  • 통신 프로토콜 : 동기 프로토콜(XML, JSON ..) HTTP기반 REST or 비동기(래빗MQ, 카프카 등 메세지 브로커)
  • 인터페이스 설계
  • 서비스 구성 관리
  • 서비스간 이벤트 처리

 

 

서비스 라우팅 패턴

요청을 받고 애플리케이션을 실행하기 위해서는 많은 마이크로서비스가 실행 될 수 있다. 그렇다면 서비스를 호출하는 단일 진입점이 필요하다. 여기에 2가지 패턴이 있다.

  • 디스커버리 : 서비스를 탐색 가능하여 호출한다. 이는 내부 서비스이며, 서비스 간 통신 인프라스트럭처를 사용한다.
  • 서비스 라우팅 : API 게이트웨이를 사용하면 모든 서비스에 대한 단일 진입점을 제공하여 일관된 보안 정책과 라우팅 규칙을 적용할 수 있다.

 

서비스 디스커버리와 서비스 라우팅은 모든 대규모 마이크로서비스 애플리케이션에서 핵심 부분이다 !!!

 

 

 

클라이언트 회복성

마이크로서비스에서는 문제가 연쇄적으로 소비자에게 전파되는 것을 막는 것에 매우 신중해야 한다.

  • 클라이언트 부하 분산 : 호출이 정상 인스턴스에 분산되도록 인스턴스 위치를 캐싱하는 방법
  • 회로 차단기 패턴 : 실패 중이거나 성능 문제를 겪는 서비스를 반복 호출되지 않도록 차단
  • 풀백 패턴 : 다른 수단으로 서비스 클라이언트가 작업을 수행하도록 플러그인 메커니즘을 제공
  • 벌크헤드 패턴 : 한 서비스의 오작동 호출이 다른 곳에 영향을 미치지 않도록 호출을 격리하는 방법

 

 

 

마이크로 서비스 보안 패턴

적절한 자격 증명을 가진 요청만 서비스를 호출할 수 있도록 보안 패턴을 아키텍쳐에 적용해야 한다.

  • 인증 : 클라이언트가 누구인지 확인하는 방법
  • 인가 : 수행 자격 여부 확인하는 방법
  • 자격 증명 관리와 전파 : 한 트랜잭션에서 여러 서비스를 호출할 때 전파하는 것. 사용자를 인증 및 인가하고자 서비스 호출 간 전달되는 토큰(OAuth2, JWT)

 

 

 

 

로깅과 추적 패턴

마이크로 서비스 아키텍쳐의 단점은 수 많은 서비스가 호출 되기때문에 문제를 디버깅하고 추적 및 모니터링하기가 어렵다.
즉, 분산 추적을 달성하는 세 가지 핵심 로깅 및 추적 패턴이 있다.

  • 로그 상관관계 : ID를 부여해 한 트랜잭션 내 고유 식별자로 추적한다.
  • 로그 수집 : 모든 로그를 질의 가능한 단일 DB로 수집하고 트랜잭션 내 서비스 성능 특성을 이해할 수 있다.
  • 마이크로서비스 추적 : 모든 서비스 간 클라이언트 트랜잭션 흐름을 시각화하고 성능 특성을 확인

 

 

 

지표 패턴

  • 지표 : 어플리케이션 상태에 대해 중요한 정보를 생성하고 지표로 노출
  • 지표 서비스 : 지표를 저장하고 질의하는 곳
  • 지표 시각화 제품군 : 애플리케이션과 인프라스트럭처에 대한 비즈니와 연관된 시계열 데이터시각화

지표 모니터링은 마이크로서비스 아키텍처에 필수적이며, 높은 분산성으로 인해 모니터링 요구 사항이 모놀리식 구조보다 더 높은 경향이 있다.