본문 바로가기

SpringFramework/Spring Cloud (스터디)

Spring Cloud - (1장) 마이크로서비스를 위한 스프링 & 소개

마이크로서비스란?

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

 

그래서.. 마이크로서비스의 장점은?

1] 대규모의 복잡한 애플리케이션을 지속해서 배포하는 능력이 있다.

2] 소스 코드 규모가 상대적으로 작아서 프로젝트에 새로 참여하는 개발자가 이해하기 쉽다.

3] 분리. 복잡한 엔터프라이즈 시스템을 대룰 때 서브시스템에 따라 시스템을 나누는데 계속 하위 시스템을 만들다보면 개발자가 조직에 새로운 들어온 직원인 경우에는 더욱 이해하기 어려워지는 문제를 해결할 수 있다.

 

이전까지는 마이크로 서비스 환경을 지원하는 안정적인 프레임워크가 많지 않았는데, 스프링 클라우드에서는

- 서비스 레지스트리

- 컨피규레이션 서버

- 서킷 브레이커

- 클라우드 버스

- OAuth2 패턴

- API 게이트웨이

와 같이 마이크로 서비스 기반 아키텍처에서 사용되는 모든 검증된 패턴을 구현하였다.

 

모놀리식 애플리케이션 VS 마이크로서비스 아키텍처

- 고객 객체는 활성화된 고객의 목록을 저장하고 조회한다

- 모든 고객은 계정 객체에 의해 운영되는 하나 이상의 계정을 가질 수 있다.

- 이체 객체는 시스템 내 계정 간의 자금 이체를 담당한다.

- 제품 객체는 고객에게 할당된 예금이나 신용과 같은 정보의 저장을 담당한다.

=> 클라이언트에서 호출하는 API는 하나의 모놀리식 애플리케이션 영역에서 모두수행하는 특징이 있다.

 

그리고 아래는 위의 모놀리식 서비스를 마이크로 서비스로 분리를 진행하였다.

 

데이터베이스는 여전히 관계형 데이터베이스일 수도 있고, NoSQL 데이터베이스일 수도 있다. 이렇게 분리를 하였을때 시스템의 복잡도는 높아지게 되지만, 클라이언트에서는 그 내용을 알 수 없다. (알 필요도 없을듯)

그리고 내용중 API 게이트웨이라는 영역이 있는데, API 게이트웨이는 특정 서비스 호출을 숨기거나 동적 라우팅 기능도 하지만, 시스템의 진입점이기 때문에 중요한 데이터를 추적하거나 요청 메트릭을 수집하고 통계를 내기 위한 좋은 장소가 될 수 있다. 또한 애플리케이션이 유용하게 사용할 부가정보를 삽입하기 위해 요청 및 응답 헤더를 조작할 수 있다.

 

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

위의 그림중 마이크로서비스 아키텍처를 보면 시스템은 API 게이트웨이 뒤로 숨겼기 때문에 외부에서 보면 전과 같아보인다고 했었다. 이는 각 마이크로서비스가 상대방의 네트워크 주소정보를 유지해야 한다는 뜻이기도 하다. 이러한 컨피규레이션 정보를 유지하는 것은 매우 성가신 문제가 될 수 있는데, 이때 서비스 디스커버리를 통해 컴퓨터 네트워크상의 디바이스가 제공하는 디바이스와 서비스를 자동으로 감지해줄 수 있으며, 모든 서비스는 시작 후 다른 서비스가 접근할 수 있는 하나의 중앙 장소에 자신을 등록을 함으로써 서비스 정보를 유지시켜줄 수 있다.

최초 출시하였을때는, 서비스규모가 상대적으로 작은 상태로 시작을 하겠지만 점점 서비스가 커지면서 각각 서비스들을 일일이 제어하기에는 부담스럽기 때문에 이때 서비스 디스커버리라는 개념을 도입하여 관리 및 서비스간 상호작용을 할 수 있도록 관리를 해줄 수 있다.

 

(서비스 디스커버리에 대한 자세한 내용은 관련 주제로 따로 정리를 진행한다)

 

장애와 서킷 브레이커

API 게이트웨이, 컨피규레이션 서버, 서비스 디스커버리와 같은 메커니즘들은 신뢰성이 높고 효율적인 시스템을 구성하도록 도와주는 주요요소이다. 하지만 이런 서비스들도 장애에는 항상 대비해주어야 한다. 그리고 마이크로서비스 아키텍처에서는 하나의 마이크로서비스가 장애가 발생하는경우, 유기적으로 장애에 영향을 받아서 전체 장애로도 이어질 수 있을 가능성이 있다. 이때 사용되는 개념이 서킷 브레이커 개념이고, 가장 좋은 방법중의 하나는 네트워크 타임아웃을 활용하는 것이다.

 

네트워크 타임아웃 문제에 대한 해결책

1] 서킷 브레이커 패턴

: 성공 및 실패 요청의 횟수를 셈, 에러의 비율이 가정된 임계치를 넘으면 차단이 발생하고 이후의 시도는 즉시 실패함

2] 폴백(fallback)

: 요청이 실패 했을때 수행되는 로직

(예를들어 서비스가 캐싱된 데이터나 기본값, 빈 결과 등의 목록을 반환하는 등)

 

(서킷 브레이커에 대한 자세한 내용은 관련 주제로 따로 정리를 진행한다)

참고자료

= 서적 - 마스터링 스프링 클라우드 제 1장

= https://iscreen.notion.site/1-92d842c8bf5244e3a2c253f0660fa33b