Java Microservices with Quarkus

Loading

Quarkus is a modern, Kubernetes-native Java framework tailored for building cloud-native and serverless applications. It is designed to optimize Java for containerized environments, offering fast startup times, low memory usage, and a developer-friendly experience. Below is a comprehensive guide to building microservices with Quarkus.


Key Features of Quarkus

  1. Fast Startup and Low Memory Usage: Optimized for containerized environments.
  2. Developer Joy: Live coding and hot reload for faster development.
  3. Unified Configuration: Centralized configuration for all extensions.
  4. Kubernetes-Native: Built-in support for Kubernetes, including health checks, metrics, and service discovery.
  5. Reactive and Imperative Programming: Supports both reactive and traditional imperative programming models.
  6. Extensive Ecosystem: Integrates with popular libraries like Hibernate, RESTEasy, and Apache Kafka.

Setting Up Quarkus

1. Install Quarkus CLI

The Quarkus CLI simplifies project creation and management. Install it using SDKMAN:

sdk install quarkus

2. Create a Quarkus Project

Use the Quarkus CLI or Maven to create a new project:

quarkus create app com.example:quarkus-microservice
cd quarkus-microservice

Alternatively, use Maven:

mvn io.quarkus:quarkus-maven-plugin:2.13.0.Final:create \
    -DprojectGroupId=com.example \
    -DprojectArtifactId=quarkus-microservice \
    -DclassName="com.example.GreetingResource" \
    -Dpath="/hello"
cd quarkus-microservice

Building a Simple Microservice

1. Define a REST Endpoint

Quarkus uses RESTEasy (JAX-RS implementation) for building RESTful APIs.

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!";
    }
}

2. Run the Application

Start the application in development mode:

./mvnw quarkus:dev

Visit http://localhost:8080/hello to see the output:

Hello, Quarkus!

Adding Database Support with Hibernate ORM

1. Add Dependencies

Add the Hibernate ORM and Panache extensions:

./mvnw quarkus:add-extension -Dextensions="quarkus-hibernate-orm-panache, quarkus-jdbc-h2"

2. Configure the Database

Add the following configuration to src/main/resources/application.properties:

quarkus.datasource.db-kind=h2
quarkus.datasource.jdbc.url=jdbc:h2:mem:test
quarkus.datasource.username=sa
quarkus.datasource.password=sa
quarkus.hibernate-orm.database.generation=drop-and-create

3. Define an Entity

Create a Book entity:

package com.example;

import io.quarkus.hibernate.orm.panache.PanacheEntity;
import javax.persistence.Entity;

@Entity
public class Book extends PanacheEntity {
    public String title;
    public String author;
    public int year;
}

4. Create a REST Endpoint for CRUD Operations

package com.example;

import javax.transaction.Transactional;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.util.List;

@Path("/books")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class BookResource {

    @GET
    public List<Book> getAllBooks() {
        return Book.listAll();
    }

    @POST
    @Transactional
    public Book addBook(Book book) {
        book.persist();
        return book;
    }
}

5. Test the Endpoint

  • Add a book:
  curl -X POST -H "Content-Type: application/json" -d '{"title":"Quarkus Guide","author":"John Doe","year":2023}' http://localhost:8080/books
  • Get all books:
  curl http://localhost:8080/books

Adding Health Checks and Metrics

1. Add Dependencies

Add the SmallRye Health and Metrics extensions:

./mvnw quarkus:add-extension -Dextensions="quarkus-smallrye-health, quarkus-smallrye-metrics"

2. Access Health Checks

Visit http://localhost:8080/q/health to see the health status.

3. Access Metrics

Visit http://localhost:8080/q/metrics to see application metrics.


Deploying to Kubernetes

1. Add Kubernetes Extension

Add the Kubernetes extension:

./mvnw quarkus:add-extension -Dextensions="quarkus-kubernetes"

2. Generate Kubernetes Manifests

Build the application and generate Kubernetes manifests:

./mvnw clean package -Dquarkus.kubernetes.deploy=true

3. Deploy to Kubernetes

Apply the generated manifests:

kubectl apply -f target/kubernetes/kubernetes.yml

Best Practices

  1. Use Reactive Programming: For better scalability and performance.
  2. Leverage Live Coding: Use quarkus:dev for faster development.
  3. Centralize Configuration: Use application.properties or application.yaml for all configurations.
  4. Monitor and Scale: Use health checks, metrics, and Kubernetes for monitoring and scaling.

Resources


Quarkus is a powerful framework for building modern, cloud-native microservices in Java. By leveraging its features, you can create efficient, scalable, and developer-friendly applications.

Leave a Reply

Your email address will not be published. Required fields are marked *