Escrito por Gabriel Scossi,

4 minutos de leitura

Quando usar o Quarkus

Entenda o que é esse framework java completo desenvolvido pela Red Hat e como usá-lo.

Compartilhe este post:

O que é o Quarkus?

Um framework java open source desenvolvido pela Red Hat e lançado no final de 2018. Foi desenvolvido sob medida para o GraalVM e OpenJDK HotSpot, com a promessa de ter um startup muito rápido e pouco gasto de memória de footprint, sendo assim um framework ótimo para cloud (ex: k8s), microservices e também serverless. Visa tornar o Java uma plataforma líder em ambientes serverless e Kubernetes, oferecendo aos desenvolvedores um modelo unificado de programação reativa e imperativa.

O Quarkus foi desenvolvido para ser um framework completo, trazendo bibliotecas muito utilizadas atualmente, como Eclipse MicroProfile, Apache Kafka, RESTEasy (JAX-RE), Hibernate ORM (JPA), Spring, Infinispan, Camel e muitos outros.

 

A injeção de dependência do Quarkus é baseada em Contexts and Dependency Injection (CDI), que também disponibiliza de um framework para você poder desenvolver sua própria extensão com funcionalidades de sua necessidade e pode configurar/integrar na sua aplicação.

Uma das extensões que nos chamou atenção é o Penache, uma implementação do JPA que utiliza uma ideia do ‘repository’ mais focado na orientação ao objeto. Na imagem abaixo, segue um exemplo de código utilizando o Penache.

 

Um ponto interessante no Quarkus é o live reload, não sendo necessário compilar novamente o projeto, parar o servidor e subir novamente quando altera uma linha no código. Quando inicializamos usando o parâmetro quarkus:dev, ele irá subir em modo desenvolvimento e, a cada request, ele irá fazer uma leitura em todos arquivos do projeto, procurando por mudanças. Caso encontre alguma alteração, vai compilar e publicar de forma transparente, liberando o fluxo da requisição HTTP.

 

A mudança de paradigma do Quarkus

O Quarkus move operações de alto custo de processamento e memória como o Bytecode Enhancement, Dynamic ClassLoading, Proxying, entre outros, para o tempo de compilação. O resultado é uma aplicação que consome menos memória e menos CPU, ganhando um processo de inicialização da aplicação muito mais rápida comparado a outros frameworks do mercado. Esse processo é perfeito para a nuvem e para serverless.

 

Executável nativo

Para gerar um executável nativo da aplicação, o Quarkus utiliza a GraalVM, uma máquina virtual universal e poliglota (JavaScript, Python, Ruby, R, Java, Scala, Kotlin). Ela possibilita o ahead-of-time (AOT) compilation, processo que compila o código diretamente para um formato binário, sem passar pelo bytecode.

No processo de AOT, a GraalVM aplica várias otimizações bem agressivas, como a análise de código e retirada de ‘dead code’ — ou seja, verifica um código que não está sendo utilizado e remove. A soma dessa limpeza de ‘dead code’ com a compilação para um código nativo é um arquivo executável pequeno, com rápida inicialização e com baixo consumo de memória. Na imagem abaixo, é possível ver dados de tempo de inicialização e consumo de memória com um executável nativo ou utilizando a JDK.

 

Um ponto importante a ser considerado ao gerar uma aplicação nativa é que ela tem suas limitações. Uma delas é a utilização de reflection. Quando for iniciar a aplicação, o AOT pode ter removido essas classes necessárias, resultando em uma inicialização com erro. Outro exemplo seria o JNDI, que não irá funcionar.

Para compilar no modo nativo, basta ter a GraalVM instalada e compilar o projeto utilizando o profile correto, ou então compilar nativo através de uma imagem Docker. No código abaixo, foi gerado um executável para um container docker ubuntu.

 

E, para sua execução, basta rodar o executável como aqui:

 

Como escolher entre rodar em modo nativo ou com a JDK?

Emmanuel Bernard, um dos desenvolvedores do Quarkus, trouxe numa palestra da Devoxx alguns pontos que podem ajudar a decidir como executar uma aplicação com Quarkus da Devoxx. Veja na imagem abaixo:

 

Um detalhe importante é que, para aplicações de longa duração, o ideal é rodar com a JVM, devido a melhor performance por ter um Garbage Collector melhor que o da GraalVM.

 

Conclusão

No momento de avaliar a utilização do Quarkus em produção devemos levar em consideração a comunidade de desenvolvimento, pois para resolver possíveis problemas de produção de forma mais fácil e rápida, é necessário que se tenha uma comunidade bem ativa. Porém, como podem ver na imagem abaixo em uma pesquisa por tag no stackoverflow, nota-se a grande diferença da quantidade de perguntas em relação ao spring, um framework java muito bem conhecido e já bem consolidado no mercado.

 

O Quarkus tem um grande potencial quando avaliamos sua utilização para serverless, devido a seu baixo consumo de memória e startup rápido — além de já ter uma stack básica para cloud já disponível. Porém, quando se trata de uma aplicação mais complexa, onde é necessário a utilização de bibliotecas específicas, pode ser um problema por ele ainda ser muito novo, sendo assim, tendo a necessidade de o próprio desenvolvedor ter que criar uma extensão nova.

 


 

Referências:
Ramp up on Quarkus: A Kubernetes-native Java framework
Introdução ao Quarkus
Kubernetes-native Java development with Quarkus
Uma breve explicação sobre o modo nativo do Quarkus
Microservices: Quarkus vs. Spring Boot
O que é Quarkus?
RedHat libera o Quarkus
Quarkus é o futuro do Java?

Compartilhe este post: