Backend

Quando usar o Quarkus

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

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:

https://developers.redhat.com/blog/2020/04/24/ramp-up-on-quarkus-a-kubernetes-native-java-framework/

https://www.infoq.com/br/articles/getting-started-with-quarkus

https://www.openshift.com/learn/topics/quarkushttps://medium.com/swlh/graalvm-native-image-spring-vs-quarkus-a738263df069https://medium.com/swlh/is-quarkus-the-future-of-java-b664c5e79381

https://dev.to/lucasscharf/uma-breve-explicacao-sobre-o-modo-nativo-do-quarkus-1kn7

https://dzone.com/articles/microservices-quarkus-vs-spring-boothttps://medium.com/codigorefinado/quarkus-2ae05b9352d7

https://www.redhat.com/pt-br/topics/cloud-native-apps/what-is-quarkus

https://www.infoq.com/br/news/2019/04/redhat-release-quarkus

https://ichi.pro/pt/quarkus-e-o-futuro-do-java-200543933272961

https://www.infoq.com/br/articles/getting-started-with-quarkus

https://dev.to/lucasscharf/uma-breve-explicacao-sobre-o-modo-nativo-do-quarkus-1kn7

%d blogueiros gostam disto: