Quarkus – supersonic Java framework

TL;DR: Quarkus to nowy framework Java od Red Hat, który kompiluje aplikacje do natywnego kodu. Rezultat? Aplikacje startują w milisekundach zamiast sekund i zużywają znacznie mniej pamięci RAM. Idealny dla microservices i kontenerów Docker.

Java zawsze była krytykowana za wolny start aplikacji i duże zużycie pamięci. W świecie kontenerów i microservices te problemy stają się jeszcze bardziej dotkliwe. Quarkus to odpowiedź Red Hat na te wyzwania – framework który łączy znajomy ekosystem Java z wydajnością porównywalną do Go czy Node.js.

Dlaczego Quarkus to przełom?

W erze cloud computing i Kubernetes każda sekunda startu aplikacji kosztuje. Tradycyjne aplikacje Spring Boot potrzebują 5-15 sekund na start, co w świecie autoskalowania jest wiecznością. Quarkus redukuje ten czas do 15-50 milisekund, jednocześnie zmniejszając zużycie pamięci z 200MB do około 50MB.

Co się nauczysz:

  • Czym jest Quarkus i dlaczego powstał
  • Jak działa kompilacja do natywnego kodu z GraalVM
  • Pierwsza aplikacja Quarkus krok po kroku
  • Kiedy wybrać Quarkus zamiast Spring Boot
  • Jakie są ograniczenia tego podejścia
Wymagania wstępne: Podstawowa znajomość Java 8+, Maven, doświadczenie z REST API. Znajomość Spring Boot będzie pomocna ale nie jest wymagana.

Czym jest Quarkus?

Quarkus to framework Java zaprojektowany od podstaw z myślą o kontenerach, microservices i cloud-native deployment. Jego kluczową cechą jest możliwość kompilacji aplikacji do natywnego kodu maszynowego przy użyciu GraalVM.

GraalVM – to maszyna wirtualna i kompilator od Oracle, który może kompilować kod Java bezpośrednio do natywnego kodu maszynowego, eliminując potrzebę JVM w runtime.

### Kluczowe cechy Quarkus:

– **Supersonic startup:** Aplikacje startują w milisekundach
– **Subatomic memory footprint:** Drastycznie mniejsze zużycie RAM
– **Developer Joy:** Hot reload i szybkie iteracje podczas developmentu
– **Standards-based:** Używa znanych standardów jak JAX-RS, CDI, JPA

Jak działa magia Quarkus?

Tradycyjne frameworki Java wykonują większość konfiguracji i refleksji w runtime. Quarkus przenosi te operacje do czasu kompilacji (build-time), pozostawiając w runtime tylko niezbędny kod.

Wyobraź sobie różnicę między gotowaniem od podstaw (tradycyjna Java) a podgrzaniem gotowego posiłku (Quarkus). Druga opcja jest znacznie szybsza, bo większość pracy została już wykonana wcześniej.

### Build-time vs Runtime

OperacjaTradycyjna JavaQuarkus
Skanowanie klasspathRuntimeBuild-time
Dependency injectionRuntimeBuild-time
Proxy generationRuntimeBuild-time
ConfigurationRuntimeBuild-time

Pierwsza aplikacja Quarkus

Stwórzmy prostą aplikację REST API w Quarkus. Proces jest podobny do Spring Boot, ale rezultat znacznie bardziej wydajny.

### Generowanie projektu

mvn io.quarkus:quarkus-maven-plugin:0.21.1:create \
    -DprojectGroupId=com.example \
    -DprojectArtifactId=my-quarkus-app \
    -DclassName="com.example.GreetingResource" \
    -Dpath="/hello"
Quarkus używa Maven jako domyślnego build tool, podobnie jak Spring Boot. Gradle support jest planowany na przyszłe wersje.

### Struktura projektu

Po wygenerowaniu otrzymamy standardową strukturę Maven:

my-quarkus-app/
├── pom.xml
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/example/GreetingResource.java
│   │   └── resources/
│   │       └── application.properties
│   └── test/
│       └── java/
│           └── com/example/GreetingResourceTest.java
└── target/

### Pierwszy endpoint

package com.example;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class GreetingResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "Hello Quarkus from Red Hat!";
    }
}
Pro tip: Quarkus używa standardu JAX-RS dla REST endpoints, więc jeśli znasz JAX-RS, od razu będziesz się czuł jak w domu. To znacznie łatwiejsze niż uczenie się nowej składni.

### Uruchomienie w trybie dev

./mvnw compile quarkus:dev

Aplikacja uruchomi się w trybie deweloperskim z hot reload. Każda zmiana w kodzie zostanie automatycznie przeładowana bez restartu aplikacji.

Dependency Injection w Quarkus

Quarkus używa standardu CDI (Contexts and Dependency Injection) zamiast własnego systemu DI jak Spring.

package com.example;

import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class GreetingService {
    
    public String greeting(String name) {
        return "Hello " + name + " from Quarkus service!";
    }
}
package com.example;

import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class GreetingResource {

    @Inject
    GreetingService greetingService;

    @GET
    @Path("/{name}")
    @Produces(MediaType.TEXT_PLAIN)
    public String greeting(@PathParam("name") String name) {
        return greetingService.greeting(name);
    }
}
CDI – Context and Dependency Injection to standardowy sposób zarządzania zależnościami w świecie Java EE/Jakarta EE. W przeciwieństwie do Springa, to oficjalny standard JSR-299.

Kompilacja do natywnego obrazu

Prawdziwa moc Quarkus ujawnia się podczas kompilacji do native image. Wymaga to zainstalowanego GraalVM.

### Instalacja GraalVM

# macOS
brew install graalvm/tap/graalvm-ce-19

# Linux - pobierz z GitHub releases
export GRAALVM_HOME=/path/to/graalvm
export PATH=$GRAALVM_HOME/bin:$PATH

### Kompilacja native image

./mvnw package -Pnative
Uwaga: Kompilacja native image może zająć kilka minut i wymaga dużo RAM (min. 4GB). To jednorazowy koszt za późniejszą błyskawiczną wydajność.

### Uruchomienie native image

./target/my-quarkus-app-1.0-SNAPSHOT-runner

# Start w <20ms!
2019-01-10 15:30:42,123 INFO  [io.quarkus] Quarkus 0.21.1 on JVM started in 0.015s.

Quarkus vs Spring Boot - kiedy wybrać co?

### Wybierz Quarkus gdy:
- Budujesz microservices z częstym skalowaniem
- Pracujesz w środowisku kontenerowym (Docker/Kubernetes)
- Startup time i zużycie pamięci są krytyczne
- Możesz zaakceptować dłuższy czas kompilacji
- Zespół zna standardy Java EE/Jakarta EE

### Zostań przy Spring Boot gdy:
- Masz duży, stabilny monolith
- Zespół ma wieloletnie doświadczenie ze Springiem
- Używasz wielu Spring-specific features
- Potrzebujesz maksymalnej elastyczności runtime
- Startup time nie jest problemem

Pułapka: Native image ma ograniczenia - nie wszystkie libraries działają out-of-the-box. Refleksja i dynamic class loading wymagają dodatkowej konfiguracji.

Ograniczenia Quarkus native image

### Co może nie działać:
- **Dynamic classloading:** Code generation w runtime
- **Reflection:** Wymaga explicit configuration
- **Resources:** Muszą być zdefiniowane w build time
- **Niektóre libraries:** Hibernate Search, niektóre JDBC drivers

Typowy błąd: Próba użycia reflection bez konfiguracji. GraalVM wymaga jawnego zdefiniowania wszystkich klas używanych przez refleksję w pliku reflection-config.json.

Rozszerzenia Quarkus

Quarkus posiada system extensions podobny do Spring Boot starters:

# Lista dostępnych extensions
./mvnw quarkus:list-extensions

# Dodanie extension
./mvnw quarkus:add-extension -Dextensions="hibernate-orm,jdbc-postgresql"

### Popularne extensions (stan na styczeń 2019):
- **quarkus-hibernate-orm:** JPA/Hibernate support
- **quarkus-jdbc-postgresql:** PostgreSQL driver
- **quarkus-smallrye-health:** Health checks
- **quarkus-smallrye-metrics:** Metrics collection
- **quarkus-smallrye-openapi:** OpenAPI/Swagger support

Czy Quarkus to competition dla Spring Boot?

Nie bezpośrednio. Quarkus celuje w cloud-native i kontenerowe deployment, gdzie startup time i memory footprint są kluczowe. Spring Boot nadal dominuje w enterprise applications gdzie te metryki są mniej ważne.

Czy muszę znać GraalVM żeby używać Quarkus?

Nie. Quarkus działa również na zwykłej JVM. Native compilation to opcja dla maksymalnej wydajności, ale nie jest wymagana do nauki i developmentu.

Jak długo trwa kompilacja native image?

Dla małej aplikacji REST 2-5 minut na współczesnym laptopie. Większe aplikacje mogą wymagać 10-20 minut. To jednorazowy koszt deploymentu.

Czy mogę migrować Spring Boot app do Quarkus?

Częściowo. JAX-RS jest podobne do Spring MVC, ale dependency injection używa CDI zamiast Spring DI. Potrzebny będzie refactoring części kodu.

Kto stoi za Quarkus?

Red Hat, firma znana z JBoss, Hibernate i innych enterprise Java tools. Quarkus to ich odpowiedź na trendy cloud-native.

Czy Quarkus jest gotowy na produkcję?

Stan na styczeń 2019: Quarkus jest w fazie aktywnego rozwoju (wersja 0.21). Pierwsze production deployments się pojawiają, ale dla krytycznych systemów warto poczekać na wersję 1.0.

Jakie są koszty infrastrukturalne?

Znacznie niższe. Aplikacja Quarkus może działać na instancji z 128MB RAM zamiast 512MB dla Spring Boot. W cloudzie to oznacza oszczędności na poziomie 60-70%.

Przydatne zasoby:

🚀 Zadanie dla Ciebie

Stwórz aplikację Quarkus z prostym REST API do zarządzania listą zadań (TODO list). Dodaj endpoint do tworzenia zadania POST /tasks i listowania GET /tasks. Zmierz startup time w trybie JVM i native image. Porównaj z odpowiednikiem w Spring Boot.

Bonus: Skonfiguruj health check endpoint i zbadaj memory usage podczas obciążenia.

Quarkus reprezentuje przyszłość Java w świecie cloud-native. Choć nadal jest w fazie rozwoju, już teraz pokazuje imponujące rezultaty wydajnościowe. Czy to oznacza koniec Spring Boot? Raczej nie, ale na pewno rozpoczyna nową erę konkurencji, która przynosi korzyści wszystkim Java developerom.

Czy planujesz wypróbować Quarkus w swoim następnym projekcie? Jakie są Twoje największe obawy związane z migracją z tradycyjnych frameworków?

Zostaw komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Przewijanie do góry