Introduzione
Le moderne architetture di software program stanno abbracciando sempre più microservizi per migliorare la scalabilità, la flessibilità e la resilienza. Tuttavia, man mano che il numero di sistemi si espande, la gestione della comunicazione inter-servizio, della persistenza dei dati, della messaggistica guidata dagli eventi e della sicurezza diventa più complessa. Inoltre, poiché una scala di prodotti, le organizzazioni spesso sviluppano inavvertitamente forti dipendenze da fornitori di database specifici, middleware di messaggistica o fornitori di cloud. Questo accoppiamento stretto rende i cambiamenti futuri impegnativi, che spesso richiedono un ampio refactoring.
Dapr (Runtime dell’applicazione distribuita) Offre un’astrazione unificata per la gestione di queste preoccupazioni, consentendo ai microservizi di interagire con database, code di messaggi, API e segreti in modo indipendente dal cloud e indipendente dall’infrastruttura.
Figura 1: come funziona DAPR
Questo articolo esplora come DAPR semplifica Orchestrazione dei microservizi, utilizzando un sistema di gestione degli ordini (OMS) come esempio. Dimostreremo:
- Accesso al database per la gestione dello stato
- Messaggi guidati da eventi Per l’elaborazione dei dati attraverso i servizi
- Invocazione da servizio a servizio per comunicazione inter-servizio
- Gestione sicura dei segreti per la gestione delle credenziali
Figura 2: come DAPR semplifica l’orchestrazione dei microservizi
Gestire lo stato senza accoppiamento stretto
Uno dei fondamentali esigenze nei microservizi è una conservazione persistente. Invece di utilizzare un SDK di database legato a un supplier specifico, DAPR fornisce un’API di gestione dello stato che funziona su più database come PostgreSQL, DynamoDB e Redis.
Configurazione
Per abilitare l’accesso al database, configuriamo DAPR per utilizzare AWS DynamoDB Creando un file componente come visualizzato di seguito:
apiVersion: dapr.io/v1alpha1
form: Element
metadata:
identify: orderstatestore
namespace: default
spec:
sort: state.aws.dynamodb
model: v1
metadata:
- identify: area
worth: us-east-1
- identify: desk
worth: OrdersTable
- identify: partitionKey
worth: orderId
Questa configurazione cube a DAPR di utilizzare DynamoDB come backend di archiviazione.
Salvataggio e recupero dei dati tramite API DAPR
Invece di integrarsi direttamente con AWS SDKSIl nostro servizio di ordine interagisce con il database tramite API di stato di DAPR:
import io.dapr.consumer.DaprClient;
import io.dapr.consumer.DaprClientBuilder;
import org.springframework.stereotype.Service;
@Service
public class OrderService {
personal static ultimate String STATE_STORE_NAME = "orderstatestore";
personal ultimate DaprClient daprClient;
public OrderService() {
this.daprClient = new DaprClientBuilder().construct();
}
public void createOrder(Order order) {
//Blocking (Synchronous) Method
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();
}
}
Utilizzando l’API di stato di DAPR, il database sottostante è astratto, consentendo la migrazione senza soluzione di continuità. Ciò elimina la necessità di configurazioni specifiche di AWS all’interno del codice dell’applicazione, consentendo agli sviluppatori di cambiare database senza modificare la logica aziendale.
Pub/Sub Messaging: elaborazione dei dati basati su eventi
Molti microservizi seguono architetture basate sugli eventi in cui i servizi comunicano tramite dealer di messaggi. Invece di integrarsi direttamente con Kafka, Rabbitmq o AWS SNS/SQSDAPR fornisce un pub/API generico.
Configurazione
Per abilitare la messaggistica guidata da eventi, configuriamo DAPR per utilizzare SNS AWS come visto di seguito:
apiVersion: dapr.io/v1alpha1
form: Element
metadata:
identify: orderspubsub
namespace: default
spec:
sort: pubsub.aws.sns
model: v1
metadata:
- identify: area
worth: us-east-1
- identify: subject
worth: orderCreatedTopic
Eventi editoriali
Una volta creato un ordine, pubblichiamo un evento su AWS SNS senza usare direttamente AWS SDK. Ciò consente alle applicazioni a valle di attivare processi successivi, come la spedizione e la fatturazione.
import io.dapr.consumer.DaprClient;
import io.dapr.consumer.DaprClientBuilder;
import org.springframework.stereotype.Service;
@Service
public class OrderEventPublisher {
personal ultimate DaprClient daprClient;
public OrderEventPublisher() {
this.daprClient = new DaprClientBuilder().construct();
}
public void publishOrderCreatedEvent(Order order) {
//Publish as Fan-out message for level to level use invokeMethod
daprClient.publishEvent("orderspubsub", "orderCreatedTopic", order).block();
}
}
Eventi di abbonamento
Crea un file di abbonamento DAPR (order-subscription.yaml
) in modo che il servizio possa ascoltare l’evento creato dall’ordine:
apiVersion: dapr.io/v1alpha1
form: Subscription
metadata:
identify: order-subscription
spec:
pubsubname: orderspubsub
subject: orderCreatedTopic
route: /orders
scopes:
- payment-service
Il servizio di pagamento ascolta per gli eventi dell’ordine:
import org.springframework.net.bind.annotation.*;
@RestController
public class PaymentEventListener {
@Matter(identify = "orderCreatedTopic", pubsubName = "orderspubsub")
@PostMapping("/orders")
public void handleOrderEvent(@RequestBody Order order) {
System.out.println("Processing fee for Order ID: " + order.getOrderId());
// Implement additional processing (e.g., triggering delivery)
}
}
Questo disaccoppia i servizi di ordine e pagamento, consentendo loro di ridimensionare in modo indipendente.
Invocazione del servizio
Invece di utilizzare URL con codice rigido come le API di riposo tradizionali, DAPR consente ai microservizi di comunicare in modo dinamico.
Il servizio di pagamento recupera i dettagli dell’ordine tramite DAPR senza conoscere il proprio nome host/IP esatto:
import io.dapr.consumer.DaprClient;
import io.dapr.consumer.DaprClientBuilder;
import org.springframework.stereotype.Service;
@Service
public class PaymentService {
personal ultimate DaprClient daprClient;
public PaymentService() {
this.daprClient = new DaprClientBuilder().construct();
}
public Order getOrderDetails(String orderId) {
return daprClient.invokeMethod("orderservice", "orders/" + orderId, null, Order.class).block();
}
}
I servizi non sono necessari per gestire la scoperta o la gestione degli indirizzi hardcoded, poiché DAPR si occupa automaticamente del networking.
Gestione dei segreti
Invece di archiviare le credenziali nelle variabili di ambiente o nelle proprietà dell’applicazione, DAPR fornisce un’API di gestione dei segreti, consentendo un recupero sicuro di segreti da supplier come AWS Secrets and techniques Supervisor o Hashicorp Volta.
Configurazione
Di seguito è riportato come configurarlo usando DAPR:
apiVersion: dapr.io/v1alpha1
form: Element
metadata:
identify: aws-secrets
namespace: default
spec:
sort: secretstores.aws.secretsmanager
model: v1
metadata:
- identify: area
worth: us-east-1
Recreti di recupero
Il servizio di ordine recupera in modo sicuro le credenziali tramite API del negozio segreto di DAPR:
import io.dapr.consumer.DaprClient;
import io.dapr.consumer.DaprClientBuilder;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
public class SecretService {
personal ultimate DaprClient daprClient;
public SecretService() {
this.daprClient = new DaprClientBuilder().construct();
}
public Map getDatabaseSecrets() {
return daprClient.getSecret("aws-secrets", "dbPassword").block();
}
}
Ciò garantisce che le credenziali siano conservate in modo sicuro e accessibili solo quando necessario.
Conclusione
DAPR semplifica l’orchestrazione di microservizi con un’astrazione unificata, agnostica cloud per l’accesso al database, la messaggistica, l’invocazione del servizio e la gestione dei segreti. Supporta le architetture poliglotte, consentendo un’interazione senza soluzione di continuità in diversi linguaggi di programmazione senza dipendenze infrastrutturali. Integrando i componenti del database e della messaggistica, gli sviluppatori possono costruire sistemi scalabili e mantenibili senza blocco dei fornitori. Con caratteristiche combine come interruttori, tentativi e osservabilità, DAPR migliora la resilienza, riduce la complessità e consente ai servizi di evolversi in modo indipendente. Estrattando le preoccupazioni sulle infrastrutture, consente ai group di concentrarsi sulla logica aziendale, accelerare lo sviluppo e supportare sistemi scalabili e distribuiti in qualsiasi ambiente cloud o ibrido.