본문 바로가기
MSA

[마이크로서비스 아키텍처 : 패턴과 핵심 기술] MSA를 위한 기술 - Spring Boot와 Spring Cloud

by 엘리후 2023. 4. 1.

https://yummy0102.tistory.com/370

 

Spring Framework

  • EJB의 복잡성에 대한 대안으로 갭랃되어 두각을 나타냄
  • 2004년에 버전 1.0 공개
  • DI와 XML 기반 설정으로 POJO를 그대로 사용할 수 있다
    • Spring을 걷어내도 Object를 그대로 사용할 수 있다
    • 현재는 Annotaion이 중심이다
  • 복잡한 설정
    • 컴포넌트 스캔, 디스패쳐 서블릿, 뷰 리졸버, 웹 jar 들 설정
  • 대안으로 Modern Framework 들이 등장하였다
  • Convention Over Configuration
    • 복잡한 설정보다는 규약이나 관례 등의 약속들로 어플리케이션을 구성
    • Ruby On Rails
    • Python Django

 

 

 

Spring Boot

  • Spring에서도 Modern Framework의 장점을 받아들이고, MSA에 최적화된 환경을 개발한 것이 Spring Boot이다
  1. Auto Configuration
  2. Spring Boot Starter Projects
  3. Embedded Server Intergration
  4. Acutator

 

 

1. Auto Configuration

  • 특정 jar가 class path 안에 있을 경우 해당 설정을 자동화
    •  Spring MVC jar가 class path 안에 있으면 Dispathcer Servlet을 자동으로 구성한다
  • Convention Over Configuration
    • 특정 폴더에 넣으면 자동으로 인식 - template, static
    • 정해진 이름대로 파일을 만들면 자동으로 인식 - application.yml, application-dev.yml
  • @SpringBootApplication
    • @EnableAutoConfiguration + @ComponentScan + @Configuration

 

 

 

2. Spring Boot Starter Projects

  • 자주 사용하는 의존성을 패키지화하여 제공한다
  • 매번 수십개의 의존성을 추가하지 않아도 1개만 등록하면 관련된 모든 의존성이 추가된다
  • ex) Spring Boot Stater Web

  • 다양한 Starter Project들이 존재한다

 

 

 

3. Embedded Server Intergration

  • Embedded Server로 독립으로 실행할 수 있는 웹 서비스 구성이 가능하다
  • Default는 Tomcat Server이지만 변경이 가능하다
    • Jetty, Undertow...
  • 웹 서비스를 구성하고 배포하는 작업을 최소화할 수 있다
  • Production에서 사용이 가능하다

 

 

 

4. Actuator

Actuator를 사용한 모니터링 화면

  • 따로 모니터링 환경을 구성하지 않고 기본적인 지표 확인이 가능하다
  • 운영중인 애플리케이션의 healthm metrics 등을 확인이 가능하다
  • REST API로 쉽게 확인할 수 있다
  • Spring 앱과 연동되어 있는 DB 등과 같은 미들웨어의 상황도 파악이 가능하다

 

 

 

Spring Cloud

  • MSA에 최적화된 개발을 위하여 Spring 진영에서 제공하는 오픈소스
  • 분산 환경에서 적용될 수 있는 다양한 아키텍처 패턴들을 구현함
    • 설정 정보 관리
    • 서비스 디스커버리
    • 회로 차단기 등..
  • 기존 Spring Application 들과 쉽게 통합이 가능하다
  • 다양한 프로젝트들을 제공한다
 

Spring Cloud

Spring Cloud is an umbrella project consisting of independent projects with, in principle, different release cadences. To manage the portfolio a BOM (Bill of Materials) is published with a curated set of dependencies on the individual project. Go here to r

spring.io

 

  • Maven 의존성 추가 및 어노테이션 추가만으로 구성이 가능하다
    • 코드 작성이 거의 없이 대부분의 기능 구성이 가능함

 

 

 

Spring Cloud와 Netflix OSS

  • Netflix OSS는 Netflix에서 MSA를 운영하며 쌓아온 노하우들을 오픈소스로 공개한 것이다
  • 그 중 일부를 Spring Cloud와 통합하여 Spring Cloud Netflix 프로젝트로 제공한다
  • 보다 쉽게 Spring app과 통합될 수 있는 환경을 제공한다

 

 

 

주요 Spring Cloud Projects

  • Spring Cloud Config
  • Spring Cloud Netflix Eureka
  • Spring Cloud Netflix Hystrix
  • Spring Cloud Netflix Zuul
  • Spring Cloud Stream
  • Spring Cloud Sleuth

 

 

 

Spring Cloud Netflix Eureka

  • Service Discovery Pattern을 위한 프로젝트
  • Eureka Server와 Eureka Client로 구성됨
  • 동작 과정
    1. 그림에서 각각의 MSA들이 Eureka Client가 된다
    2. 각각의 서비스들이 인스턴스가 만들어질 때 Eureka Server로 자신들의 등록 정보를 보낸다
    3. ex) 서비스 이름, IP, 등록 정도 등..
    4. 한 서비스가 다른 서비스를 호출할 때 서비스의 IP를 정적으로 호출하는 것이 아니라, Eureka Server에 등록된 정보를 조회하여 서비스를 호출하게 된다

 

 

 

Spring Cloud Config

  • 설정 외부화를 위한 프로젝트
  • 설정 정보를 저장하고, 정보들을 Serving하는 Server로 구축한다
  • 각 클라이언트는 설정 정보로부터 설정 정보를 조회한다
  • 실제 Spring Servce에서는 Config Server의 정보 외에는 다른 설정이 거의 없는 수준으로 만들어진다

 

 

 

Spring Cloud Netflix Hystrix

  • Hystrix 프로젝트는 굉장히 많이 사용되는 프로젝트이다
    • 앞의 스프링 프로젝트들은 도입하기에 무거운 부분이 있다
    • Hystrix 프로젝트는 기존의 레거시 프로젝트에도 도입해서 사용이 가능하기 때문에 많이 사용된다
  • 한 서비스의 장애가 다른 서비스로 전파되지 않도록 사전에 차단하는 것이 Hystrix 프로젝트의 목표이다
  • 특정 서비스의 호출이 일정 수준 이상으로 실패할 경우 호출을 차단한다
  • MSA 서비스 사이에 Circuit Breaker(회로 차단기)가 들어가 있다
    • 한 서비스에서 다른 서비스를 호출하면 Circuit Breaker가 호출을 가로챈다
    • Circuit Breaker가 중간에서 호출 정보들을 모두 관리한다
    • 어떠한 호출이 특정 임계값 이상으로 문제가 있다고 판단되면 호출이 들어가지 않도록 막아버린다
    • 즉, 장애가 전파되지 않도록 사전에 차단하게 된다

 

 

 

Spring Cloud Netflix Zuul

  • Zuul은 Microservices 앞 단에 위치하는 API Gateway이다
  • Zuul이 클라이언트의 호출을 받아 뒷 단의 Microservices에게 호출을 전달한다
  • 모든 Service들이 처리해야 하는 공통 코드(인증, 로그인 등)를 처리한다

 

 

 

Spring Cloud Stream

  • MSA에서는 서비스 간의 결합도를 낮출 수 있는 Event driven 아키텍처를 강력히 권장한다
  • Stream은 Event driven MSA를 구축하기 위한 프로젝트이다
  • 다양한 Message Platform을 동일한 인터페이스로 연동할 수 있도록 추상화한 프로젝트이다
  • RabbitMQ, Kafka, AWS Kinesis, GCP PubSub 등을 거의 코드를 변경하지 않고. 즉 핵심 비즈니스 로직을 거의 변경하지 않고 의존성과 설정만의 변경으로 쉽게 연동할 수 있다
  • Hexagonal Architecture를 만족하는 프로젝트이다
  • 각각의 서비스들이 message platform과 연동하는데 핵심 비즈니스 로직들이 크게 변경되지 않도록 추상화된 레이어를 제공하는 것이 목적이다

 

 

 

Spring Cloud의 한계

  • Spring Cloud는 많은 장점이 있다
    • 구현하기 어려운 기술들을 쉽게 사용할 수 있게 제공한다
    • Spring Project들과 용이하게 통합이 가능하다
  • 그러나 Spring Cloud도 한계는 존재한다
  • Java로 만들어진 스프링 프로젝트만 주로 사용이 가능하다
    • Sidecar 프로젝트를 사용하면 이종 기술로 만들어진 프로젝트도 연계가 가능하다
    • 하지만 이 또한 한계가 존재한다
  • MSA는 각각의 서비스들이 목적별로 적합한 기술을 도입할 수 있게 하는 Polyglot Architecture를 권장하지만, 이게 어려워진다는 단점이 있다
  • 대안으로 Kubernetes, Istio 등의 조합으로 사용이 가능하게 할 수 있다

댓글