본문 바로가기

SpringFramework/Spring Cloud (스터디)

Spring Cloud - (3장) 스프링 클라우드 개요 + 주요 프로젝트

스프링 클라우드(Spring Cloud)

- 분산/버전관리, 서비스 등록 및 검색 가능, 라우팅, 서비스간 호출, 부하분산, 회로차단기, 분산메시지 등의 기능을 사용할 수 있는 도구.

(스프링 부트와 스프링클라우드 버전에 유의하여 사용해야 함)

12-팩터 앱(The Twelve-Factor App)

- 확장 가능하고 쉽게 클라우드 플랫폼에 배포할 수 있다

- 지속 배포 프로세스에 따라 배포되는 SaaS(Software as a Service)를 개발하는 방법론

- 스프링 부트 & 스프링 클라우드는 12-팩터 룰에 부합하는 애플리케이션 만드는 기능 & 요소 제공

 

(?) SaaS(Software as a Service란?

: 서비스 사업자가 인터넷을 통해 소프트웨어를 제공하고 사용자가 인터넷상에서 이에 원격 접속해 해당 소프트웨어를 활용하는 서비스 모델. (ERP, CRM, Slack 등..)

- 참고자료: https://medium.com/dtevangelist/12-factors-%EB%9E%80-b39c7ef1ed30

넷플릭스(Netflix) OSS

- 모놀리식 애플리케이션 기반 전통적 개발 모델에서 마이크로서비스 기반 개발 방식으로 전환한 선구자

- 많은 오픈소스가 존재하며, 유레카(Eureka), 히스트릭스(Hystrix), 리본(Ribbon), 줄(Zuul) 등과 스프링 클라우드와 통합되었다.

유레카

- 서비스 디스커버리

    -> 외부의 서비스들이 마이크로서비스를 검색하기 위해 사용되는 개념

    -> 클라이언트가 로드밸런서 or API Gateway를 전달하게 되면 서비스디스커버리에 전달되어 필요한 정보를 찾음

 

- 서비스 정보 및 위치정보 확인 등 (Naming Server)

 

- 클라이언트 & 서버로 구분

[클라이언트]

    -> 애플리케이션의 일부로 원격 디스커버리 서버에 연결하는 일을 담당

    -> 연결되면 서비스 이름 & 네트워크 위치를 담은 등록 메시지를 보냄

    -> 현재 마이크로서비스가 다른 마이크로서비스의 종단점을 호출해야 할 경우, 서버로부터 등록된 서비스 목록을 담은 최신의 컨피규레이션(설정정보)를 가져옴.

    -> 서버로부터 데이터를 가져와 캐싱하고 주기적으로 변경사항을 체크

    -> 유레카 서버가 멈추더라도 서비스들끼리 통신이 가능 (서비스 레지스트리를 로컬에 캐싱했기 때문)

 

[서버]

    -> 각 서비스들로부터 헬스체크 메시지를 받고, 메시지를 응답받지 못하면 레지스트리에서 서비스가 삭제된다.

    -> 독립적인 스프링 부트 애플리케이션으로 설정되고 실행된. 각 서버의 상태를 다른 서버에 복제해 가용성(=서비스 정상 사용 가능정도)이 높음

    -> 유레카 서버를 프로젝트에 포함하려면 spring-cloud-starter-eureka 스타터 사용

 

[서비스 아키텍처 구상]

히스트릭스(Hystrix)

- 서킷브레이커 패턴의 구현을 도와주는 라이브러리

- 폴백(fallback) 로직을 쉽게 구현이 가능

- spring-cloud-starter-hystricx 스타터 사용

 

(?) 서킷브레이커 패턴(Circuit Breaker Pattern)

: 성공 및 실패 요청 횟수를 센 다음, 에러 비율이 가정된 임계치를 넘으면 차단 발생 및 이후 실패처리를 진행.

    -> 문제되는 부분의 특정 호출(느린 응답 등)을 감지하여 스레드를 소진하지 않고 빠르게 실패처리(원격 자원 사용 부분 제거)

    -> 다른서비스에 영향 안가도록함 (지정된 시간이 지나고 나면, 재요청 후 서킷은 닫혀 정상처리가 되도록 함)

리본(Ribbon)

- 크라이언트 로드밸런서 역할을 해준다. 비동기 처리가 잘 되지 않아서 많이 사용하지는 않는다

- IP나 Port정보 없이 이름을 통해 호출이 가능하다

- 클라이언트 측 부하 분산기

- HTTP, UDP, TCP 등의 프로토콜 지원

- 동기방식의 REST 호출, 비동기, 리액티브 모델 지원

- 서비스 디스커버리, 캐싱, 일괄처리, 장애 내성과 통합 가능

- spring-cloud-starter-ribbon을 사용. (springboot 2.4 이후 Maintenance(업데이트X))

줄(Zuul)

- API 게이트웨이, API Service, Edge Service

- JVM 기반 라우터, 서버 측 부하 분산 or 일부 필터링 수행

- 인증, 부하 평균 분배, 정적 응답 처리, 부하 테스트 등에 사용

- 설정 가능 및 독립적 스프링 부트 애플리케이션으로 실행

- spring-cloud-starter-zuul을 사용. (springboot 2.4 이후 Maintenance(업데이트X))

페인(Feign)

- REST Client

- 웹 서비스 클라이언트를 수비게 작성하도록 도와줌

- spring-cloud-starter-feign 사용

- 리본 클라이언트와 통합돼 디스커버리 서비스와 통신, 부하분산 같은 기능 제공

분산 컨피규레이션 관리

- 설정정보 파일을 프로젝트 내부가 아닌, 외부에서 관리하는 것 (중앙화 된 저장소에서 구성 요소 관리)

- 각 서비스를 다시 빌드하지않고 바로 적용

- 서버는 단 하나의 중앙 장소, 애플리케이션을 위한 모든 외부 속성이 모든 환경에 대해 서버에서 관리됨

- 설정 파일은 파일 시스템 또는 서버 클래스 경로에 있을 수 있다. (Vault)

 

(?) Vault

: 토큰 및 패스워드 자격증명을 관리할 수 있는 오픈 소스 도구

해시코드(HashCorp)에서 제작, 자격 정보 등을 안전한 장소에 저장이 가능하여 보안이슈에 도움이 될 수 있다.

API를 통해 쉽게 접근 가능 (API는 기본 인증으로 보호됨)

키/공개 키 인증을 사용한 SSL 연결 설정도 할 수 있다

- spring-cloud-config-server 의존성 추가하여 활성화

컨설(Consul)

-넷플릭스 리본과 동적 라우터, 넷플릭스 줄의 필터를 지원

- spring-cloud-starter-consul-discovery 사용

아파치 주키퍼(Apache Zookeeper)

- 컨피규레이션과 이름을 유지하는 중앙 서비스로 분산 동기화, 그룹 서비스를 가능하게 함

- 분산 처리된 메시지 큐 정보들 관리, kafka 서버를 가동하려면 Zookeeper가 구동되어 있어야 함

- 클라이언트 측에 주키퍼를 사용한 서비스 디스커버리를 사용하려면 spring-cloud-starter-zookeeper-discovery, 아파치 큐레이터를 의존성에 포함

- 분산 컨피규레이션 클라이언트를 활성화 하기 위해서는 spring-cloud-starter-zookeeper-config 의존성을 추가 필요

분산추적

슬루스(Sleuth)

- 하나의 요청을 여러 마이크로서비스로 처리할 때 이어지는 요청을 연관지음

- Slf4j, MDC로 개발되었음

- spring-cloud-starter-sleuth 의존성 추가하여 활성화

 

(?) MDC (Mapped Diagnostic Context)

: 다양한 소스의 로그 출력을 구분하고 실제 범위에 없던 부가 정보를 추가하는 솔루션

메세징

버스(bus)

- 분산시스템의 노드(마이크로서비스)를 경량 메세지 브로커(RabbitMQ)와 연결

- 상태 및 구성에 대한 변경사항을 연결된 노드에게 전달 (마이크로 서비스에게 변경사항을 알려줌)

- 컨피규레이션 변경 이벤트의 전달 등 공통 오퍼레이션을 위한 분산 메세징 기능을 사용할 수 있다.

스트림(Stream)

- 메세지 중심 마이크로 서비스로 구성된 시세틈을 개발하기 위한 올바른 프레임워크

- 두 개의 바인더가 존재 (AMQP, Apache Kafka)

- 스프링 인테그레이션에 기반. 종단점, 채널, 애그리게이터, 트랜스포머와 같은 대부분의 엔터프라이즈 통합 패턴을 지원하는 프로그래밍 모델을 제공

- 마이크로시스템 내의 애플리케이션은 스프링 클라우드 스트림 입력 & 출력 채널을 통해 통신함

- 구독/게시 등 메세지 공유 토픽을 통해 전파. (웹소켓 통신방식 같은건가)

 

(?) AMQP (Advanced Message Queue Protocol)

: 메세징 프로토콜 기반, HTTP 프로토콜과 달리 네트워크 프로토콜의 정의 뿐 아니라 서버 측 서비스와 동작 방식도 정의함.

 

그밖에..

- 클라우드 플랫폼 지원

- 보안관리 활성화

- 릴리즈 트레인

등.. 스프링 클라우드와 관련된 여러가지 개념 및 기술들이 많이 있다.

참고자료

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

= https://mungmange.tistory.com/147

= https://spring.io/projects/spring-cloud