Spring Cloud란?
- 마이크로서비스의 개발, 배포, 운영에 필요한 아키텍처를 쉽게 구성할 수 있도록 지원하는 Spring Boot 기반의 프레임워크
- MSA 구성을 지원하는 Springboot 기반 Framework
- 분산/버전 관리, 서비스 등록 및 검색 기능, 라우팅, 서비스간 호출, 부하 분산, 회로 차단기, 분산 메시지 등의 기능을 사용할 수 있는 도구
- Cloud Native 프로그램 개발 지원
Spring Cloud Framework 구성도

Spring Cloud Service
1. 분산/버전 설정(Spring Cloud Config)
- 애플리케이션이 동작할 때 설정 파일을 읽어서 처리하는 것이 일반적
-> 개발, 운영 환경이 일치 요소를 충족시키기 위함
-> 설정 파일은 대부분 바이너리와 함께 배포되며 환경 혹은 실행 옵션으로 실제 값이 기재되어 있음
- 클라우드 환경에서 마이크로서비스를 지원할 경우, 환경 자체의 값들이 자유롭게 변경,처리될 수 있어야 함
-> 중앙 저장소에서 모든 설정값을 관리하고 개별 서비스는 설정값을 해당 저장소에 문의하여 가져와야 함
- Spring Cloud Config는 외부화된 구성(Config)에 대해 서버 및 클라이언트 측 지원 제공
- 기본적 설정은 key-value 쌍으로 되어 있고 필요시 암호화 가능

2. 서비스 등록 및 조회
- 기존 개발 환경에서는 특정 서비스가 다른 서비스를 호출해야 하는 경우, '어디에', '어떻게' 호출하는지 명확히 인지하고 있음
- 클라우드 환경에서는 호출 위치가 실시간으로 변하고, 호출 방식 또한 자유롭게 바뀔 수 있음
- '어디에' -> 서비스 등록 및 조회
- 각 서비스는 중앙 저장소에 자신의 정보와 제공하는 '서비스 이름'을 등록
- 서비스 내에서 다른 서비스를 호출할 때, '서비스 이름'으로 '어디에' 문의할지 정보를 가져와 호출
- '분산/버전 설정'과 유사
- 서비스 이름이 키가 되고, 호출 위치가 값이 됨
- 서비스 등록 및 조회 기능은 다양한 솔루션 지원
- Spring Cloud Netfilx(Eureka)
- Spring Cloud Consul(Hashicorp's Consul)
- Spring Cloud Zookeeper(Apache Zookeeper)
- 위 프로젝트에서 개별 솔루션과 연동을 지원
- 단순 키-값의 정보만 제공하는 것이 아님
- 복제, 고가용성 등의 다른 기능도 제공
3. 라우팅
- 특정 네트워크 내부에서 목적지를 찾아가는 과정을 의미
-> API Gateway
-> 다양한 네트워크를 사용하는 모듈 사이에서 중계와 필요한 변환 및 추가 처리 작업을 하는 모듈
-> API Gateway를 사용해 라우팅
->API Gateway는 외부에 노출하는 포인트를 하나로 만들어 관리가 편해지고 인증 혹은 SSL 처리를 담당하여 Gateway내부의 모듈을 더 간단하게 만들 수 있도록 지원
- 필요한 경우, 필터를 추가할 수 있음
- Spring Cloud는 Spring Cloud Netflix(Zuul)를 지원하고 내부 프로젝트인 Spring Cloud Gateway 또한 제공
4. 서비스 간 호출
- 마이크로 서비스 환경에서 서비스 간 호출은 매우 빈번히 발생
- API Gateway를 활용해 작업을 수행할 수 있지만 신뢰할 수 있는 내부망에서 SSL, 필터링 처리 등 불필요한 부하가 발생
- 이러한 호출은 일대일 호출과 일대다 호출로 구분
- 일대일 호출의 경우 직접 서비스 주소를 찾아서 호출하거나 ClientSide 부하분산 솔루션인 리본(Ribbon)을 활용하는 것이 일반적
- 일대다 호출의 경우, 분산 메시징 활용
- Spring Cloud는 Spring Cloud Netfilx(Ribbon) 지원
5. 부하 분산
- 클라우드 환경에서 동일한 서비스를 처리하는 인스턴스가 많음
- 이 중에서 적합한 인스턴스로 호출하는 것과 부하를 분산시키는 것이 중요
- API Gateway나 ClientSide 부하분산 솔루션은 다양한 알고리즘을 지원
- ex) Ribbon은 기본적으로 라운드 로빈 이외의 평균 응답시간을 기록해서 활용, 현재 연결된 서비스 수를 받아서 활용
- RIbbon 외에도 스프링은 클라이언트의 부하분산을 위한 모듈 제공
-> Spring Cloud LoadBalancer, Ribbon에서 발생했던 단점과 사용성 개선
6. 서킷 브레이커(Circuit Breakers)
- 위의 서비스들은 서비스 간 커뮤니케이션을 쉽고 빠르게 할 수 있는 방법
- 서킷 브레이커는 장애 발생 시 이를 회피하는 방법
- 동일한 서비스를 제공하는 여러 인스턴스 중 하나에서 장애가 발생한 경우, 해당 인스턴스에 계속 요청을 보내 Timeout까지 기다리는 것은 전체 시스템에 부하를 줌
- 장애가 발생한 인스턴스로 가는 요청을 '중단'시킬 필요 -> 서킷 브레이커의 역할
- Ribbon이나 Zuul 모두 위 기능을 갖추고 있음
※ 서킷 브레이커 패턴(Circuit Breaker Pattern)
- 성공 및 실패 요청 횟수를 센 다음, 에러 비율이 가정된 임계치를 넘으면 차단 발생 및 이후 실패 처리
-> 문제되는 부분(느린 부분)을 특정 호출을 감지하여 스레드를 소진하지 않고 빠르게 실패 시켜 버림(원격 자원 사용 부분 제거)
-> 다른 서비스에 영향을 미치지 않도록하기 위함
- 지정된 시간이 지나고 나면, 재요청 후 서킷은 정상처리 되도록 함
7. Global Locks, Leadership Election and Cluster State
- 클라우드 네이티브 환경에서 특정 리소스에 하나의 모듈만 접근해야 하는 경우 종종 발생
- 이떄 필요한 컷이 Global Lock
- 해당 리소스에 접근한 모듈이 잠금을 생성
- 접근한 모듈이 잠근 상태라면 대기
- 잠근 상태가 아니라면, 자신이 잠금
- 각각의 인스턴스가 개별로 동작하므로, 이런 잠금은 하나의 시스템이 아닌 전체를 대상으로 관리
- 특정 서비스 사이에서 Leader를 선출하고 관리
- 전체 시스템에서 하나의 키를 이용해 자금을 관리 가능
- 리더 서비스가 특정 키를 조회해 값이 없으면 조회한 모듈이 자신으로 값을 설정, 값이 있으면 해당 모듈이 리더
- 콘술(Consul)이나 주키퍼(Zookeeper) 모두 위 기능 제공
8. 분산 메시징
- 서비스 호출 단계에서 목표한 서비스를 찾아 호출하는 방식
- 클라우드 네이티브 애플리케이션에서 메시지를 이용하는 방식도 자주 사용됨
ex) 배달 서비스
고객의 주문이 완료되면?
- 고객에게 문자로 결과 전송
- 배달자에게도 같은 내용 전송
- 서비스 메인 모듈에도 전송
- 프로모션 담당 모듈에도 메시지 전송
- 메시지 큐(Message Queue)를 이용하거나 게시,구독 모델을 사용해 분산 메시징 지원
- 컨슈머 그룹(Consumer Group)을 활용해 중복 처리를 방지하거나, 파티셔닝(Partinioning) 기능 활용 가능
- Spring Cloud Stream은 RabbitMQ, Apache Kafka, Google PubSub 등의 제품과 연계하여 분산 메시징 지원
MSA 문제점 해결
| 문제점 | 해결책 | Spring Cloud |
| 다수의 필요한 서비스 찾기 | Service Discovery | Eureka |
| 다수의 서비스 인스턴스 중 하나 결정 | Client Side LoadBalancing | Ribbon |
| 개별적 서비스가 응답하지 않은 경우, 처리 | 결함 허용 | Circuit-breaker/Hystrix |
| 보안, 속도 제한과 같은 서비스 접근 | 서비스 보안 | OAuth2 |
| 다수의 서비스 간 커뮤니케이션 | Http/메시징 | Feign/Spring Cloud Stream |
| 서비스 간 ACID 달성 | CQRS | Conductor/Camel/.... |
'CS 스터디 > API GATEWAY' 카테고리의 다른 글
| API GATEWAY (0) | 2023.02.26 |
|---|