Introdução ao Quarkus

Lírio
Devspoint
Published in
7 min readNov 18, 2021

Nesse artigo vou mostrar como criar APIs em Quarkus, sempre mesclando teoria e prática (afinal não basta saber fazer, precisamos também saber explicar 🙂).

Quarkus Supersonic (rápido) Subatomic (pequeno) Java, esse é seu slogan, Quarkus nasceu com a proposta de contrapor a ideia de que Java é lento e que consume muita memória.

Criado pela empresa Red Hat em 2018, Quarkus foi projetado desde o início para rodar em ambientes pequenos, não somente para arquitetura de microserviços, mas sim para rodar na Cloud e orquestradores de containers como Kubernetes seguindo a filosofia do Container-First. Com tempo de inicialização rápido e baixo uso de memória ganhou fama rapidamente também por ser Developer Joy (diversão do desenvolvedor).

Antecipa alguns processos para o build que aconteceria em tempo de execução.

Assim como Spring nasceu em cima de dores ao desenvolver com Java EE no passado, Quarkus nasceu em cima de problemas que não somente o Spring possui, mas as aplicações Java, que é, rodar em ambientes menores como Containers ou Serverless e que precisam que o tempo de inicialização seja rápido.

Full-stack framework

Além de ser Developer Joy como mencionei acima, é produtivo, se você programa em Java e utiliza o Spring, tenho certeza que vai gostar muito de Quarkus, podemos criar nossas aplicações com Maven ou Gradle como ferramenta de build, Java ou Kotlin, usar Banco de Dados Relacionais e Não Relacionais, utilizar o paradigma Reativo ou Imperativo, JVM ou Nativo. É um framework muito completo, possui os Extensions que permite utilizar o que você tem já disponível e integrações com Spring e Microprofile.

Criando uma aplicação Quarkus

Pré-requisitos são:

  • IDE como VSCode ou Intellij
  • JDK 11+ ou GraalVM
  • Maven ou Gradle

Então vamos abrir o quarkus.io, e caso você não tenha ainda todos os pré-requisitos, clique em Get Started. Possuindo tudo que é necessário, podemos ir direto para o Start Coding.

Vamos configurar nossa aplicação no code.quarkus.io, quem utiliza Spring pode perceber a semelhança com o Spring Initializr.

Existem outras formas de criar aplicações em Quarkus, usando linha de comando com Build Tool (Maven/Gradle), utilizando quarkus-cli nesse ponto é muito parecido com alguns frameworks frontend como Angular (ng new my-app) e Vue (vue create my-app) ou podemos criar a aplicação pela própria IDE.

Precisamos preencher algumas infos como:

Group: io.github.devspoint

Artifact: quarkus-intro

Build Tool: Maven

Version: 1.0.0-SNAPSHOT

Starter Code: Yes

Com Starter Code Yes, o scaffold gerado irá conter uma REST API de exemplo GET /hello.

No Quarkus, chamamos as dependências da aplicação de Extensions, e vamos utilizar esse termo para nos referir a elas. Os extensions que iremos adicionar são o RESTEasy JAX-RS para criar APIs REST, RESTEasy JSON-B para suporte a serialização JSON do JAX-RS,JDBC Drive H2, Hibernate ORM with Panache and Kotlin e Kotlin.

Agora é só clicar em Generate Your Application e depois Download The Zip para baixar seu App Supersônico ;-)

Gerando o scaffold da aplicação, temos algumas instruções no README.md, vamos seguir alguns passos, por exemplo, como rodar nossa aplicação utilizando o ./mvnw compile quarkus:dev.

Ao executar por linha de comando, vamos acessar o endereço http://localhost:8080 no Browser, uma página será aberta e você pode clicar em @Path: /hello aquela REST API já pré-configurada gerada com o Starter Code = Yes.

Se alterarmos o retorno da mensagem, por exemplo de "Hello RESTEasy"para "Quarkus Intro" salvar e atualizar o Browser (sem reiniciar a aplicação) perceberá o hot-reload trabalhando, esse é um dos pontos chaves quando falamos de produtividade no Quarkus.

Continuando nas instruções do README.md, podemos rodar ./mvnw package para gerar o jar e subir nossa aplicação com o comando abaixo.

java -jar target/quarkus-app/quarkus-run.jar
Tempo de Startup → 2.292 segundos

Para gerar o executável nativo precisamos ter configurado o GraalVM e rodar o comando ./mvnw package -Pnative, Observe na imagem abaixo os arquivos gerados no build.

04:06 minutos de build para gerar o executável nativo

O quarkus-intro-1.0.0-SNAPSHOT-runner (de verde na imagem acima) é o nosso Executável Nativo compilado direto para rodar no sistema operacional sem fazer uso de um intermediário como a JVM. Como estou utilizando Ubuntu, é um executável para o linux, equivalente ao .exe do Windows.

Vamos executá-lo e subir nossa aplicação.

Tempo de Startup → 31 milisegundos (74 vezes mais rápido do que o Boot anterior)

Essas foram algumas dicas de como rodar aplicação com a JVM e de modo Nativo, só esse assunto gera outros artigos. Você pode ler um pouco mais nesse artigo aqui.

O que torna o Quarkus perfomático não é a GraalVM, na verdade nem sempre as aplicações nativas oferecem vantagens, existe um trade-off nisso, já o Quarkus oferece vantagens em todos os pontos, como vimos ele pode rodar aplicações com a JVM ou Nativo e outro ponto que me chama muita atenção é a comunidade muito engajada.

REST API

Para quem não pegou a época do Java EE (antigo) e entrou na era de criar APIs com Spring, pode não ter usado JAX-RS, a especificação REST do Java, ela define interfaces e anotações fornecidas pelo Java EE.

As implementações de JAX-RS API mais conhecidas são RESTEasy e Jersey. O Quarkus como implementação padrão utiliza o RESTEasy, também criado pela Red Hat.

Vamos criar uma REST API inicialmente criando duas classes Kotlin, CustomerEntrypoint.kt para expor nossos endpoints e CustomerEntity.kt que será nosso Objeto que representará a Entidade no Banco de Dados.

Temos alguns pontos a considerar como a Annotation @Path com valor /customers para o path root do nosso recurso, @Produces para configurar nossas APIs para retornar (produzir) um JSON, que também podem ser especificadas no método, caso necessário. Na classe CustomerEntrypoint configuramos todos os métodos e acima do método somente aquele método/api. O mesmo conceito serve para o @Consumes no entanto para dizer que nossa api esta consumindo um JSON.

Para fazer acesso ao Banco de Dados utilizamos o Hibernate como Implementação do JPA, no nosso caso temos a CustomerEntity que mapeia o Objeto para Relacional (tabela no Banco de Dados), somente com o Hibernate esses mapeamentos e consultas (SQL ou JPQL) acabam deixando um pouco mais complexos e muitas vezes chato de configurar, com Panache isso fica mais simples e legal 🙂.

Panache nesse aspecto é semelhante ao Spring-Data.

Quando herdamos o PanacheEntity automaticamente ganhamos alguns métodos, como persist, findAll, findById e etc. Também ganhamos o campo id com auto-incremento.

Panache também permite o uso do Repository Pattern via PanacheRepository. Mas iremos seguir nesse artigo com o PanacheEntity

Assim temos nossa primeira API que salva um novo Cliente.

curl --request POST \
--url http://localhost:8080/customers \
--header ‘Content-Type: application/json’ \
--data ‘{
“firstname”: “Diego”,
“lastname”: “Lirio”
}’

Após realizar o Request recebemos o Erro:

TransactionRequiredException: Transaction is not active, consider adding @Transactional to your method to automatically activate one.

Vamos adicionar o @Transactional no CustomerEntrypoint, ele é utilizado para persistir, atualizar ou excluir uma entidade no banco de dados.

@Transactional
@Path("/customers")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
class CustomerEntrypoint {

Você deve ter percebido que nenhum momento configuramos a String de Conexão do Banco, isso porque para o Banco de Dados embutido não precisamos! Para outros bancos de dados você pode configurar no application.properties no resources da aplicação, mais detalhes.

Agora que temos o primeiro registro no banco de dados, vamos criar mais duas APIs GET /customers/{id} e GET /customers.

Este artigo foi uma introdução de como criar sua primeira REST API em Quarkus, podendo rodar de modo Nativo ou com a JVM.

Github:
https://github.com/devspoint/quarkus-intro

Ref.:

--

--