Post

스프링 클라우드 소개

8. 스프링 클라우드 소개

스프링 클라우드의 진화

  • 하시코프 컨설과 아파치 주키퍼 기반의 서비스 검색 및 구성 중앙화
  • 스프링 클라우드 스트림을 사용한 이벤트 기반 마이크로서비스

대체 방안

넷플릭스 히스트릭스 -> Resillence4j

넷플릭스 히스트릭스 대시보드/넷플릭스 터빈 -> 마이크로미터 및 모니터링 시스템

넷플릭스 리본 -> 스프링 클라우드 로드 밸런서

넷플릭스 주울 -> 스프링 클라우드 게이트웨이

넷플릭스 유레카를 검색 서비스로 사용

기존 마이크로서비스와 해당 인스턴스를 찾고자 검색 서비스를 사용

스프링 클라우드가 지원하는 첫 번째 검색서비스느 넷플릭스 유레카

스프링 클라우드 게이트웨이를 에지 서버로 사용

마이크로서비스 환경을 보호하기 위해 사용

사설 서비스를 외부에서 접근하지 못하도록 숨기고 외부 클라이언트가 공개 서비스를 사용할 때 보호

스프링 클라우드 게이트웨이가 제공하는 주요 지원 기능은 URL 경로 기반 라우팅과 OAuth 2.0, OIDC에 기반한 엔드포인트 보호

스프링 클라우드 게이트웨이는 스프링5와 프로젝트 리액터, 스프링 부트2 기반의 논블로킹 API를 사용함

구성 중앙화를 위해 스프링 클라우드 컨피그 사용

마이크로서비스 환경의 구성 정보를 중앙집중식으로 관리

  • 깃 저장소
  • 로컬 파일 시스템
  • 하시코프 볼트
  • JDBC 데이터베이스

스프링 클라우드 컨피그를 사용하면 계층 구조로 구성을 관리 가능

스프링 클라우드 컨피그는 구성 변경을 감지하며, 스프링 클라우드 버스를 사용해 영향받는 마이크로서비스로 알림을 보내는 기능도 지원

  1. 마이크로서비스는 컨피그 서버에 구성을 요청하면서 시작
  2. 컨피그 서버는 깃 저장소에서 구성을 가져옴
  3. 깃 저장소에 깃 커밋이 푸시되면 컨피그 서버에 알림을 보내도록 깃 저장소를 구성
  4. 컨피그 서버는 스프링 클라우드 버스를 사용해 변경 이벤트를 게시

스프링 클라우드 컨피그는 자격 증명과 같은 민감한 구성 정보의 암호화도 지원

탄력성 향상을 위해 Resillence4j 사용

장애가 있는 게 당연하다고 간주하고, 장애를 처리할 수 있도록 시스템 환경을 설계해야 함

Resillence4j는 오픈 소스 기반 내결함성 라이브러리

다음과 같은 내결함성 매커니즘 내장

  • 서킷 브레이커: 원격 서비스가 응답하지 않을 경우에 발생하는 연쇄 장애를 방지하고자 사용
  • 비율 제한기(rate limiter): 지정한 시간 동안의 서비스 요청 수를 제한하고자 사용
  • 격벽(bulkhead): 서비스에 대한 동시 요청 수를 제한하고자 사용
  • 재시도: 때때로 발생하는 임의의 오류를 처리하고자 사용
  • 시간 초과(timeout): 오랫동안 느리거나 응답이 없는 서비스의 응답을 기다리지 않고 사용

상태 다이어그램

  1. 서킷 브레이커가 닫힘 상태에서 시작해 요청을 처리
  2. 요청이 성공적으로 처리되는 한 닫힘 상태를 유지
  3. 요청에 실패하면 카운터 값이 증가
  4. 설정한 실패 임계값에 도달하면 서킷 브레이커가 트립 -> 추가 요청을 처리할 수 없는 열림 상태가 됨
  5. 요청은 빠르게 실패 -> 예외 반환
  6. 설정한 시간이 지나면 서킷 브레이커가 반열림 상태로 전환되며, 프로브 요청을 하나 보내서 장애가 해결됐는지 확인
  7. 프로브 요청이 실패하면 다시 열림 상태로 돌아감
  8. 프로브 요청이 성공하면 서킷 브레이커는 닫힘 상태로 초기화됨

Resillence4j를 사용한 서킷 브레이커 샘플

Resillence4j와 함께 스프링 부트를 사용하면 스프링 부트 액추에이터의 health 엔드포인트를 사용해 마이크로서비스의 서킷 브레이커 상태를 모니터링 가능

스프링 클라우드 슬루스와 집킨을 사용한 분산 추적

분산 시스템에서 발생하는 상황을 파악하려면 시스템 환경에 대한 외부 호출을 처리하는 과정에서 마이크로서비스 사이를 오가는 요청 및 메시지의 흐름을 추적하고 시각화할 수 있어야 한다

스프링 클라우드 슬루스는 상관 ID를 사용해 하나의 처리 흐름에 포함된 요청과 메시지/이벤트에 표시를 남긴다.

또한 하나의 처리 흐름에서 나오는 여러 마이크로서비스의 로그 메시지를 쉽게 추적할 수 있도록 로그 메시지에 상관 ID를 덧붙인다.

스프링 클라우드 슬루스는 추적 데이터를 저장 및 시각화하고자 분산 추적 시스템인 집킨으로 보낸다

스프링 클라우드 슬루스와 집킨이 분산 추적 정보를 처리하고지 사용하는 인프라는 구글 대퍼를 기반으로 함

대퍼에서는 전체 워크 플로의 추적 정보를 추적 트리(trace tree)라고 하며, 기본 작업 단위와 같은 트리의 서브파트를 스팬(span)이라고 한다.

스팬은 추적 트리를 형성하는 하위 스팬으로 구성된다.

스프링 클라우드 슬루스는 HTTP를 이용한 동기 요청이나 RabbitMQ 및 카프카를 사용한 비동기 요청을 집킨으로 보낸다

참고

  • 마이크로서비스(http://www.acornpub.co.kr/book/microservices-spring)
This post is licensed under CC BY 4.0 by the author.