MSA (Micro Services Architecture)

Easycelsius·2021년 7월 17일
0

Etcetera

목록 보기
1/2

마이크로 서비스 아키텍처

  • 최근 IT 기업들이 선호하는 IT 아키텍처로 MSA가 각광.
    • MSA는 모듈화된 구조로 독립적으로 기능을 개발하고 배포할 수 있음.
    • 이전에는 모놀리식 아키텍처(Monolithic Archi.)를 사용.
      • 모든 트랜잭션을 고성능 대용량 서버로 처리하는 방식.
      • DB의 고가용성을 보장하기 함.
  • 데이터 분산으로 인해 정합성 유지가 어려울 수 있음.
    • 설계를 잘못하는 경우, DB의 고가용성을 보장하기 어려울 수 있음.
  • 넷플릭스는 MSA 환경 구축을 통해 고객에게 원활한 서비스를 제공하고, 오픈 소스를 통해 MSA 방식을 제공.
  • 자동 확장(Auto Scale-out) 기능이 핵심 요소.
    • 특정 서비스에서 트래픽 내지는 부하 증가시, 인스턴스를 추가하고 반대의 경우는 인스턴스를 없애는 방식.

Spring Cloud

  • Spring Boot 기반의 MSA 구축에 특화된 프레임워크.
  • Spring Cloud Netflix에는 Eureka, Hystrix, Ribbon, Zuul 등 넷플릭스 OSS가 통합되어 있음.

기능과 요소

  • 분산/버전 컨피규레이션
  • 서비스 등록 및 디스커버리
    • 서비스 디스커버리 : 서비스들은 동적으로 관리하는 서버
    • Eureka
  • 라우팅(API Gateway)
    • 사용자 요청을 적절한 서비스로 라우팅/프록시 하는 기능
    • 도메인 통합 및 진입점을 하나로 만듦
    • Zuul, Zookeeper
  • 서비스간 호출
  • 부하 분산
    • 부하 분산 : 클라이언트(다른 서비스를 호출) 서비스는 서버 목록 중 하나를 선택하여 호출
    • Ribbon
  • 서킷 브레이커
    • 서킷 브레이커 : 서비스 장애를 전체적으로 확산되지 않게 차단해주는 기능.
      • 각 서비스의 오류 및 복구 상태 확인
      • 현재 오류 내용 파악
      • API 호출 통계 기반의 서비스 이상 감지
      • 이상 감지시 통신 중단 후 격리 조치
      • 문제 해결시까지 별도의 스레드에서 밀린 작업 수행 또는 호출 수 제한
      • 폴백 기능 수행(Fallback) : 정해진 시간 내 호출 실패시 대신 동작하는 예외처리
      • 로그를 중앙집중형으로 관리하게 해줄 수 있는 기능 有
    • Hystrix
  • 분산 메시징

분산 컨피규레이션

  • Spring Cloud Config

  • Spring Cloud Zookeeper Config

  • Spring Cloud Consul Config

    • spring-cloud-starter-consul-discovery 사용
    • 넷플릭스 디스커버리와 스프링 분산 컨피규레이션의 대안
    • 컨설 서버에 연결하기 위해서는 애플리케이션에 에이전트가 필요 (별도로 분리된 프로세스로 실행)
    • 기본적으로 http://localhost:8500 주소 제공
    • 서비스 등록, 서비스 목록 수집, 속성의 컨피규레이션을 수행할 수 있는 REST API 제공
    • 넷플릭스 리본 동적 라우터, 넥플릭스 주울 필터 지원
    • 컨설 아키텍처 참조 (https://www.consul.io/docs/internals/architecture.html)
  • Spring Cloud Etcd Config

  • Spring Cloud Kubernetes Config

서비스 디스커버리

  • Spring Cloud Eureka : 서비스 디스커버리

    • 새 인스턴스 시작시 Eureka 서버에 IP, 호스트 주소, 포트 번호 등을 스스로 전송.

    • 상태 체크를 통해 인스턴스 관리.

    • 운영자들은 IP 정보를 신경쓰지 않아도 됨.

    • 설정 파일에 Eureka 서버 정보만 입력하면 설정 완료.

    • 다른 서비스 호출시 Eureka 서버에 등록된 인스턴스를 조회.

    • 클라이언트와 서버로 구분하여 사용.

      • 클라이언트
        spring-clould-starter-eureka 스타터 사용

        클라이언트는 애플리케이션의 일부로 원격의 디스커버리 서버에 연결을 담당

        연결 후 서비스 이름과 네트워크 위치 정보를 등록 메시지로 전송

        다른 마이크로서비스 API 호출시, 디스커버리 서버로부터 서비스 목록을 담은 최신 configuration 수신

      • 서버

        spring-cloud-starter-eureka-server 스타터 사용

        독립적인 스프링부트 어플리케이션

        각 서버의 상태를 다른 서베에 복제해 가용성 높음

  • Spring Cloud Zookeeper Discovery

    • spring-cloud-stater-zookeeper-discovery, sping-cloud-starter-zookeeper-config, 아파치 큐레이터(Curator) 사용
      (큐레이터는 통합을 지원하는 API 프레임워크와 유틸리티를 제공)
    • 컨피규레이션과 이름을 유지하는 중앙 서비스로의 분산 동기화, 그룹 서비스가 가능
    • 예시 : 공통 애노테이션을 통한 통합제공, 설정 파일을 통한 컨피규레이션, 리본/주울과 상호작용하기 위한 자동-컨피규레이션
  • Spring Cloud Consul Discovery

  • Spring Cloud Etcd Discovery

    • 분산 컨피규레이션, 서비스 등록, 디스커버리 기능 제공
    • 쿠버네티스에서 서비스 디스커버리, 클러스터 탄생, 컨피규레이션 관리에 쓰이는 백엔드로 사용
  • Spring Cloud Kubernetes Discovery

    • 배포, 확장, 애플리케이션 컨테이너의 관리를 자동화하는 시스템
    • 컨테이너 오케스트레이션(orchestration) 및 서비스 디스커버리, 컨피규레이션 관리, 부하 분산 등의 기능을 제공

상호 통신

  • Spring Cloud Hystrix : 대기 시간 및 장애 내성 다루기

    • spring-cloud-starter-hystrix 스타터 사용
    • 서킷 브레이커 패턴을 구현
    • 기본적으로 리본과 페인 클라이언트를 통합 가능
    • 서킷 브레이커 시간 만료(timeout) 발생 시 폴백 로직을 쉽게 설정 가능
  • Spring Cloud Ribbon : 부하 분산

    • spring-cloud-starter-ribbon 스타터 사용
    • 클라이언트(서비스) 측 부하 분산기
    • TCP, UDP, HTTP 등 프로토콜 지원
    • 동기, 비동기, 리액티브 모델 지원
    • HTTP와 TCP 클라이언트를 한 단계 더 추상화
    • 부하 분산 알고리즘으로 규칙을 제공하고 쉽게 확장 가능
    • 이름 기반 부하 분산(네임드 클라이언트)에 기반
  • Spring Cloud Feign : 자바 HTTP Client 작성

    • spring-cloud-stater-feign 스타터 사용
    • 선언적인 REST 웹 서비스 클라이언트
    • 애노테이션 선언만으로 애플리케이션이 실행될 때 실제 구현이 실행됨
    • 리본 클라이언트와 통합돼 디스커버리 서비스와의 통신, 부하 분산 같은 리본의 기능을 기본으로 제공
  • Spring Cloud Zuul : 라우팅, GW

    • spring-cloud-starter-zuul 스타터 사용
    • JVM 기반 라우터로, 부하 분산과 필터링을 수행
    • 인증, 부하 평균 분배, 정적 응답 처리, 부하 테스트에 사용 가능
    • 독립적인 스프링 부트 애플리케이션
    • API GW 역할 수행
    • 각 서비스의 네트워크 위치 정보를 알아야 하므로 유레카(디스커버리) 서버와 통신하기 위해 디스커버리 클라이언트를 클래스 경로에 포함
    • 필터 기능 제공 : 사용자의 다양한 요청을 필터에 맞게 처리, 인증 요구사항이 만족하지 않으면 요청 거부
    • 데이터 및 통계 분석으로 모니터링 기능 수행
    • 스트레스 테스트, 멀티 리전(multi-region) 복원 기능 有

추적

  • Spring Cloud Sleuth

    • spring-cloud-stater-sleuth 스타터 사용
    • 분산 추적 기능 (하나의 요청을 여러 마이크로서비스로 처리할 때 이어지는 요청을 연관 짓는 기능)
    • HTTP 헤더에 기반하여 추적을 구현
    • Slf4j, MDC로 개발됨
    • Slf4j는 특정 로깅 프레임워크의 추상화 퍼사드를 함
      (퍼사드 패턴 : 단순화된 인터페이스를 통해서 서브 시스템을 더 쉽게 사용할 수 있도록 하는 패턴)
    • MDC(mapped diagnostic context)는 다양한 소스의 로그 출력을 구분하고 부가 정보를 추가하는 솔루션
    • 트레이스(trage) ID와 스팬(span) ID를 Slf4j, MDC에 추가해 관련된 로그를 추출 가능
  • Spring Cloud Sleuth Zipkin

    • spring-cloud-stater-zipkin 사용

    • 지연 문제를 분석하기 위해 설계된 분산 추적 시스템

    • 시간 정보를 질의하고 시각화함

    • 스프링 클라우드 슬루스는 샘플링 정책을 지원 (집킨으로 보낼 트래픽 양을 결정)

    • 기본 HTTP API 대신 메시지 브로커에 통계 정보를 전송
      spring-cloud-sleuth-stream 추가하면 기능 활성화 (아파치 카프카나 래빗엠큐로 메시지를 전송하는 프로듀서가 됨)

  • Spring Cloud Sleuth Stream

클라우드 플랫폼 지원

  • Spring Cloud Cloud Foundry

    • spring-cloud-services-stater-circuit-breaker, spring-cloud-services-stater-config-client, spring-cloud-services-stater-service-registry
    • 애플리케이션을 배포하고 관리하는 클라우드 네이티브 플랫폼
    • 스프링 부트의 실행 가능한 JAR, 컨피그 서버, 서비스 레지스트리, 서킷 브레이커 등 모든 스프링 클라우드 마이크로서비스 패턴을 지원
  • Spring Cloud AWS

    • 유명 웹 도구 통합
      • Simple Queuing Service(SQS)
      • Simple Notification Service(SNS)
      • ElasticCache
      • Relation Database Service(RDS)
        (Aurora, MySQL, Oracle과 같은 엔진을 제공함)
    • Spring Cloud AWS Core : spring-cloud-stater-aws 스타터로 활성화. EC2 인스턴스로 직접 접근을 활성화하는 핵심 구소 요소 제공
    • Spring Cloud AWS Context : S3 저장소, 이메일 서비스, 캐싱 서비스로의 접근 제공
    • Spring Cloud AWS JDBC : spring-cloud-stater-aws-jdbc 스타터로 활성화. 스프링에서 지원하는 데이터 접근 기술을 사용할 수 있는 데이터 소스 조회 및 컨피규레이션 제공
    • Spring Cloud AWS Messaging : spring-cloudstater-aws-messaging 스타터로 활성화. 애플리케이션이 SQS(점대점 메시징) 또는 SNS(게시/구독 메시징)로 메시지를 보내고 받을 수 있게 함
  • Spring Cloud Function

  • Spring Cloud Connectors

    • 클라우드 플랫폼에 배포된 JVM 애플리케이션를 위한 추상화를 제공
    • SMTP, 래빗엠큐, 레디스(Redis), 전통 DB에 접속할 수 있는 클라우드 플랫폼
    • 히로쿠(Heroku)와 클라우드 파운드리를 지원

메시징 및 통합

  • Spring Cloud Stream

    • spring-cloud-stater-stream-kafka 또는 spring-cloud-stater-stream-rabbit
    • 메시지 중심 마이크로서비스로 구성된 시스템에 적합
    • 스프링 인테그레이션에 기반함
      (스프링 인테그레이션은 채널,애그리게이터,트랜스포머와 같은 엔터프라이즈 통합 패턴 프로그래밍 모델을 제공하는 프로젝트)
    • 마이크로서비스 시스템 내의 애플리케이션 스프링 클라우드 스트림 입력 및 출력 채널을 통해 통신
  • Spring Cloud Bus

    • spring-cloud-stater-bus-amqp 또는 spring-cloud-stater-bus-kafka
    • 컨피규레이션 속성 변경, 관리 명령 등의 상태 변경을 브로드캐스트로 애플리케이션에 알림
    • 공통 오퍼레이션을 위한 분산 메시지 기능 지원
  • Spring Cloud Stream Apps

  • Spring Cloud Data Flow

기타

  • Spring Cloud Contract
    • 와이어목(WireMock)을 사용하여 트래픽을 기록
    • 메이븐 플러그인을 사용하여 스텁(stub) 생성
  • Spring Cloud Security
    • spring-cloud-stater-security
    • OAuth2, JWT, 기본 인증 메키너즘 API 구현
    • 싱글 사인온(single sign-on)과 토큰 리플레이(token replay) 패턴을 지원
  • Spring Cloud Task
    • spring-cloud-stater-task
    • 한 번만 실행하고 종료하는 마이크로서비스를 개발하도록 지원
    • 보통 로컬 컴퓨터나 클라우드 환경에서 실행
  • Spring Cloud Cluster
    • 주키퍼, 레디스, 해즐캐스트(Hazelcast), 컨설에 대한 추상화 및 구현을 사용해 리더 선출과 공통 상태유지 패턴을 위한 솔루션을 제공

참고 :

Spring Cloud 개요1

중요 - Spring Cloud 개요2

Spring Cloud 실습 소스1

Spring Cloud 실습 소스2

profile
항상 성장하고 싶은 개발자

0개의 댓글