SpringCloud

[Spring Cloud로 개발하는 마이크로서비스 애플리케이션] 2. Spring Cloud란?

nineDeveloper 2021. 8. 1.
728x90

Spring Cloud란?

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

Spring Cloud 란 Microservices 의 개발, 빌드, 배포, 운영에 필요한 아키텍처를
쉽게 구성할 수 있게 도와주는 Spring Boot 기반 프레임워크 이다


Spring Cloud 현제 최신 버전 (2020.0.x aka Ilford)

2020.0.x aka Ilford 에서 지원되는 서비스

  • Spring Cloud Cloudfoundry
  • Spring Cloud Config
    • 분산 시스템에서 외부화된 구성을 위한 서버 및 클라이언트 측 지원을 제공
  • Spring Cloud Contract
    • 사용자가 소비자 주도 계약 접근 방식을 성공적으로 구현하는 데 도움이 되는 솔루션을 보유한 포괄적인 프로젝트
    • Spring Cloud Contract Verifier 프로젝트로 구성
  • Spring Cloud Consul
    • Spring 환경 및 기타 Spring 프로그래밍 모델 관용구에 대한 자동 구성 및 바인딩을 통해 Spring Boot 앱에 대한 Consul 통합을 제공
  • Spring Cloud Gateway
    • API로 라우팅하는 간단하면서도 효과적인 방법을 제공하고 보안, 모니터링/메트릭 및 탄력성과 같은 교차 문제를 API에 제공
  • Spring Cloud Netflix
    • Spring 환경 및 기타 Spring 프로그래밍 모델 관용구에 대한 자동 구성 및 바인딩을 통해 Spring Boot 앱을 위한 Netflix OSS 통합을 제공
  • Spring Cloud Vault
    • Vault에서 secrets을 검색하고 원격 속성 소스로 Spring 환경을 초기화
    • SSL로 보안된 secrets
    • MySQL, PostgreSQL, Apache Cassandra, MongoDB, Consul, AWS 및 RabbitMQ 에 대한 자격 증명을 생성
    • Token, AppId, AppRole, Client Certificate, Cubbyhole, AWS EC2 및 IAM, Kubernetes 인증
    • Bootstrap application context: 모든 작업을 수행하도록 훈련할 수 있는 기본 애플리케이션의 상위 컨텍스트
    • Spring Cloud Vault Connector를 통해 HashiCorp의 Vault 서비스 브로커 를 사용한 Cloud Foundry 통합
  • Spring Cloud Kubernetes
    • 개발자가 Kubernetes에서 Spring Cloud 애플리케이션을 빌드하고 실행할 수 있도록 하는 잘 알려진 Spring Cloud 인터페이스의 구현을 제공
  • Spring Cloud Circuitbreaker
    • 다양한 회로 차단기 구현에서 추상화를 제공
    • 개발자가 앱에 가장 적합한 회로 차단기 구현을 선택할 수 있도록 애플리케이션에서 사용할 일관된 API를 제공
  • Spring Cloud Bus
    • 분산 시스템의 노드를 경량 메시지 브로커와 연결
    • 상태 변경(예: 구성 변경) 또는 기타 관리 지침을 브로드캐스트하는 데 사용
    • AMQP 및 Kafka 브로커 구현이 프로젝트에 포함되어 있음
    • 클래스 경로에 있는 모든 Spring Cloud Stream 바인더는 즉시 전송으로 작동
  • Spring Cloud Cli
    • Spring Cloud에 대한 Spring Boot 명령줄 기능을 제공
    • Spring Cloud 구성 요소 애플리케이션(예: @EnableEurekaServer) 을 실행하기 위해 Groovy 스크립트를 작성할 수 있음
    • 암호화 및 암호 해독과 같은 작업을 쉽게 수행하여 비밀 구성 값으로 Spring Cloud Config 클라이언트를 지원
    • Launcher CLI를 사용하면 명령줄에서 Eureka, Zipkin, Config Server와 같은 서비스를 한 번에 편리하게 시작할 수 있음(개발 시 매우 유용)
  • Spring Cloud Zookeeper
    • Spring 환경 및 기타 Spring 프로그래밍 모델 관용구에 대한 자동 구성 및 바인딩을 통해 Spring Boot 앱에 Apache Zookeeper 통합을 제공
    • 몇 가지 간단한 주석으로 애플리케이션 내부의 공통 패턴을 빠르게 활성화 및 구성하고 Zookeeper로 대규모 분산 시스템을 구축
    • 제공된 패턴에는 서비스 검색 및 분산 구성이 포함
  • Spring Cloud Sleuth
    • 분산 추적을 위한 Spring Boot 자동 구성을 제공
  • Spring Cloud Starter Build
  • Spring Cloud Task
    • 사용자는 Spring Cloud를 사용하여 수명이 짧은 마이크로 서비스를 개발 및 실행할 수 있으며 Spring Cloud Data Flow에서도 로컬, 클라우드에서 실행할 수 있음
  • Spring Cloud Commons
    • Spring Cloud Context와 Spring Cloud Commons의 두 가지 라이브러리로 기능을 제공
    • Spring Cloud Context는 Spring Cloud 애플리케이션의 ApplicationContext(부트스트랩 컨텍스트, 암호화, 새로 고침 범위 및 환경 끝점)에 대한 유틸리티 및 특수 서비스를 제공
    • Spring Cloud Commons는 다양한 Spring Cloud 구현(예: Spring Cloud Netflix vs. Spring Cloud Consul)에서 사용되는 추상화 및 공통 클래스 세트
  • Spring Cloud Openfeign
    • Spring 환경 및 기타 Spring 프로그래밍 모델 관용구에 대한 자동 구성 및 바인딩을 통해 Spring Boot 앱에 대한 OpenFeign 통합을 제공

분산/버전 설정(Spring cloud config)

애플리케이션이 동작할 때 설정 파일을 읽어서 처리하는 것은 매우 일반적이다
만약 이런 설정이 없다면 개발/운영 환경 일치라는 요소를 만족하기 어려워질 것이다
대부분의 경우 설정 파일은 바이너리와 함께 배포되며 환경 혹은 실행 옵션으로 실제 값이 선택된다
그러나 클라우드 환경에서 마이크로 서비스를 지원하는 경우 환경 자체의 값들이 자유롭게 변경/처리될 수 있어야 한다
즉 중앙 저장소에서 모든 설정 값을 관리하고 개별 서비스는 설정 값을 해당 저장소에 문의하여 가져와야 한다

스프링 클라우드 Config외부화 된 구성(Cofnig)에 대해 서버 및 클라이언트측 지원을 제공한다
기본적으로 설정은 키-값(Key-value)의 쌍으로 되어 있고 필요시 암호화도 할 수 있다

서비스 등록 및 조회

기존 환경에서는 특정 서비스가 다른 서비스를 호출해야 하는 경우 어디에 어떻게 호출하는지를 명확히 알고 있다
하지만 클라우드 환경에서는 어디가 실시간으로 변경되고 어떻게 역시 자유롭게 바뀔 수 있다
여기서 어디에에 대한 부분이 바로 서비스 등록 및 조회이다
각각의 서비스는 중앙 저장소에 자신의 정보와 제공하는 서비스의 이름을 등록한다
서비스 내에서 다른 서비스를 호출할 때는 이 서비스 이름으로 어디에 문의해야 할지 정보를 가져와서 호출하게 된다
바로 위에서 설명한 분산/버전 설정과 매우 유사하다
서비스 이름이 키가 되고 호출 위치가 값이 되는 것이다
따라서 설정에 대한 정보 처리와 서비스 정보 처리를 모두 제공하는 제품도 많이 있다

이런 서비스 등록 및 조회 기능은 다양한 솔루션에서 지원한다
스프링 클라우드는 Spring cloud Netflix(Eureka), Spring cloud Consul(Hashicorp’s Consul), Spring cloud Zookeeper(Apache Zookeeper)의 프로젝트에서 개별 솔루션과의 연동을 지원한다
물론 이런 솔루션이 단순히 키-값의 정보만을 제공하는 건 아니고 복제, 고가용성 등의 다른 기능도 가지고 있다
각자의 운영 환경에 적합한 프로젝트를 선택하여 활용하면 된다

라우팅

라우팅은 특정 네트워크 내부에서 목적지를 찾아가는 과정을 의미한다
이 때 사용되는 것이 API 게이트웨이(API Gateway)이다
API 게이트웨이는 원래 다양한 네트워크를 사용하는 모듈 사이에서 중계와 필요한 변환 및 추가 처리 작업을 하는 모듈을 의미한다
즉 API 게이트웨이를 사용해서 라우팅을 하는 것이다
API 게이트웨이는 외부에 노출하는 포인트를 하나로 만들어 관리가 편해지고 인증 혹은 SSL 처리를 담당하여 게이트웨이 내부의 모듈을 더 간단하게 만들 수 있도록 도와준다
아울러 필요한 경우 필터를 추가할 수 있다
스프링 클라우드는 Spring cloud Netflix(Zuul)를 지원하고 내부 프로젝트인 Spring cloud Gateway 또한 제공하고 있다

서비스 간 호출

마이크로 서비스 환경에서 서비스 간 호출은 매우 빈번하게 발생한다
위의 API 게이트웨이를 활용해 작업을 수행할 수 있지만 신뢰할 수 있는 내부망에서 SSL, 필터링 처리 등 불필요한 부하가 발생한다
또한 이러한 호출은 일대일 호출과 일대다 호출로 구분할 수 있다
일대일 호출의 경우 직접 서비스 주소를 찾아서 호출하거나 클라이언트 사이드 부하 분산 솔루션인 리본(Ribbon)을 활용하는 것이 일반적이다
일대다 호출의 경우 다시 설명할 분산 메시징을 활용할 수 있다
스프링 클라우드는 Spring cloud Netflix(Ribbon)를 지원한다

부하 분산

클라우드 환경에서는 동일한 서비스를 처리하는 인스턴스가 많을 수 있다
이 중에서 적합한 인스턴스로 호출하는 것, 그리고 부하를 분산시키는 것은 중요하다
API 게이트웨이나 클라이언트 사이드 부하 분산 솔루션은 다양한 알고리즘으로 이를 지원한다
리본을 예로 들면 기본적인 라운드 로빈(Round Robin) 이외에 평균 응답 시간을 기록해서 활용하는 방법, 현재 연결된 서비스 수를 받아서 활용하는 방법 등이 있다
리본 외에도 스프링은 클라이언트의 부하 분산을 위한 모듈을 제공한다
스프링 클라우드 로드 밸런서(Load balancer)인데 리본에서 발생했던 단점과 사용성이 개선되었다

서킷 브레이커(Circuit Breakers)

지금까지 서비스 간 커뮤니케이션을 쉽고 빠르게 할 수 있는 방법에 대해서 알아보았다
중요한 요소 중 하나는 장애 발생 시 이를 회피하는 방법이다
동일한 서비스를 제공하는 여러 인스턴스 중 하나에서 장애가 발생할 경우 해당 인스턴스에 계속 요청을 보내 타임아웃(Timeout)까지 기다리는 것은 전체 시스템에 부하를 주게 된다
따라서 장애가 발생한 인스턴스로 가는 요청을 중단시킬 필요가 있다
서킷 브레이커가 그런 역할을 한다
리본이나 주울(Zuul) 모두 이런 기능을 갖추고 있다

Global locks, Leadership election and Cluster state

클라우드 네이티브 환경에서 특정 리소스에 하나의 모듈만 접근해야 하는 경우가 종종 발생할 수 있다
이 때 필요한 것이 글로벌 락(Global lock)이다
해당 리소스에 접근한 모듈이 잠금(Lock)을 생성하고, 이후 접근한 모듈이 잠금 상태라면 대기, 잠금이 없다면 자신이 잠금을 잡는 방식이다
각각의 인스턴스가 개별로 동작하므로 이런 잠금은 하나의 시스템이 아닌 전체를 대상으로 관리되어야 한다
그리고 특정 서비스 사이에서 리더(Leader)를 선출하고 관리하는 것도 일반적인 요구 조건이다
이런 기능은 자세히 보면 키-값 관리 기능의 확장으로 생각할 수 있다
전체 시스템에서 하나의 키를 이용해 잠금을 관리할 수 있고 리더 역시 특정 키를 조회해 값이 없다면 조회한 모듈이 자신으로 값을 설정하고, 값이 있다면 해당 모듈을 리더로 판단하면 된다
리더 대체나 잠금 자동 해제 등 실제 서비스는 키-값 관리 기능 외에 추가 기능을 지원한다
컨설(Consul)이나 주키퍼(Zookeeper) 모두 이런 기능을 제공하고 있다

분산 메시징

앞서 서비스 호출 단계에서 목표한 서비스를 찾아 호출하는 방식에 대해 설명했다
클라우드 네이티브 애플리케이션에서는 메시지를 이용하는 방식도 자주 사용된다
예를 들어 배달 서비스를 개발하는 경우 고객의 주문이 완료되면 고객에게 문자로 결과를 보내고, 배달자에게도 같은 내용을 전송하며, 서비스 메인 모듈에도 전달한다
그리고 필요한 경우 프로모션 담당 모듈에도 메시지 전달할 수 있다
이렇게 메시지 큐(Message queue)를 이용하거나 pub/sub 모델을 사용해 분산 메시징을 지원할 수 있다
세부적으로 들어가면 컨슈머 그룹(Consumer group)을 활용해 중복 처리를 방지하거나 파티셔닝(Partitioning) 기능을 활용할 수 있다
Spring cloud Stream래빗MQ(RabbitMQ), 아파치 카프카(Apache Kafka), 구글 펍섭(Google PubSub) 등의 제품과 연계하여 분산 메시징을 지원한다

728x90

댓글

💲 추천 글