Il Framework Axon è una potente libreria che semplifica la creazione di applicazioni basate su CQRS (Command Query Responsibility Segregation) e Event Sourcing. In questo articolo, esploreremo i concetti chiave di Axon e mostreremo come integrarlo con Spring Boot per realizzare un’applicazione di prova completa.
Cos’è il framework Axon?
Axon è un framework open-source scritto in Java che fornisce un set di strumenti per la creazione di applicazioni basate su CQRS e Event Sourcing. Ecco alcuni dei principali concetti di Axon:
- CQRS: Questo approccio separa il modello di lettura (query) dal modello di scrittura (comando). Axon semplifica l’implementazione di questa separazione, consentendo di gestire i comandi e gli eventi in modo efficiente.
- Event Sourcing: Invece di memorizzare solo lo stato corrente di un’entità, Axon registra tutti gli eventi che hanno portato a tale stato. Questo consente di ricostruire lo stato corrente da zero, garantendo una tracciabilità completa.
- Aggregati: Axon modella le entità del dominio come aggregati, che rappresentano un insieme di oggetti correlati. Gli aggregati gestiscono i comandi e generano eventi.
- Saghe: Le saghe sono processi orchestrati che reagiscono agli eventi e coordinano le attività all’interno del sistema. Axon semplifica la gestione delle saghe.
Integrazione con Spring Boot
Axon offre un’ottima integrazione con Spring Framework. Sebbene non sia obbligatorio utilizzare Spring con Axon, l’utilizzo di Spring semplifica notevolmente la configurazione. Ecco alcuni punti chiave:
- Auto-configurazione: Axon fornisce uno starter Spring Boot che semplifica la configurazione. Basta dichiarare una dipendenza al modulo
axon-spring-boot-starter
, e Axon configurerà automaticamente i componenti infrastrutturali come il bus dei comandi, il bus degli eventi e il bus delle query. - JPA e Persistence Contexts: Axon si integra con Spring Data JPA per la gestione delle entità. Le entità JPA di Axon vengono automaticamente registrate nel contesto di persistenza predefinito. È possibile personalizzare questa configurazione includendo specifici pacchetti di entità Axon.
- Axon Spring Boot Starter: Questo starter segue le convenzioni di Spring Boot e si basa sul modulo
axon-spring-boot-autoconfigure
. Quando avvii un’applicazione Axon Spring Boot, il framework cerca un file chiamatospring.factories
nel classpath. Questo file contiene le configurazioni di auto-configurazione di Axon, tra cui la configurazione delle metriche, l’elaborazione degli eventi e altro ancora.
Esempio di Proof of Concept
Per dimostrare l’utilizzo di Axon con Spring Boot, creeremo un’applicazione di prova che gestisce un semplice aggregato. Immaginiamo di avere un’applicazione di e-commerce con prodotti e ordini. Creeremo un aggregato “Prodotto” che gestisce i comandi per aggiungere nuovi prodotti e gli eventi associati.
- Configurazione di Spring Boot: Creeremo un progetto Spring Boot e includeremo la dipendenza
axon-spring-boot-starter
. - Definizione dell’Aggregato: Creeremo una classe
ProductAggregate
che estendeAbstractAggregateRoot
. Questa classe gestirà i comandi e genererà gli eventi. - Comandi e Eventi: Definiremo i comandi come
CreateProductCommand
e gli eventi comeProductCreatedEvent
. - Handler dei Comandi: Implementeremo un handler per il comando
CreateProductCommand
che creerà un nuovo prodotto e genererà l’evento corrispondente. - Configurazione del Bus degli Eventi: Configureremo il bus degli eventi per gestire gli eventi generati dall’aggregato.
Obiettivo del PoC
Il nostro obiettivo è dimostrare l’utilizzo di Axon e Spring Boot per gestire un semplice scenario di business. Immaginiamo di avere un’applicazione di e-commerce con prodotti e ordini. Creeremo un aggregato “Prodotto” che gestisce i comandi per aggiungere nuovi prodotti e gli eventi associati.
Passi per Creare il PoC
1. Configurazione di Spring Boot
Iniziamo creando un progetto Spring Boot. Assicuriamoci di includere la dipendenza axon-spring-boot-starter
nel nostro file pom.xml
o build.gradle
. Questo starter semplifica la configurazione di Axon all’interno di un’applicazione Spring Boot.
2. Definizione dell’Aggregato
Creiamo una classe ProductAggregate
che estende AbstractAggregateRoot
. Questa classe rappresenterà il nostro aggregato “Prodotto”. Gli aggregati gestiscono i comandi e generano gli eventi. Ad esempio:
public class ProductAggregate extends AbstractAggregateRoot<String> {
@AggregateIdentifier
private String productId;
// Metodi per gestire i comandi
public void createProduct(String productId, String name, BigDecimal price) {
// Validazioni e logica di business
apply(new ProductCreatedEvent(productId, name, price));
}
// Metodi per gestire gli eventi
@EventSourcingHandler
private void on(ProductCreatedEvent event) {
this.productId = event.getProductId();
// Altri aggiornamenti dello stato
}
}
3. Comandi e Eventi
Definiamo i comandi come CreateProductCommand
e gli eventi come ProductCreatedEvent
. Ad esempio:
public class CreateProductCommand {
@TargetAggregateIdentifier
private final String productId;
private final String name;
private final BigDecimal price;
// Costruttore e getter
}
public class ProductCreatedEvent {
private final String productId;
private final String name;
private final BigDecimal price;
// Costruttore e getter
}
4. Handler dei Comandi
Implementiamo un handler per il comando CreateProductCommand
che creerà un nuovo prodotto e genererà l’evento corrispondente. Ad esempio:
@CommandHandler
public void handle(CreateProductCommand command) {
// Validazioni e logica di business
apply(new ProductCreatedEvent(command.getProductId(), command.getName(), command.getPrice()));
}
5. Configurazione del Bus degli Eventi
Configuriamo il bus degli eventi per gestire gli eventi generati dall’aggregato. Utilizziamo Spring Boot per configurare il bus degli eventi in modo automatico.
Conclusione
In questo articolo, abbiamo creato un semplice PoC utilizzando Axon e Spring Boot. Abbiamo definito un aggregato, gestito comandi ed eventi, e configurato il bus degli eventi. Questo esempio dimostra come Axon semplifica la gestione dei comandi e degli eventi all’interno di un’applicazione Spring Boot.