Introduzione al framework Axon con Spring Boot

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:

  1. 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.
  2. 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.
  3. Aggregati: Axon modella le entità del dominio come aggregati, che rappresentano un insieme di oggetti correlati. Gli aggregati gestiscono i comandi e generano eventi.
  4. 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 chiamato spring.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.

  1. Configurazione di Spring Boot: Creeremo un progetto Spring Boot e includeremo la dipendenza axon-spring-boot-starter.
  2. Definizione dell’Aggregato: Creeremo una classe ProductAggregate che estende AbstractAggregateRoot. Questa classe gestirà i comandi e genererà gli eventi.
  3. Comandi e Eventi: Definiremo i comandi come CreateProductCommand e gli eventi come ProductCreatedEvent.
  4. Handler dei Comandi: Implementeremo un handler per il comando CreateProductCommand che creerà un nuovo prodotto e genererà l’evento corrispondente.
  5. 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.

Comments are closed.