[MSA] MSA를 위한 기술(1)-Spring Boot & Spring Cloud & Docker

sorzzzzy·2022년 4월 26일
5

MSA

목록 보기
6/7
post-thumbnail

🏷 Spring Boot

✔️ Spring Framework & Spring Boot

Spring Framework는 EJB의 복잡성에 대한 대안으로 개발되어, 현재까지도 범용적으로 사용되고있는 프레임워크이다.

DI와 XML 기반 설정으로 POJO(Plain Old Java Object)를 그대로 사용 가능하다는 장점이 있다.
Spring을 걷어내도 Java의 Object를 그대로 사용할 수 있으며, 현재는 편리성 등의 이유로 어노테이션이 중심을 이루고 있다.

그러나 시간이 지나면서 Spring Framework도 복잡한 설정이 필요하게 되었고😢
어느 순간 COC(Convention Over Configuration)개념을 탑재한 모던 프레임워크가 등장하게 되었다.

Modern Framework
컨벤션이나 규약/관례로 어플리케이션을 구성함으로써 복잡한 설정 없이도 간단하게 어플리케이션을 구성한다는 장점이 있다.

  • Ruby On Rails
  • Python Django

Spring 진영에서도 이러한 모던 프레임워크들의 장점을 받아들이고, MSA 환경에 최적화된 프로젝트를 개발했는데 이것이 바로 Spring Boot이다!


✔️ Spring Boot 특징 1. Auto Congifuration

특정 jar가 class path 안에 있을 경우 해당 설정을 자동화 할 수 있다.
Spring MVC jar가 class path 안에 있으면 Dispatcher Servlet 을 자동으로 구성해준다.

또한 기존에는 여러개의 어노테이션으로 구성하던 것들을 @SpringBootApplication 하나로 대체할 수 있다.

@SpringBootApplication
@EnableAutoConfiguration + @ComponentScan + @Configuration


✔️ Spring Boot 특징 2. Spring Boot Starter Projects

Spring Boot는 자주 사용하는 의존성을 묶어서 패키지화해준다.

기존에는 의존성 하나하나를 추가해야 했지만(수십~수백개), 이제는 위와 같이 1개만 등록하면 관련된 모든 의존성이 추가된다.

목적에 따라 다양한 스타터 프로젝트를 제공한다.

  • spring-boot-starter-web-services : SOAP Web Services
  • spring-boot-starter-web : Web and RESTful applications
  • spring-boot-starter-test : Unit testing and Integration Testing
  • spring-boot-starter-jdbc : Traditional JDBC
  • spring-boot-starter-security : Authentication and Authorization using Spring Security
  • spring-boot-starter-data-jpa : Spring Data JPA with Hibernate

✔️ Spring Boot 특징 3. Embedded Server Integration

Embedded Server로 독립으로 실행할 수 있는 웹 서비스를 구성 가능하다.
(Default는 Tomcat 이지만 변경 가능)

이는 웹 서비스를 구성하고 배포하는 작업을 최소화 할 수 있고
특히 인스턴스가 계속해서 변경되는 클라우드/MSA환경에 적합하다고 볼 수 있다.


✔️ Spring Boot 특징 4. Actuator

Actuator는 어플레이션 자체만으로 지표를 확인하기 위해 만들어진 것이다.

스프링부트를 배포하는 것 만으로도 운영중인 어플리케이션의 health, metrics 등을 확인할 수 있고,
REST API로도 확인 가능하기 때문에 시각화 툴과도 연동 가능하다.


🏷 Spring Cloud

Spring CloudMSA 최적화 된 개발을 위하여 Spring 진영에서 제공하는 오픈소스이다.

분산 환경에서 적용될 수 있는 다양한 아키텍처 패턴들을 구현하고 있다.
Maven 의존성 추가 및 어노테이션 추가 만으로 구성 가능하고 기존 Spring Application과 쉽게 연동할 수 있다.

Spring Cloud는 Netflix OSS를 많이 받아들이게 되었는데 그 중 일부를 Spring Cloud와 통합하여 Spring Cloud Netflix 프로젝트로 제공한다.

Netflix OSS
Netflix에서 MSA를 운영하며 쌓아온 노하우들을 오픈소스로 공개한 것이다.


1. Spring Cloud Netflix Eureka

Spring Cloud Netflix Eureka는 Service Discovery Pattern을 위한 프로젝트로, Eureka Server와 Eureka Client로 구성되어 있다.


2. Spring Cloud Config

Spring Cloud Config는 설정 외부화를 위한 프로젝트로, 설정 정보를 저장하고 Serving하는 서버를 구축한다.

각 클라이언트는 설정 서버로부터 설정 정보를 조회한다.


3. Spring Cloud Netflix Hystrix

MSA 환경에서는 장애가 큰 이슈가 되기도 한다.
Spring Cloud Netflix Hystrix는 장애가 일어났을 때, 한 서비스의 장애가 다른 서비스로 전파되지 않도록 사전에 차단해주는 것이다.


4. Spring Cloud Netflix Zuul

Spring Cloud Netflix Eureka는 Microservices 앞 단에 위치하는 API Gateway로, 클라이언트의 호출을 받아 뒷 단의 Microservices에게 전달한다.

모든 Service들이 처리해야하는 공통 코드를 처리한다.


5. Spring Cloud Stream

MSA에서는 Event driven 아키텍처를 많이 권장하는데 서비스간의 결합도를 많이 줄일 수 있기 때문이다.

Spring Cloud Stream는 Event driven MSA를 구축하기 위한 프로젝트로,
코드 즉 비즈니스 로직을 거의 변경하지 않고 의존성과 설정의 변경만으로 쉽게 연동할 수 있는 프로젝트를 제공해준다.


🏷 Spring Cloud의 한계

Spring Cloud는 구현하기 어려운 기술들을 쉽게 사용할 수 있도록 제공해주고 스프링 프로젝트들과 용이하게 통합될 수 있다는 장점이 있지만, 한계점 또한 존재한다.

바로 자바로 만들어진 스프링 프로젝트만 주로 사용이 가능하다는 것이다.
(주로라고 표현한 이유는, Spring Project 중 Sidecar라는 프로젝트가 있는데, 이를 제외하고는 근본적인 한계가 있음)

MSA는 목적별로 가장 적합한 프레임워크를 도입할 수 있다는 장점(=Polyglot Architecture)이 있는데, Spring Cloud는 이것이 조금 어려워질 수 있다.


🏷 Container와 Docker

일반적으로 어플리케이션을 배포할 때 여러 문제가 존재한다.

  1. Application을 다른 서버에 배포 했더니 동작이 다르다.
  2. 옛날에 설치한 서버와 최근에 설치한 서버 OS, 라이브러리 등의 버전을 완전히 맞추기가 어렵다.
  3. 같은 미들웨어를 10대를 설치 했는데 1-2대의 서버에서만 이상 동작 을 한다.

이러한 문제점의 원인은 바로 인프라의 가변성이다.

어플리케이션은 다른 것들(운영체제, CPU, 언어 런타임, 라이브러리 등)에 의존하게 되는데, 이 어플리케이션을 배포했을 때 동일성을 보장하기 위해서는 환경의 차이를 없애는 것이 중요하다.

바로! 이 인프라의 가변성 문제가 컨테이너와 도커에 의해 해결될 수 있다!


✔️ Container & Docker

Container외부 환경으로부터 격리된 프로세스이다.

어플리케이션을 구동하기 위한 외부 환경 또한 하나로 패키징하여 그 결과물을 독립된 프로세스로 띄우는 것이 바로 컨테이너이다.

이러한 컨테이너 기술을 사용하기 쉽게 서비스화 한 것이 바로 Docker이다.
Docker는 다양한 프로그램, 실행 환경을 컨테이너로 추상화하고 동일한 인터페이
스를 제공하여 프로그램의 배포 및 관리를 단순하게 해준다.

Docker로 인해 패러다임이 전환되고 있다.
2020년 까지 전세계 글로벌 기업의 50% 이상이 운영환경에서 도커 를 사용할 것이다. (by 가트너)


✔️ Docker의 특징

1. 높은 확장성
OS 환경, 클라우드 벤더 등에 종속적이지 않기 때문에 Docker만 설치되어 있으면 컨테이너 사용이 가능하다.
따라서 쉽고 빠르게 서버 환경을 구축할 수 있다.

2. 표준화 가능
Java, Python, Nodejs 등 서로 다른 어플리케이션들을 동일한 방식으로 실행 가능하다.
즉, 이종 기술들을 동일한 인터페이스로 배포하고 관리할 수 있다.

3. 재현 가능한 이미지
Docker는 가상화 플랫폼이다.
기존의 가상머신 이미지는 재현이 어렵다.

  • 이미지를 그대로 만들 수 없음
  • 이미지라는 결과만 존재
  • 이미지를 만드는 절차가 없음

Docker 이미지는 Dockerfile 이라는 파일에 이미지가 어떻게 만들어 지는지 기술되어 있으므로 100% 재현이 가능하다.


✔️ Docker on Windows

Docker는 기본적으로 리눅스 컨테이너를 기반으로 하고 있지만, 최근에는 윈도우도 가능하다.

Windows 진영은 2016년부터 컨테이너 지원하고 있고, Windows 컨테이너 지원 버전은 Docker for Windows 설치 가능하다.

운영 환경에서의 안정성은 아직 검증되지 않고 있다는 의견이 있지만, 개발 및 테스트 용도로 사용하는 것은 문제 없다.


✔️ Container vs VM

Container

  • Container는 격리된 공간에서 프로세스가 동작하는 기술
  • 가상화 기술의 하나지만 기존 방식과는 차이가 있음
  • 기존의 가상화 방식은 주로 OS를 가상화
    • 호스트 OS위에 게스트 OS 전체를 가상화하여 사용하는 방식

Docker는 Container와 달리 Guest OS 없이 Docker 데몬을 깔아 여러가지 어플리케이션을 사용할 수 있다.
어플리케이션 하나하나가 격리된 컨테이너라고 볼 수 있다.


✔️ 이미지

이미지컨테이너 실행에 필요한 파일과 설정 값 등을 포함하고 있는 것이다.

컨테이너는 이미지를 실행한 상태이고, 같은 이미지에서 여러개의 컨테이너를 생성할 수 있다.

도커 이미지는 Docker hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리 가능하다.


✔️ 이미지와 컨테이너

이미지와 컨테이너는 Java의 클래스와 Object의 관계와 비슷하다.

이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 의존성 파일을 컴파일하고 애플리케이션을 설치할 필요가 없다.

만약 새로운 서버가 추가되면, 미리 만들어놓은 이미지를 다운받고 컨테이너를 생성만 하면 된다.
또한 한 서버에 여러 개의 컨테이너를 실행할 수 있고, 수십, 수백, 수천대의 서버도 동일하게 생성 가능하다.


✔️ Docker의 장점

  • 변화하지 않는 실행 환경으로 Idempotency 확보할 수 있다.
  • 코드를 통한 실행 환경 구축 및 애플리케이션 구성할 수 있다.
  • 실행 환경과 애플리케이션의 일체화로 이식성이 향상된다.
  • 시스템을 구성하는 애플리케이션 및 미들웨어의 관리 용이성이 증가한다.
profile
Backend Developer

0개의 댓글