본문 바로가기
MSA/마스터링 스프링 클라우드

마스터링 스프링 클라우드 chap.1

by devwari 2019. 1. 9.

마스터링 스프링 클라우드 (by 피요트로 민코프스키/ 김민석 옮김)

- 스프링 클라우드를 활용한 마이크로서비스 아키텍처 기반 클라우드 네이티브 시스템 구축


01_마이크로서비스 소개 

1. 마이크로서비스의 장점

마이크로서비스는 IT 시스템 아키텍처 접근 방식 중 하나로, 비지니스 요구사항을 구현한 하나의 애플리케이션을 느슨하게 연결된 여러 애플리케이션으로 쪼개는 것을 말한다.

마이크로서비스는 크게 2가지 장점이 있다.

  • 소스 코드 규모가 상대적으로 작아서 프로젝트에 새로 참여하는 개발자가 이해하기 쉬움 + 코드 품질 유지도 쉬움
  • 분리에 용이함. 잘 설계됐다면 모든 마이크로서비스가 선택된 영역에 대해 책임을 짐

2. 스프링 프레임워크로 마이크로서비스 만들기

스프링 클라우드는 서비스 레지스트리와 컨피규레이션 서버, 서킷 브레이커, 블라우드 버스, OAuth2 패턴, API 게이트웨이와 같은 마이크로서비스 기반 아키텍처에서 사용되는 모든 검증된 패턴을 구현한다.


3. 클라우드 네이티브 개발

네이티브 클라우드 애플리케이션이란 단순히 클라우드로 이전한 프로그램이 아니라 클라우드 환경을 위해 잘 설계된 프로그램이다.


4. 마이크로서비스 아키텍처 배우기

시스템 내부에서 서비스 Y 대신 서비스 x와 통신하는지 알 필요가 없는 외부의 API 클라이언트에게 시스템의 복잡도를 숨긴다. 게이트웨이는 클라이언트의 모든 요청을 다양한 API 종단점으로 동적(서비스 디스커버리의 목록에 기반함)으로 전달한다. 

API 게이트웨이는 시스템으로의 진입점이기 때문에 중요한 데이터를 추적하거나 요청 메트릭을 수집하고 통계를 내기 위한 좋은 장소이다. 또한 시스템 내 애플리케이션이 유용하게 사용할 부가정보를 삽입하기 위해 요청 및 응답 헤더를 조작할 수도 있다.


5. 서비스 디스커버리의 필요성 이해하기

서비스 디스커버리는 컴퓨터 네트워크상의 디바이스가 제공하는 디바이스와 서비스를 자동으로 감지하는 서비스다.

마이크로서비스 기반 아키텍처의 경우, 이것은 필수 메커니즘이다. 모든 서비스는 시작 후 다른 서비스가 접근할 수 있는 하나의 중앙 장소에 자신을 등록한다. 등록 키는 전체 시스템에서 유일한 서비스이거나 유일한 식별자여야 하는데, 이름을 통해 서비스를 찾고 호출하기 위해서다. 모든 개별 키에는 할당된 값이 있고, 대부분의 경우 이 값은 서비스 네트워크 위치를 나타낸다.

서버 컨피규레이션 기능은 시스템 내 모든 컨피규레이션 파일을 중앙에서 관리할 수 있도록한다.


6. 서비스 간 통신

시스템의 신뢰성을 보장하려면 각 서비스가 여러 인스턴스로 운영된다. 같은 서비스의 여러 인스턴스는 들어오는 요청에 대해 부하 분산을 적용해야 한다. 우선, 부하 분산기는 대게 API 게이트웨이에 내장되어 있고, 이는 디스커버리 서버에 등록된 인스턴스 목록을 가져와야한다. 대개 유입되는 트래픽을 50:50으로 해서 모든 실행 중인 인스턴스에 분배하는 라운드 로빈(round-robin) 규칙을 적용한다.


7. 장애와 서킷 브레이커

시스템 아키텍처를 설계할 때 항상 장애에 대비해야한다. 대부분 장애의 발생 원인은 네트워크 또는 데이터베이스의 문제와 같이 관리의 범위를 벗어난다. 이러한 에러는 하나의 요청이 많은 후속 호출에서 처리되는 마이크로서비스 기반의 시스템에서 특히 심각할 수 있다. 가장 좋은 방법은 응답을 기다릴 때 네트워크 타임아웃을 활용하는 것이다. 한 서비스의 성능에 문제가 있으면 다른 서비스에 영향을 최소화하도록 노력해야 한다. 장시간 응답을 기다려서 스레드를 점유하게 하는 대신 에러 응답을 보내는 것이 낫다.

네트워크  타임아웃 문제에 대한 대표적인 해결책으로 서킷 브레이커 패턴(circuit breaker pattern)이 있다. 이 개념은 마이크로서비스의 접근 방식과 밀접하게 관련돼 있다. 성공 및 실패 요청의 횟수를 세어 에러의 비율이 가정된 임계치를 넘으면 차단이 발생하고 이후의 시도는 즉시 실패한다. 지정된 기간이 지난 후 API 클라이언트는 요청을 다시 시작하고 성공하면 서킷이 닫혀 정상화된다. 서비스마다 사용할 수 있는 다수의 인스턴스가 있고 그중 한 인스턴스가 다른 것보다 느리게 동작한다면 부하 분산 처리 시 그 인스턴스는 무시된다.

두번째로 네트워크 분리장애에 자주 사용되는 메커니즘은 폴백(fallback)이다. 이것은 요청이 실패했을 때 수행되는 로직이다. 예를 들어 서비스가 캐싱된 데이터나 기본값, 빈 결과 목록을 반환할 수 있다. 저자의 경우 캐싱된 데이터 또는 기본값을 반환하는 것보다 에러코드를 전파하는 것을 선호한다.


8. 요약

스프링 클라우드의 가장 큰 장점은 모든 패턴과 매커니즘을 지원한다는 것이다. 그리고 다른 프레임워크와 달리 안정적으로 구현된다.

'01_마이크로서비스 소개' 장에서 클라우드 네이티브 개발, 서비스 디스커버리, 분산 컨피규레이션, API 게이트웨이, 서킷 브레이커 패턴과 같은 마이크로 서비스 아키텍처와 관련된 가장 중요한 개념, 엔터프라이즈 애플리케이션의 개발에 있어 이러한 접근 방식의 장단점, 마이크로서비스와 관련된 주요 패턴 및 솔루션에 관해 설명했다.

마이크로서비스는 태생적으로 클라우드 네이티브다. 스프링 부트와 스프링 클라우드와 같은 프레임워크를 사용하면 클라우드 네이티브 개발을 가속할 수 있다. 클라우드 네이티브 개발로 이관하는 주요 동기는 품질은 유지하면서 애플리케이션의 구현 및 배포를 빠르게 하기 위함이다. 대부분의 경우 마이크로서비스가 이것을 달성하도록 도와주지만, 때에 따라 일체형 접근도 나쁜 선택은 아니다.

비록 마이크로서비스는 작고 독립적인 단위이기는 하지만 중앙에서 관리된다. 즉, 네트워크 위치, 컨피규레이션, 로깅 파일, 메트릭과 같은 정보는 중앙의 장소에 저장돼야한다. 이 책에서는 이 모든 기능을 제공하기 위한 다양한 형태의 도구와 솔루션을 상세히 다룬다. 스프링 클라우드 프로젝트는 이런 모든 것의 통합을 도와주도록 설계 되었고, 이 책은 스프링 클라우드가 제공하는 가장 중요한 통합 기능을 효과적으로 안내한다.