스프링 클라우드(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
'SpringFramework > Spring Cloud (스터디)' 카테고리의 다른 글
Spring Cloud - (6장) 마이크로서비스 간의 커뮤니케이션 (0) | 2022.04.30 |
---|---|
Spring Cloud - (5장) 컨피그를 사용한 분산 컨피규레이션 (0) | 2022.04.17 |
Spring Cloud - (4장) 서비스 디스커버리 (0) | 2022.04.17 |
Spring Cloud - (1장) 마이크로서비스를 위한 스프링 & 소개 (0) | 2022.04.04 |