DAPR을 사용하여 마이크로 서비스를 조정합니다. 통합 접근
소개
현대 소프트웨어 아키텍처는 확장 성, 유연성 및 탄력성을 향상시키기 위해 마이크로 서비스를 점점 더 수용하고 있습니다. 그러나 시스템 수가 확장됨에 따라 서비스 간 통신, 데이터 지속성, 이벤트 중심 메시징 및 보안 관리가 더욱 복잡해집니다. 또한 제품 규모로서 조직은 종종 특정 데이터베이스 제공 업체, 메시징 미들웨어 또는 클라우드 공급 업체에 대한 강력한 의존성을 부주의하게 개발합니다. 이 단단한 커플 링은 미래의 변화가 어려워지고 종종 광범위한 리팩토링이 필요합니다.
애정 (배포 응용 프로그램 런타임) 이러한 문제를 처리하기위한 통합 추상화를 제공하여 마이크로 서비스가 데이터베이스, 메시지 대기열, API 및 비밀 저장소와 클라우드 공유 및 인프라 독립적 인 방식으로 상호 작용할 수 있도록합니다.
그림 1 : DAPR의 작동 방식
이 기사는 OMS (Order Management System)를 예로 사용하여 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