DAPR을 사용하여 마이크로 서비스를 조정합니다. 통합 접근

DAPR을 사용하여 마이크로 서비스를 조정합니다. 통합 접근

소개

현대 소프트웨어 아키텍처는 확장 성, 유연성 및 탄력성을 향상시키기 위해 마이크로 서비스를 점점 더 수용하고 있습니다. 그러나 시스템 수가 확장됨에 따라 서비스 간 통신, 데이터 지속성, 이벤트 중심 메시징 및 보안 관리가 더욱 복잡해집니다. 또한 제품 규모로서 조직은 종종 특정 데이터베이스 제공 업체, 메시징 미들웨어 또는 클라우드 공급 업체에 대한 강력한 의존성을 부주의하게 개발합니다. 이 단단한 커플 링은 미래의 변화가 어려워지고 종종 광범위한 리팩토링이 필요합니다.

애정 (배포 응용 프로그램 런타임) 이러한 문제를 처리하기위한 통합 추상화를 제공하여 마이크로 서비스가 데이터베이스, 메시지 대기열, API 및 비밀 저장소와 클라우드 공유 및 인프라 독립적 인 방식으로 상호 작용할 수 있도록합니다.

데이터베이스, 메시지 대기열, API 및 비밀 사이의 상호 작용을 허용하는 DAPR의 시각적 표현으로 통합 추상화가 가능합니다.

그림 1 : DAPR의 작동 방식

이 기사는 OMS (Order Management System)를 예로 사용하여 DAPR이 마이크로 서비스 오케스트레이션을 단순화하는 방법을 살펴 봅니다. 우리는 시연 할 것입니다 :

  • 데이터베이스 액세스 국가 관리를 위해
  • 이벤트 중심 메시징 서비스 전반에 걸쳐 데이터 처리
  • 서비스-서비스 호출 서비스 간 통신 용
  • 보안 비밀 관리 자격 증명을 처리합니다

데이터베이스 액세스, 이벤트 중심 메시징, 서비스 간 서비스 및 보안 비밀 관리를 허용하여 DAPR이 마이크로 서비스 오케스트레이션을 단순화하는 방법에 대한 다이어그램.

그림 2 : DAPR이 마이크로 서비스 오케스트레이션을 단순화하는 방법

단단한 커플 링없이 상태를 관리합니다

마이크로 서비스의 기본 요구 중 하나는 지속적인 저장소입니다. DAPR은 특정 제공 업체에 연결된 데이터베이스 SDK를 사용하는 대신 PostgreSQL, DynamoDB 및 Redis와 같은 여러 데이터베이스에서 작동하는 상태 관리 API를 제공합니다.

구성

데이터베이스 액세스를 활성화하기 위해 아래에 표시된대로 구성 요소 파일을 작성하여 DAPR을 AWS DynamoDB를 사용하도록 구성합니다.

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: orderstatestore
  namespace: default
spec:
  type: state.aws.dynamodb
  version: v1
  metadata:
  - name: region
    value: us-east-1
  - name: table
    value: OrdersTable
  - name: partitionKey
    value: orderId

이 구성은 DAPR에게 DynamODB를 스토리지 백엔드로 사용하도록 지시합니다.

DAPR API를 통한 데이터 저장 및 검색

AWS SDK와 직접 통합하는 대신 주문 서비스는 DAPR의 상태 API를 통해 데이터베이스와 상호 작용합니다.

import io.dapr.client.DaprClient;
import io.dapr.client.DaprClientBuilder;
import org.springframework.stereotype.Service;

@Service
public class OrderService {

    private static final String STATE_STORE_NAME = "orderstatestore";
    private final DaprClient daprClient;

    public OrderService() {
        this.daprClient = new DaprClientBuilder().build();
    }

    public void createOrder(Order order) {
      	//Blocking (Synchronous) Approach
        daprClient.saveState(STATE_STORE_NAME, order.getOrderId(), order).block();
    }

    public Order getOrder(String orderId) {
        return daprClient.getState(STATE_STORE_NAME, orderId, Order.class).block().getValue();
    }
}

DAPR의 상태 API를 사용하여 기본 데이터베이스가 추상화되어 원활한 마이그레이션이 가능합니다. 이를 통해 애플리케이션 코드 내에서 AWS 특이 적 구성이 필요하지 않으므로 개발자는 비즈니스 로직을 수정하지 않고 데이터베이스를 전환 할 수 있습니다.

펍/서브 메시징 : 이벤트 중심 데이터 처리

많은 마이크로 서비스는 서비스가 메시지 중개인을 통해 통신하는 이벤트 중심의 아키텍처를 따릅니다. Kafka, RabbitMQ 또는 AWS SNS/SQS와 직접 통합하는 대신 DAPR은 일반적인 Pub/Sub API를 제공합니다.

구성

이벤트 중심 메시징을 활성화하려면 다음과 같이 DAPR을 AWS SNS를 사용하도록 구성합니다.

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: orderspubsub
  namespace: default
spec:
  type: pubsub.aws.sns
  version: v1
  metadata:
  - name: region
    value: us-east-1
  - name: topic
    value: orderCreatedTopic

출판 이벤트

주문이 작성되면 AWS SDK를 직접 사용하지 않고 AWS SNS에 이벤트를 게시합니다. 이를 통해 다운 스트림 애플리케이션은 배송 및 청구와 같은 후속 프로세스를 트리거 할 수 있습니다.

import io.dapr.client.DaprClient;
import io.dapr.client.DaprClientBuilder;
import org.springframework.stereotype.Service;

@Service
public class OrderEventPublisher {

    private final DaprClient daprClient;

    public OrderEventPublisher() {
        this.daprClient = new DaprClientBuilder().build();
    }

    public void publishOrderCreatedEvent(Order order) {
      	//Publish as Fan-out message for point to point use invokeMethod
        daprClient.publishEvent("orderspubsub", "orderCreatedTopic", order).block();
    }
}

가입 이벤트

DAPR 구독 파일 생성 (order-subscription.yaml) 서비스가 주문 제작 이벤트를들을 수 있도록 :

apiVersion: dapr.io/v1alpha1
kind: Subscription
metadata:
  name: order-subscription
spec:
  pubsubname: orderspubsub
  topic: orderCreatedTopic
  route: /orders
scopes:
  - payment-service

지불 서비스는 주문 이벤트에 대해 듣습니다.

import org.springframework.web.bind.annotation.*;

@RestController
public class PaymentEventListener {

    @Topic(name = "orderCreatedTopic", pubsubName = "orderspubsub")
    @PostMapping("/orders")
    public void handleOrderEvent(@RequestBody Order order) {
        System.out.println("Processing payment for Order ID: " + order.getOrderId());
      	// Implement further processing (e.g., triggering shipping)
    }
}

이 주문은 주문 및 지불 서비스를 해체하여 독립적으로 확장 할 수 있습니다.

서비스 호출

DAPR은 기존 REST API와 같은 하드 코딩 URL을 사용하는 대신 마이크로 서비스를 동적으로 통신 할 수 있도록합니다.

결제 서비스는 정확한 호스트 이름/IP를 알지 못하고 DAPR을 통해 주문 세부 정보를 검색합니다.

import io.dapr.client.DaprClient;
import io.dapr.client.DaprClientBuilder;
import org.springframework.stereotype.Service;

@Service
public class PaymentService {

    private final DaprClient daprClient;

    public PaymentService() {
        this.daprClient = new DaprClientBuilder().build();
    }

    public Order getOrderDetails(String orderId) {
        return daprClient.invokeMethod("orderservice", "orders/" + orderId, null, Order.class).block();
    }
}

DAPR이 자동으로 네트워킹을 관리하므로 서비스를 처리하거나 하드 코딩 된 주소를 관리 할 필요가 없습니다.

비밀 관리

DAPR은 환경 변수 또는 애플리케이션 속성에 자격 증명을 저장하는 대신 비밀 관리 API를 제공하여 AWS Secrets Manager 또는 Hashicorp Vault와 같은 공급자의 비밀을 안전하게 검색 할 수 있습니다.

구성

다음은 DAPR을 사용하여이를 구성하는 방법입니다.

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: aws-secrets
  namespace: default
spec:
  type: secretstores.aws.secretsmanager
  version: v1
  metadata:
  - name: region
    value: us-east-1

비밀 검색

주문 서비스는 DAPR의 비밀 상점 API를 통해 자격 증명을 안전하게 검색합니다.

import io.dapr.client.DaprClient;
import io.dapr.client.DaprClientBuilder;
import org.springframework.stereotype.Service;

import java.util.Map;

@Service
public class SecretService {

    private final DaprClient daprClient;

    public SecretService() {
        this.daprClient = new DaprClientBuilder().build();
    }

    public Map getDatabaseSecrets() {
        return daprClient.getSecret("aws-secrets", "dbPassword").block();
    }
}

이를 통해 자격 증명이 안전하게 저장되고 필요한 경우에만 액세스 할 수 있습니다.

결론

DAPR은 데이터베이스 액세스, 메시징, 서비스 호출 및 비밀 관리를위한 통합 된 클라우드 공유의 추상화로 마이크로 서비스 오케스트레이션을 간소화합니다. Polyglot Architectures를 지원하여 인프라 종속성없이 다양한 프로그래밍 언어에서 원활한 상호 작용을 가능하게합니다. 개발자는 데이터베이스 및 메시징 구성 요소를 통합하여 공급 업체 잠금없이 확장 가능하고 유지 관리 가능한 시스템을 구축 할 수 있습니다. 회로 차단기, 리트리 및 관찰 가능성과 같은 내장 기능을 사용하여 DAPR은 탄력성을 향상시키고 복잡성을 줄이며 서비스를 독립적으로 발전시킬 수 있습니다. 인프라 문제를 추상화함으로써 팀은 비즈니스 로직에 집중하고 개발을 가속화하며 클라우드 또는 하이브리드 환경에서 확장 가능한 분산 시스템을 지원할 수 있습니다.

출처 참조

Post Comment

당신은 놓쳤을 수도 있습니다