Deploy Quarkus everywhere with Red Hat Enterprise Linux (RHEL)

Posted by Shaaf's blog on Friday, May 7, 2021

Orignally posted at Red Hat Developers

Java is one of the most used languages out there and has been in the top three for the last two decades. Java powers millions of applications across verticals and platforms. Linux is widely deployed in data centers, Edge networks, and Cloud. Today we announce the availability of Quarkus for all our Red Hat Enterprise Linux (RHEL) customers. If you are running RHEL, you can now also run Red Hat Build of Quarkus (RHBQ). By doing this, we enable our customers, partners, and software vendors to use RHBQ in their applications with ease and furthermore enable them to deploy Quarkus for multiple use-cases for Java on Linux. If you are developing applications on a Kubernetes platform like Openshift, you can also use RHBQ with it, and this was announced last year. What is Quarkus and how can I develop and deploy it on RHEL? Learn more in this post.

What is Red Hat Build of Quarkus (RHBQ)

If you are not familiar with Quarkus, “it is supersonic subatomic Java.” Yes, Java is superfast! Java is light and straightforward with Quarkus.

Quarkus is a Kubernetes-native Java framework made for the JVM (Java Virtual Machine) and native compilation with GraalVM/Mandrel. Quarkus optimizes your Java code specifically for containers and enables it to become an effective platform for serverless and cloud environments like Openshift. Quarkus is designed to work with popular Java standards, frameworks, and libraries like Eclipse MicroProfile and Spring and Apache Kafka, RESTEasy (JAX-RS), Hibernate ORM (JPA), Spring, Infinispan, Camel, and many more.

How to get started with Quarkus on RHEL

There are multiple ways to start using quarkus on RHEL. All you need is to be able to get the artifacts from Red Hat’s maven repo. A list of different approaches is documented here.

For newbies, you can simply get started with the project generator using a web browser or Maven plugin, as shown in Figure 1. Once configured, you can download the zip file or copy the maven command to run on your machine. For more details on the different methods, you can check out the Quarkus documentation here.

alt_text
image_tooltip

Figure 1. Quarkus project generator

Above, you will be able to see all the extensions that are supported in Tech Preview(TP) and also available for use. Quarkus has a vast ecosystem of extensions that help developers write applications such as Kafka, Hibernate Reactive, Panache, Spring, etc.

Example: Basic functions on RHEL

In our example today, we have already created a basic application that can run on a lightweight resource-efficient RHEL server, e.g. on the Edge. What does this application do?

  • Devices send data to an MQTT broker.
  • Quarkus uses reactive messaging and channels to receive those messages, process them, and showcase them on a browser-based front-end. Data comes in real-time via a channel.
  • The data is also stored in a Postgresql Database
  • The front-end uses REST and Javascript.

This blog guides developers on how to implement the above scenario in terms of developing and deploying this application on RHEL using podman. Quarkus is able to detect the underlying container engine and build the containers for the application, as shown in Figure 2

alt_text
image_tooltip

Figure 2. High-level architecture diagram

In case you would like to follow along or try it out the source code for this application is located here.

Podman

Red Hat Enterprise Linux has a daemon less container engine. What does this mean? RHEL uses Podman as the container engine. The Podman architecture by contrast allows you to run the containers under the user that is starting the container (fork/exec), and this user does not need any root privileges. Because Podman has a daemon less architecture, each user running Podman can only see and modify their own containers. There is no common daemon that the CLI tool communicates with. Learn more about Podman here

We will be using Podman throughout this example.

Starting up the broker. For this demo, we are using the Mosquitto broker. Mosquitto is lightweight and is suitable for use on all devices from low power single board computers to full servers. We use it in this demo for a basic and simple MQTT broker. Let’s start an instance of mosquitto using podman


podman run --name mosquitto \

--rm -p "9001:9001" -p "1883:1883" \

eclipse-mosquitto:1.6.2

Building our application

Assuming you have the latest Red Hat build of OpenJDK i.e. 11.

You can check your version by initiating the following command on the terminal.

java -version

Output:

openjdk version "11.0.10" 2021-01-19

OpenJDK Runtime Environment 18.9 (build 11.0.10+9)

OpenJDK 64-Bit Server VM 18.9 (build 11.0.10+9, mixed mode, sharing)

So now we have Java and Mosquitto. Let’s try to spin up our application. You can use any IDE (Integrated Development Environment) to develop with Quarkus. For most of them we have the “Quarkus Tools” extension which enables developers to create Quarkus with much more ease. Assuming you have an IDE of your choice. Let’s start the Quarkus “dev mode”.

To do that

  • Open up a terminal (From your RHEL machine or any IDE)
  • CD into our project directory i.e. quarkus-edge-mqtt-demo
  • Run command “mvn quarkus:dev”

The output should be similar, as shown in Figure3:

alt_text
image_tooltip

Figure 3. Quarkus Dev Mode

Open up a browser and navigate to http://localhost:8080

You should be able to see the main page for our application reporting realtime data from our emulated device, as shown in Figure 4. The device in this case is an emulated one ESP8266-01 that throws Temperature and Heat measurements as a JSON format from the device into the MQTT broker. Then, that is picked up as a reactive channel and throws that data out after processing into the stream. The stream is read by the browser and displays the data in realtime. The emulated device can easily be changed to a real one, however the data thrown should be in the correct Json format.

alt_text
image_tooltip

Figure 4. Real-time Data from the device

Developer Joy

By now, you have a running application on your RHEL machine in development mode. Quarkus is built for Java developers to enjoy developing applications with ease, comfort, and speed. It’s a “cohesive platform for optimized developer joy”. So what benefits will developers gain from the development mode?

  • Zero configuration, live code and reload in the blink of an eye, you don’t need to restart the dev mode while developing. Quarkus understands!
  • Based on standards, but not limited.
  • Unified configuration
  • Streamlined code for the 80% common usages, flexible for the 20%
  • No hassle native executable generation

For example, if we change any of our Java files we don’t need to reload the entire environment.

If we hit the url http://localhost:8080/q/dev you can also find an awesome Developer console available since RHBQ 1.11 release

You should see the following extensions, click on the SmallRye Reactive messaging “Channels”, as shown in Figure 5.

alt_text
image_tooltip

Figure 5. Quarkus DEV UI

Then you can see the Reactive streams that are being used for our Edge device, as shown in Figure 6.

alt_text
image_tooltip

Figure 6. Reactive Streams Channel

More details on development mode here

Using Podman to build application image

You can create a native binary for your platform by running the “-Pnative” directive with maven.

However, assuming you might not have the entire compilation environment setup such as Mandrel or GraalVM installation. In that case, you can use your container runtime to build the native image as well.

The simplest way to do this is by running the following command.

./mvnw package -Pnative -Dquarkus.native.container-build=true  -Dquarkus.native.container-runtime=podman

Quarkus will pick up the default container runtime(e.g. Podman) in our case.

You can also specify “-Dquarkus.native.container-runtime=podman” to explicitly select Podman. It takes a few minutes to build the image for optimizing the Quarkus application through dead code elements, class scanning, reflections, and build proxies. This will optimize not just for native images but also for JVM mode. So you will see fast startup times and a low memory footprint in both those cases, as shown in Figure 7

alt_text
image_tooltip

Figure 7. Quarkus Build Process

You can also limit the amount of memory used during native compilation by setting the quarkus.native.native-image-xmx configuration property. Setting low memory limits might increase the build time. can also use podman to create a container image with our binary.

Under src/main, different Dockerfiles are pre-generated by Quarkus for your application. In our example, we will use the native one, since we have already created a native binary.

Execute the following command in our project home directory

podman build -f src/main/docker/Dockerfile.native -t sshaaf/quarkus-edge-mqtt .

And finally, run the following command launches the container on your RHEL machine

podman run -i –rm -p 8080:8080 sshaaf/quarkus-edge-mqtt

Go back to http://localhost:8080. Then, you should see our application running and showing incoming data from our device.

Summary

Quarkus is the Java framework for multiple use cases. Whether you are running on edge gateways, or creating serverless functions, or deploying on cloud environments like Kubernetes/OpenShift, Quarkus provides developer ease and joy, brings performance to Java applications for the cloud and its operational efficiency enables cost savings for running it everywhere.

In this blog, we learned about Quarkus on RHEL

  • Using Quarkus(RHBQ) on RHEL
  • Development mode
  • Creating Java native executables with and without podman
  • Creating images with Podman on RHEL

For more information and details, follow the resources below.

Resources

Release notes , Getting started , documentation

Would like to learn more about Quarkus with Examples here

Books Practising Quarkus, Understanding Quarkus

Quarkus Cheat Sheet, Quarkus reference card

Introducing Quarkus a next Generation Java framework