마이크로서비스 기반 애플리케이션 설계

마이크로서비스 아키텍처를 사용하여 애플리케이션을 설계할 때 마이크로서비스 모범 사례 및 마이크로서비스 개발을 위한 12가지 성공 패턴을 준수하는 것이 좋습니다. 이러한 패턴은 12단계 앱 고려 사항을 통합하고, 컨버지드 데이터베이스와 함께 마이크로서비스 배포 경험을 바탕으로 구축됩니다.

마이크로서비스 설계를 위한 모범 사례 학습

마이크로서비스 설계 시 특정 모범 사례를 따르면 애플리케이션의 확장, 배포 및 유지 관리가 간편해집니다. 여기에 설명된 모범 사례 중 일부가 애플리케이션과 관련이 있는 것은 아닙니다.

각 마이크로서비스는 애플리케이션 기능의 단일 부분을 구현해야 합니다. 개발 팀은 각 마이크로서비스의 제한과 책임을 정의해야 합니다. 한 가지 접근 방법은 애플리케이션에서 자주 요청되는 각 작업에 대해 마이크로서비스를 정의하는 것입니다. 또 다른 접근 방법은 기능을 비즈니스 태스크별로 나누고 각 영역에 대해 마이크로서비스를 정의하는 것입니다.

설계에서 다음 요구 사항을 고려하십시오.

  • 응답형 마이크로서비스: 서비스가 실패해도 마이크로서비스는 요청 클라이언트에 응답을 반환해야 합니다.
  • 역호환성: 마이크로서비스의 기능을 추가하거나 업데이트할 때 API 메소드 및 매개변수의 변경사항이 클라이언트에 영향을 미치지 않아야 합니다. REST API는 역호환성을 유지해야 합니다.
  • 유연한 통신: 각 마이크로서비스는 클라이언트와 API 게이트웨이 간의 통신 및 마이크로서비스 간의 통신에 사용해야 하는 프로토콜을 지정할 수 있습니다.
  • Idempotency: 클라이언트가 마이크로서비스를 여러 번 호출하는 경우 동일한 결과를 생성해야 합니다.
  • 효율적인 작업: 설계를 통해 쉽게 모니터링하고 문제를 해결할 수 있어야 합니다. 로그 시스템은 일반적으로 이러한 요구 사항을 구현하는 데 사용됩니다.

마이크로서비스의 성공을 위한 12가지 패턴 이해

마이크로서비스는 구현하기가 어렵고, 이 12가지 패턴을 사용하면 컨테이너 및 Kubernetes와 함께 컨버지드 데이터베이스 플랫폼을 사용하여 마이크로서비스 아키텍처의 민첩성과 단순성 이점을 쉽게 활용할 수 있습니다.

  1. 제한된 컨텍스트: 데이터 리팩토링 권고자를 사용하여 미리 설계하거나 모놀리스를 마이크로서비스로 분할합니다.
  2. 커플링 느슨함: 스키마를 마이크로서비스에 격리하고 신뢰할 수 있는 이벤트 메시를 사용하여 데이터를 분리합니다.
  3. 마이크로서비스용 CI/CD: 멀티 테넌트 데이터베이스는 마이크로서비스에 자연스럽게 적합합니다. 플러그인할 수 있는 데이터베이스(PDB)를 추가하여 독립적으로 배치 및 구축합니다. 앱(Jenkins 포함)과 스키마(Liquibase, Flyway 및 EBR 데이터베이스 포함)도 좋은 선택입니다.
  4. 마이크로서비스 보안: API 게이트웨이에서 로드 밸런서, 이벤트 메시, 데이터베이스까지 각 엔드포인트를 보호합니다.
  5. 마이크로서비스에 대한 통합 관찰 가능성: 측정지표, 로그 및 추적을 단일 대시보드로 통합하여 튜닝 및 자가 치유가 가능합니다.
  6. 트랜잭션 아웃박스: 단일 로컬 트랜잭션에서 메시지 및 데이터 조작 작업을 전송합니다.
  7. 신뢰할 수 있는 이벤트 메시: 처리량이 높은 트랜잭션 메시징 및 pub 및 sub를 사용하는 모든 이벤트에 대한 이벤트 메시, 이벤트 변환 및 이벤트 라우팅.
  8. 이벤트 집계: 이벤트는 임시이며 실시간 작업을 통지하거나 트리거합니다. 그 후에 이벤트는 데이터베이스로 집계됩니다. 데이터베이스는 압축된 궁극적인 항목입니다.
  9. CQRS(명령 질의 권한 분리): 마이크로서비스에 사용할 수 있는 데이터의 운영 및 분석 복사본입니다.
  10. Sagas: 데이터베이스에서 이벤트 메시 및 에스크로 저널링을 지원하는 마이크로서비스 간 트랜잭션입니다.
  11. 다언어 프로그래밍: JSON을 페이로드로 사용하여 다양한 언어로 된 마이크로서비스 및 메시지 형식을 지원합니다.
  12. 서비스형 백엔드(BaaS): 모든 클라우드 또는 온프레미스 배포, Spring Boot Apps용 테스트, 개발 및 프로덕션 배포(소형에서 중형)에 적합한 마이크로서비스 인프라입니다.

제한된 컨텍스트 패턴으로 시작

마이크로서비스에 대한 지속성을 구현하는 권장 패턴은 컨테이너 데이터베이스에서 단일 PDB(플러그인할 수 있는 데이터베이스)를 사용하는 것입니다. 각 마이크로서비스에 대해 영구 데이터를 전용으로 유지하고, 마이크로서비스 구현의 일부로 플러거블 데이터베이스를 생성합니다.

이 패턴에서 개인 영구 데이터는 마이크로서비스 API를 통해서만 액세스할 수 있습니다.

다음 그림은 마이크로서비스의 지속성 설계를 보여줍니다.

다음은 microservices_persistence.png에 대한 설명입니다.
microservices_persistence.png 그림 설명
이 마이크로서비스 구현의 다음 변형이 컨버지드 데이터베이스에 적용됩니다.
  • 전용(Private) 테이블: 각 서비스는 일련의 테이블 또는 문서를 소유합니다.
  • 스키마: 각 서비스는 전용(private) 데이터베이스 스키마 또는 컬렉션을 소유합니다.
  • 데이터베이스: 각 서비스는 그림에 표시된 것처럼 컨테이너 데이터베이스 내에서 플러그 가능한 데이터베이스를 소유합니다.

마이크로서비스를 위한 지속성 안티패턴은 여러 마이크로서비스에서 하나의 데이터베이스 스키마를 공유하는 것입니다. 데이터 일관성을 위해 원자적이고 일관적이며 격리된 지속 가능한 트랜잭션을 구현할 수 있습니다. 이 안티 패턴의 장점은 간단한 데이터베이스를 사용한다는 것입니다. 단점은 데이터베이스에 액세스하는 동안 마이크로서비스가 서로를 방해할 수 있다는 점이며, 서로 다른 마이크로서비스의 개발자가 스키마 변경을 조정해야 하므로 개발 주기가 느려질 수 있으므로 서비스 간 종속성도 증가합니다.

마이크로서비스는 Oracle Cloud Infrastructure에서 실행 중인 Oracle Database 인스턴스에 연결할 수 있습니다. Oracle 멀티 테넌트 데이터베이스는 한 컨테이너 내에서 여러 개의 PDB(플러그 가능한 데이터베이스)를 지원합니다. 이는 데이터, 보안 및 고가용성의 한정된 컨텍스트 격리를 위해 마이크로서비스를 위한 지속성 계층에 가장 적합합니다. 대부분의 경우 스키마 레벨 격리에 더 적은 수의 PDB를 사용할 수 있습니다.

컨테이너에 마이크로서비스 배포의 가치 이해

마이크로서비스를 구축한 후에는 컨테이너화해야 합니다. 자체 컨테이너에서 실행되는 마이크로서비스는 다른 컨테이너에 배포된 마이크로서비스에 영향을 주지 않습니다.

컨테이너는 애플리케이션을 개발, 배송 및 배포하는 데 사용되는 표준화된 소프트웨어 단위입니다.

컨테이너는 Docker와 같은 컨테이너 엔진을 사용하여 관리됩니다. 컨테이너 엔진은 모든 애플리케이션 종속성을 컨테이너로 묶는 데 필요한 도구를 제공합니다.

Docker 엔진을 사용하여 컨테이너에서 마이크로서비스 애플리케이션을 생성, 배포 및 실행할 수 있습니다. Docker 컨테이너에서 실행되는 마이크로서비스의 특성은 다음과 같습니다.

  • 표준: 마이크로서비스는 이식 가능합니다. 어디서든 달릴 수 있다.
  • 경량: Docker는 OS(운영 체제) 커널을 공유하고, 각 인스턴스에 OS를 필요로 하지 않으며, 경량 프로세스로 실행됩니다.
  • 보안: 각 컨테이너는 격리된 프로세스로 실행됩니다. 따라서 마이크로서비스는 안전합니다.

마이크로서비스 컨테이너화 프로세스에는 Dockerfile 생성, 종속성 및 환경 구성이 포함된 컨테이너 이미지 생성 및 구축, Docker 엔진에 이미지 배포, 저장 및 검색을 위해 컨테이너 레지스트리에 이미지 업로드가 포함됩니다.

다음은 docker_container_process.png에 대한 설명입니다.
docker_container_process.png 그림 설명

Kubernetes를 사용한 마이크로서비스 조정에 대해 알아보기

컨테이너에서 실행되는 마이크로서비스는 필요한 애플리케이션 기능을 제공하기 위해 상호 작용하고 통합할 수 있어야 합니다. 이러한 통합은 컨테이너 통합을 통해 수행할 수 있습니다.

컨테이너 통합관리를 사용하면 클러스터에서 컨테이너를 시작, 정지 및 그룹화할 수 있습니다. 또한 고가용성 및 확장이 가능합니다. Kubernetes는 컨테이너 관리에 사용할 수 있는 컨테이너 통합관리 플랫폼 중 하나입니다.

마이크로서비스를 컨테이너화한 후 Oracle Cloud Infrastructure Container Engine for Kubernetes에 배포할 수 있습니다.

컨테이너화된 마이크로서비스 애플리케이션을 클라우드에 배포하기 전에 다음과 같이 로컬 Kubernetes 엔진에서 배포하고 테스트해야 합니다.

  • 마이크로서비스 애플리케이션을 생성합니다.
  • Docker 이미지를 구축하여 마이크로서비스를 컨테이너화합니다.
  • 로컬 Docker 엔진에서 마이크로서비스를 실행합니다.
  • 컨테이너 이미지를 컨테이너 레지스트리로 푸시합니다.
  • Minikube와 같은 로컬 Kubernetes 엔진에서 마이크로서비스를 배포하고 실행합니다.

로컬 Kubernetes 엔진에서 애플리케이션을 테스트한 후 다음과 같이 Oracle Cloud Infrastructure Container Engine for Kubernetes에 배포합니다.

  • 클러스터 생성.
  • kubeconfig 파일을 다운로드합니다.
  • 로컬 장치에 kubectl 도구를 설치합니다.
  • deployment.yaml 파일을 준비합니다.
  • 클러스터에 마이크로서비스를 배치합니다.
  • 마이크로서비스를 테스트합니다.

다음 다이어그램은 Oracle Cloud Infrastructure Container Engine for Kubernetes에 컨테이너화된 마이크로서비스 애플리케이션을 배포하는 프로세스를 보여줍니다.

다음은 oke_deployment_process.png에 대한 설명입니다.
oke_deployment_process.png 그림 설명

Oracle Backend for Spring Boot and Microservices에 대한 자세한 내용

Spring Boot는 Java에서 마이크로서비스를 구축하기 위한 가장 널리 사용되는 프레임워크입니다. 마이크로서비스 아키텍처의 성공적인 배포를 위한 12가지 패턴 중 하나는 서비스형 백엔드(BaaS) 패턴입니다. Oracle BaaS은 OCI Marketplace에서 30분 이내에 Terraform 및 Ansible을 사용하여 배포할 수 있습니다. Oracle BaaS는 마이크로서비스 배포 및 운영에 필요한 플랫폼 서비스 세트를 제공하며 Spring Boot 환경에 필수적입니다. Oracle Backend for Spring Boot and Microservices 플랫폼에 대한 자세한 내용은 아래 다이어그램을 참조하십시오.