마이크로서비스 프레임워크

현재의 엔터프라이즈 아키텍처와 애플리케이션 개발에는 모놀로식과 큰 애플리케이션에서 작은 서비스로 나뉘어지는 마이크로서비스가 대두되고 있습니다. 특히 엔터프라이즈 애플리케이션에는 마이크로서비스가 표준으로 자리잡아가고 있죠. 이와 동시에, Spring Boot는 자바진영에서 마이크로서비스를 구현하기 위한 기본 프레임워크로 쓰여지고 있으며 수년동안 Spring Boot는 최고의 위치에 올랐습니다.

최근 OCI (objectcomputing) 은 Micronaut 프레임워크를 내 놓았고, RedHat은 Quarkus 프레임워크를 서비스 하고 있습니다. 이와 같이 마이크로서비스를 구현하기 위한 마이크로서비스 프레임워크가 등장하고 있습니다. 마이크로서비스 프레임워크는 다음과 같은 목표를 가지고 있습니다.

  • 마이크로서비스 작성 지원
  • 클라우드 제공업체와의 통합
  • 시작 시간 및 메모리 소비
  • 반응형 애플리케이션 작성 가능성
  • 최신 버전의 JDK 지원
  • 외부 시스템과의 다양한 통합

마이크로서비스 위한 자바 프레임워크

자바를 위한 마이크로서비스 프레임워크는 다양합니다.
아래는 다양한 마이크로서비스 프레임워크와 대표적인 특징들입니다.

Spring Boot
  • Spring Framework의 진화과정에서 등장
  • Vmware(구 Pivotal) 지원
  • 기본적으로 Tomcat container에서 수행
  • Spring Boot actuator는 마이크로서비스를 위한 관리 및 모니터링 기능 제공
  • GraalVM과 함께 기본 배포 옵션을 제공하기 위해 Spring Native를 제공
  • 다른 프로젝트에 비해 GraalVM 지원 미성숙
Micronaut
  • ObjectComputing company에서 제공
  • 마이크로서비스 및 서버리스 기능 작업을 지원하기 위해 생성.
  • cloud-native stack(service discovery, distributed tracing, fast startup, small memory footprint) 을 위한 프레임워크
  • Java, Groovy, Kotlin  호환
Helidon
  • 마이크로서비스를 위한 라이브러리 세트
  • Oracle 에서 생성 및 지원
  • Helidon SE 은 reactive stream, asynchronous 와 functional programming, fluent-style API를 지원
  • Helidon MP는 MicroProfile을 지원하는 구현체. SE 뿐만 아니라 JPA, RESTful, JWT등을 지원
  • GraalVM을 사용한 네이티브 이미지 생성
Quarkus
  • 클라우드 환경을 위해 디자인.
  • Red Hat 에서 생성 및 지원
  • 확장 가능하고 알려진 표준 라이브러리로 구성
  • MicroProfile의 구현체
  • reactive, serverless, event-driven 아키텍처를 위한 디자인
  • Kubernetes 네이티브
  • GraalVM 지원

이 중 Quarkus에 대해서 자세히 알아보도록 하겠습니다.

Quarkus

기업은 비지니스 가치를 보다 빠르고 비용 효율적으로 제공하기 위해 Kubernetes를 채택하고 있습니다. 왜냐하면 부하가 증가하면 자동으로 애플리케이션을 수평으로 확장 하고 롤링 업그레이드 가능하기 때문입니다. 이와 같은 접근방식은 큰 힙 크기, 수직 확장 및 장기 실행 프로세스를 사용하는 Java의 모델과 충돌합니다.

Java는 역사적으로 최대 시스템 리소스를 할당 및 유지, 시간이 지남에 따라 로드 조건에 적응함으로써 탁월한 성능을 달성하였습니다. Java는 엔터프라이즈 애플리케이션을 지배했으나 Kubernetes의 사상과는 맞지 않는 경향이 있습니다. 그래서 쿠버네티스 네이티브 자바의 필요성이 대두되고 있습니다.

쿠버네티스 네이티브 자바는 자바 애플리케이션이 쿠버네티스 기능에 저항하는 대신 쿠버네티스 기능을 활용할 수 있음을 의미합니다. Java를 대체하기 위해서 Go 및 Node.js와 같은 대체 스택을 보기 시작했으나 고객은 새로운 언어를 선택하고 새로운 개발자를 고용하거나 기존 Java 개발자를 재교육해야 하는 조건을 가지고 있습니다. 조직과 개발자 모두 Java에 막대한 투자를 하고 있으나 Kubernetes는 새로운 방향을 요구하기 때문에 기능이 풍부하고 성숙한 Java 에코시스템의 이점과 Kubernetes의 운영상의 이점을 결합해야 합니다.

Red Hat은 이러한 필요성에 Quarkus를 발표하였습니다.
Quarkus Application은 기존 Java 보다 애플리케이션의 시작이 빠르고 메모리를 적게 차지합니다.

이는 Quarkus가 3가지의 부트스트랩 단계를 가지고 있습니다.

  • 증강(Augmentation)
    • Build time 에 애플리케이션의 바이트코드 및 구성을 로드하고 스캔합니다.
    • 라이브러리 부트스트랩 작업(ORM, DI, REST 컨트롤러 등)을 사전에 처리합니다.
    • 바이트코드에 직접 기록되고 패키지의 일부가 됩니다.
  • 정적 초기화 (Static Init)
    • Runtime 동안 정적 초기화 메소드를 먼저 실행합니다.
    • native mode 에서는 Build time 에 실행되기 때문에 정적 초기화는 실행되지 않습니다.
  • 런타임 초기화 (Runtime Init)
    • 고전적인 런타임 실행합니다.

컨테이너를 위한 프레임워크

Quarkus는 컨테이너를 위한 프레임워크입니다. 그래서 빠른 시작시간과 적은 메모리 사용률을 위해 설계되었습니다. 다음은 이를 위한 Quarkus의 방법을 소개해 드립니다.

Build Time Processing

Configuration parsing, classpath scanning, feature toggle based on classloading 등 기존 프레임워크가 런타임에 수행하는 작업을 빌드 시간에 수행합니다. 그래서 빌드타임의 시간은 길어지지만, 실제로 런타임 하기 위한 시간을 매우 단축됩니다.

Quarkus Build Time Principle

Reflection 사용량 줄이기

Reflection을 피해서 startup time과 memory usage 줄이고 있습니다. Reflection은 객체를 통해 클래스의 정보를 분석해 내는 기법으로 Spring Framework의 BeanFactory가 사용하는 방법입니다.

GrralVM Native Image 최우선 지원

Native Executable 지원으로 빠르게 실행되고 적은 Heap으로 실행이 가능합니다. GraalVM으로 수행되어 Java VM이 없어도 네이티브 애플리케션으로 수행이 가능합니다.

Native Image pre-boot

네이티브 이미지 빌드 프로세스 동안 가능한 많은 프레임워크를 사전 부팅합니다. 그래서 부팅 시간이 빠릅니다.

답글 남기기

이메일 주소는 공개되지 않습니다.