본문 바로가기

CS 스터디/API GATEWAY

Spring Cloud

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