Micronaut — Cheat Sheet

Tag: micronaut, java, microservices, aot, graalvm, backend

Livello: intermedio

TL;DR: Framework JVM cloud-native che usa la compilazione Ahead-of-Time (AoT) per la Dependency Injection. Garantisce startup ultrarapidi e basso footprint di memoria, ideale per microservizi e serverless.

Concetti chiave

-

Dependency Injection (DI) e Aspect-Oriented Programming (AOP) risolti interamente a compile-time.

-

Nessun uso di reflection, proxy dinamici o classloading complesso a runtime.

-

Integrazione di prima classe con GraalVM per la generazione di Native Image leggere e veloci.

-

Server HTTP e client HTTP basati su Netty, completamente non bloccanti e reattivi.

-

Micronaut Data genera le query del database a compile-time, abbattendo l'overhead di JPA.

-

Scoperta automatica dei servizi e configurazione distribuita nativamente supportate.

-

Un bean privo di annotazioni di scope esplicite non è un singleton, ma si comporta come un prototype.

Domande tipiche e risposte pronte

-

Q: Che differenza c'è tra l'approccio di Micronaut e quello classico di Spring Boot?R: Micronaut risolve il grafo delle dipendenze in fase di compilazione usando gli annotation processor. Spring usa la reflection a runtime. Questo rende Micronaut più rapido all'avvio e meno esoso di memoria.

-

Q: Come realizzi un'integrazione HTTP verso un'API esterna?R: Creo un'interfaccia Java e le applico l'annotazione @Client. Micronaut genera automaticamente il codice per l'esecuzione della chiamata HTTP a compile-time.

Insidie e errori comuni

-

Omettere l'annotation processor (micronaut-inject-java) in Maven o Gradle. Questo impedisce la generazione dei bean e fa fallire l'applicazione in avvio.

-

Dimenticare di annotare un servizio con @Singleton. Micronaut creerà una nuova istanza del servizio ad ogni singola iniezione, sprecando memoria.

-

Integrare librerie di terze parti fortemente dipendenti dalla reflection senza fornire i file di configurazione reflection per GraalVM, causando crash nella Native Image.

Snippet e comandi

// Controller REST di base
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;

@Controller("/api/greeting")
public class GreetingController {

    @Get("/{name}")
    public String greet(String name) {
        return "Hello, " + name;
    }
}

Java

// Client HTTP dichiarativo
import io.micronaut.http.annotation.Get;
import io.micronaut.http.client.annotation.Client;

@Client("https://api.github.com")
public interface GithubClient {

    @Get("/users/{username}")
    String fetchUser(String username);
}

Bash

# Inizializzare un nuovo progetto tramite CLI
mn create-app com.example.demo --build=gradle --lang=java --features=graalvm

Da ripassare

-

[ ] Gestione del contesto di test tramite @MicronautTest

-

[ ] Meccanismi di resilienza: @Retryable, @Fallback e @CircuitBreaker

-

[ ] Utilizzo dei filtri HTTP server e client-side

Riferimenti

-

Documentazione Ufficiale Micronaut (docs.micronaut.io)

-

Micronaut Data Guides

Jarvis Interviews
Jarvis