Article image
Gabrieli Alves
Gabrieli Alves10/06/2024 03:16
Compartilhe

Desbravando Quarkus: O Guia Definitivo para Desenvolvimento Java de Alta Performance

  • #Java
  • #Quarkus
  • #Kubernetes

Quer saber como transformar seu desenvolvimento Java com um framework moderno e eficiente? Então está no lugar certo. Neste artigo, vamos explorar como Quarkus está revolucionando a programação Java e fornecer um guia completo para iniciantes.

Este artigo está separado em três partes:

Parte 1: Contextualização

  • História;
  • Vantagens;
  • Para quem é Quarkus?;
  • Quarkus é Adequado para Iniciantes?

Parte 2: Conceitos Importantes

  • Jakarta EE;
  • Microprofile;
  • Programação Reativa;
  • Injeção de Dependência;
  • Extensões Quarkus;
  • Builds Nativos.

Parte 3: Prática - Guia para Iniciar em Quarkus

  • Pré-requisitos;
  • Criação de um novo projeto.

PARTE 1: CONTEXTUALIZAÇÃO

Desde o seu lançamento inicial, o Quarkus ganhou rapidamente popularidade na comunidade de desenvolvedores Java devido à sua abordagem inovadora e aos benefícios tangíveis que oferece em termos de desempenho, eficiência e facilidade de desenvolvimento. A Red Hat continua investindo no Quarkus, lançando atualizações regulares e expandindo seu ecossistema de plugins, extensões e integrações.

image

História

A história do Quarkus remonta a um esforço da Red Hat para fornecer uma estrutura moderna e eficiente para o desenvolvimento de aplicativos Java na era da nuvem e dos contêineres.

O Quarkus teve seu início por volta de 2018, liderado pela Red Hat, com o objetivo principal de enfrentar algumas das limitações percebidas no desenvolvimento de aplicativos Java convencionais, especialmente em ambientes de nuvem e contêineres.

Os objetivos para a criação do Quarkus incluíam a redução do tempo de inicialização, o controle do alto consumo de memória e a necessidade de uma abordagem verdadeiramente nativa para a criação de aplicativos Java.

image

Vantagens

Para superar os desafios iniciais, a equipe por trás do Quarkus adotou várias abordagens inovadoras:

  • Compilação nativa com GraalVM: O Quarkus converte aplicativos Java em binários nativos usando o GraalVM, permitindo que sejam executados diretamente como programas nativos. Isso resulta em inicializações mais rápidas e menor uso de recursos.
  • Otimização para contêineres e Kubernetes: Quarkus é altamente eficiente e adequado para uso em ambientes modernos de desenvolvimento e implantação, como contêineres Docker e orquestradores Kubernetes
  • Suporte para microsserviços e arquiteturas reativas: Com recursos que suportam uma variedade de tecnologias e padrões, os desenvolvedores têm liberdade para escolher as ferramentas e estruturas que melhor se encaixam em seus projetos, garantindo maior flexibilidade e eficiência no desenvolvimento.

Para Quem é Quarkus?

O Quarkus é ideal para uma variedade de cenários e tipos de aplicativos, especialmente para desenvolvedores Java que estão buscando construir aplicativos altamente eficientes, escaláveis e adequados para ambientes de nuvem e contêineres.

Aqui estão alguns perfis de desenvolvedores e cenários em que o Quarkus pode ser especialmente benéfico:

  1. Desenvolvedores Java que buscam desempenho otimizado: Se você está desenvolvendo aplicativos que exigem alto desempenho e baixo consumo de recursos, o Quarkus pode oferecer tempos de inicialização rápidos, menor uso de memória e menor latência devido à sua compilação nativa com GraalVM.
  2. Equipes que trabalham com arquiteturas de microsserviços e nuvem: O Quarkus fornece integração nativa com tecnologias populares de nuvem e contêineres, facilitando a criação e implantação de aplicativos em ambientes de nuvem distribuídos e escaláveis.
  3. Desenvolvedores que valorizam a produtividade e a agilidade: Com suporte a uma ampla gama de tecnologias Java e uma arquitetura leve e modular, Quarkus facilita o desenvolvimento, teste e manutenção de aplicativos.
  4. Empresas que procuram modernizar aplicativos Java existentes: A abordagem nativa de Quarkus e seu suporte integrado para tecnologias modernas facilitam a migração e modernização de aplicativos existentes.

Quarkus é Adequado para Iniciantes?

Pode ser útil ter uma compreensão básica de Java, mas isso não é obrigatório. Você pode começar a trabalhar diretamente com Quarkus e gradualmente desenvolver suas habilidades à medida que ganha mais experiência.

Afinal, o Quarkus é um framework bastante acessível para iniciantes, como veremos a seguir:

  • Documentação detalhada: A equipe por trás do Quarkus fornece uma extensa documentação que abrange desde os conceitos básicos até tópicos avançados. Essa documentação é escrita de forma acessível e pode ser útil para iniciantes.
  • Comunidade ativa: Quarkus possui uma comunidade ativa de desenvolvedores que estão dispostos a ajudar e compartilhar conhecimento. Fóruns online, grupos de discussão e canais de mídia social são ótimos lugares para fazer perguntas e obter suporte.
  • Facilidade: Quarkus simplifica muitos aspectos do desenvolvimento de aplicativos Java, incluindo configuração e construção de aplicativos. Com ferramentas como Maven ou Gradle, você pode facilmente criar e executar aplicativos Quarkus em seu ambiente de desenvolvimento local.
  • Extensões pré-construídas: Quarkus oferece um sistema de extensões que permite adicionar facilmente funcionalidades extras ao seu aplicativo. Isso pode ser útil para iniciantes que desejam adicionar recursos sem ter que escrever muito código do zero.

PARTE 2: CONCEITOS IMPORTANTES

Antes de mergulharmos na programação com Quarkus, é essencial entender alguns conceitos-chave que sustentam esta plataforma. Mesmo que você seja novo neste universo, não se preocupe, vamos descomplicar tudo para que você possa começar com o pé direito.

Vamos explorar alguns conceitos importantes no desenvolvimento de aplicações modernas com Jakarta EE, MicroProfile, programação reativa, injeção de dependência com CDI, extensões do Quarkus e build nativo.

Jakarta EE

O Jakarta EE, anteriormente conhecido como Java EE, é uma plataforma robusta para criar aplicativos empresariais em Java. Ele oferece um conjunto abrangente de ferramentas e recursos para lidar com diversos aspectos do desenvolvimento de aplicativos, conforme veremos a seguir:

  • Servlets e JSP (JavaServer Pages): Estas são tecnologias básicas para criar aplicativos da web em Java. Os Servlets são como pequenos programas que respondem a solicitações da web, enquanto as JSPs são usadas para criar páginas web dinâmicas.
  • JPA (Java Persistence API): Esta é uma forma de interagir com bancos de dados relacionais usando Java. Ela permite que os desenvolvedores manipulem dados em bancos de dados sem precisar escrever SQL diretamente.
  • EJB (Enterprise JavaBeans): Estes são componentes especiais que residem no servidor e encapsulam a lógica de negócios. Eles fornecem funcionalidades importantes, como gerenciamento de transações e segurança.
  • JMS (Java Message Service): É uma maneira de enviar mensagens entre diferentes partes de um aplicativo, o que é útil para comu-nicação assíncrona e integração de sistemas distribuídos.
  • JTA (Java Transaction API): Esta é uma API para gerenciar transações em aplicativos Java, garantindo que as operações em vários recursos (como bancos de dados) sejam tratadas de forma consistente.
  • JAX-RS (Java API for RESTful Web Services): Esta API é usada para criar serviços da web RESTful, que são uma maneira popular de criar APIs web que são escaláveis e interoperáveis.

image

MicroProfile

O MicroProfile é uma iniciativa de código aberto que visa otimizar o desenvolvimento de aplicativos empresariais baseados em microsserviços e nuvem, fornecendo um conjunto de especificações e padrões que simplificam e padronizam o desenvolvimento de aplicativos Java para esses ambientes.

Algumas das principais características e padrões incluídos no MicroProfile são:

  • Configuração: Um mecanismo para configurar aplicativos externamente, permitindo que as configurações sejam definidas fora do código-fonte e alteradas sem a necessidade de reconstruir o aplicativo.
  • Health Check: Um padrão para verificar o status da aplicação e seus componentes, garantindo que eles estejam funcionando corretamente e permitindo a detecção de problemas de forma proativa.
  • Metrics: Um padrão para coletar e expor métricas sobre o desempenho e o comportamento do aplicativo, facilitando a monitoração e análise.
  • OpenAPI (anteriormente conhecido como Swagger): Um padrão para descrever e documentar APIs RESTful de forma padronizada, facilitando a comunicação e integração entre sistemas.
  • JWT (JSON Web Token): Um padrão para autenticação e autorização baseado em tokens JSON, fornecendo uma maneira segura de autenticar e autorizar solicitações entre serviços.
  • Fault Tolerance: Um conjunto de padrões para tornar os aplicativos mais resilientes a falhas, incluindo recuperação de falhas, retentativas e tolerância a falhas.
  • REST Client: Um padrão para simplificar o consumo de APIs RESTful em aplicativos Java, fornecendo uma API consistente e fácil de usar.
  • OpenTracing (anteriormente Zipkin): É um padrão usado para rastrear solicitações em sistemas distribuídos. Ele ajuda a entender como as solicitações se movem através dos diferentes componentes de um sistema, permitindo que os desenvolvedores observem e diagnostiquem problemas de desempenho.

Esses padrões e especificações são projetados para serem leves, simples e fáceis de usar, proporcionando uma base sólida para o desenvolvimento de aplicativos Java baseados em microsserviços e nuvem.

image

Programação Reativa

A programação reativa é uma abordagem poderosa para lidar com fluxos de dados assíncronos e eventos em aplicativos modernos. Ela considera esses fluxos como contínuos de eventos, em vez de entidades estáticas, o que possibilita aos desenvolvedores construir sistemas mais eficientes.

Com Quarkus, essa técnica se torna mais fácil e acessível para os desenvolvedores Java, pois o Quarkus foi projetado desde o início com foco na programação reativa. Isso significa que ele oferece suporte nativo para lidar com fluxos de dados assíncronos de forma eficiente e intuitiva.

Aqui estão algumas maneiras pelas quais o Quarkus facilita a programação reativa:

  • Reactive Messaging: É um sistema poderoso que capacita os desenvolvedores a construir aplicativos que respondem a eventos de forma assíncrona e reativa. Com o Reactive Messaging, é fácil criar pipelines de eventos, processar fluxos de dados em tempo real e construir sistemas altamente responsivos.
  • Integração com bibliotecas reativas: O Quarkus oferece suporte para integração com várias bibliotecas reativas populares, como Vert.x e Mutiny. Isso permite que os desenvolvedores aproveitem as capacidades dessas bibliotecas para construir aplicativos ainda mais poderosos e responsivos.
  • Desempenho e escalabilidade: Com sua arquitetura otimizada e suporte para aplicativos nativos na nuvem, o Quarkus oferece excelente desempenho e escalabilidade para aplicativos reativos, lidando facilmente com grandes volumes de eventos e fluxos de dados assíncronos.

Injeção de Dependência

A injeção de dependência é um padrão de design usado na programação orientada a objetos para promover a modularidade e a reutilização do código. Isso ajuda a reduzir o acoplamento entre os componentes, permitindo que eles dependam de abstrações em vez de implementações específicas.

No contexto do Quarkus, que utiliza CDI (Contexts and Dependency Injection), a injeção de dependência é uma técnica fundamental para gerenciar a criação e a integração de componentes em um aplicativo.

Aqui está uma explicação mais detalhada:

  • Contextos: Em um programa, diferentes partes podem precisar de recursos em momentos diferentes. Por exemplo, quando um cliente faz um pedido, o contexto inclui todas as informações necessárias para garantir que o pedido seja processado corretamente.
  • Exemplo em Quarkus: Podemos usar anotações como @RequestScoped para definir que um objeto só deve existir durante a solicitação HTTP atual.
  • Anotações CDI: Anotações são marcadores especiais que fornecem instruções específicas ao sistema sobre como lidar com determinadas partes do código. No contexto do CDI, são especialmente úteis para definir o escopo e o comportamento dos componentes.
  • Exemplo em Quarkus: Podemos usar anotações como @ApplicationScoped para definir que um objeto deve ser compartilhado por toda a aplicação. Isso é útil para criar componentes que precisam ser acessados globalmente, como uma configuração de banco de dados ou uma conexão com um serviço externo.
  • Flexibilidade e Testabilidade: Quando você escreve um programa, quer que ele seja fácil de modificar e testar. Usar injeção de dependência torna isso mais simples, porque você pode trocar facilmente uma parte do código por outra sem ter que mudar muitas outras coisas.
  • Exemplo em Quarkus: Em testes unitários, podemos substituir uma implementação de banco de dados real por um banco de dados de memória apenas trocando as configurações de injeção de dependência, sem precisar alterar o código da classe que estamos testando.

Extensões Quarkus

Um dos pontos fortes do Quarkus é seu sistema de extensões, que permite adicionar e configurar funcionalidades adicionais de forma fácil e eficiente.

image

Essas extensões são módulos pré-configurados que integram diferentes bibliotecas e ferramentas ao ecossistema Quarkus, proporcionando uma experiência de desenvolvimento mais integrada e simplificada.

Confira abaixo algumas extensões que ajudam a adicionar e configurar rapidamente diferentes funcionalidades no seu projeto Quarkus, promovendo uma integração fácil e eficiente com diferentes tecnologias e plataformas.

Integração com Banco de Dados:

  • JDBC: Extensões como quarkus-jdbc-mysql e quarkus-jdbc-postgresql fornecem integração com JDBC para MySQL e PostgreSQL, respectivamente.
  • Hibernate ORM: A extensão quarkus-hibernate-orm permite a integração com o Hibernate ORM.
  • Panache: A extensão quarkus-hibernate-orm-panache facilita o uso do Hibernate ORM com um modelo de programação simplificado.

API REST:

  • RESTEasy: A extensão quarkus-resteasy permite a criação de APIs RESTful.
  • Jackson: A extensão quarkus-resteasy-jackson oferece suporte para serialização e desserialização de JSON usando Jackson.
  • JSON-B: A extensão quarkus-resteasy-jsonb oferece suporte para JSON-B (JSON Binding).

Segurança:

  • OAuth2: A extensão quarkus-oidc pode ser usada para integração com OAuth2.
  • Keycloak: A extensão quarkus-keycloak-authorization permite integração com o Keycloak para gerenciamento de identidades e acesso.
  • JWT: A extensão quarkus-smallrye-jwt oferece suporte para autenticação baseada em JSON Web Tokens.

Mensageria:

  • Kafka: A extensão quarkus-smallrye-reactive-messaging-kafka integra Kafka para mensageria.
  • AMQP: A extensão quarkus-smallrye-reactive-messaging-amqp integra AMQP.
  • JMS: A extensão quarkus-qpid-jms oferece suporte para JMS.

Monitoramento e Observabilidade:

  • OpenTelemetry: A extensão quarkus-opentelemetry oferece suporte para monitoramento e rastreamento com OpenTelemetry.
  • Prometheus: A extensão quarkus-smallrye-metrics permite a exportação de métricas para Prometheus.
  • Micrometer: A extensão quarkus-micrometer integra Micrometer para monitoramento.

Cloud e Containers:

  • Kubernetes: A extensão quarkus-kubernetes facilita a implantação em Kubernetes.
  • OpenShift: A extensão quarkus-openshift suporta integração com OpenShift.
  • AWS: A extensão quarkus-amazon-lambda permite a criação de funções AWS Lambda.
  • Azure: A extensão quarkus-azure-functions facilita a criação de funções no Azure.

Para explorar as extensões disponíveis, você pode usar o comando list da Quarkus CLI:

quarkus list extensions

Ou você pode explorar as extensões diretamente no site oficial do Quarkus na seção Extensions.

Builds Nativos

Um build nativo é uma versão compilada do aplicativo que é otimizada para rodar diretamente no sistema operacional, sem a necessidade de uma JVM (Java Virtual Machine) em tempo de execução. Isso resulta em tempos de inicialização extremamente rápidos e um consumo de memória reduzido.

Vantagens do Build Nativo:

  • Tempo de Inicialização Rápido: Os aplicativos nativos são pré-compilados para o sistema operacional alvo, eliminando a necessidade de compilação Just-In-Time (JIT) durante a execução. Isso permite que os aplicativos sejam iniciados quase instantaneamente.
  • Baixo Consumo de Memória: Sem a sobrecarga da JVM, os builds nativos utilizam significativamente menos memória. Isso é especialmente benéfico em ambientes de microsserviços e em plataformas serverless, onde a eficiência de recursos é crucial.
  • Desempenho Consistente: Como a compilação é feita antecipadamente (Ahead-of-Time - AOT), o desempenho do aplicativo é mais previsível e consistente, ao contrário das aplicações JIT que podem ter variações de desempenho durante a execução.

A adoção de builds nativos é particularmente vantajosa em ambientes de produção onde o tempo de resposta rápido e o uso eficiente da memória são críticos, como em arquiteturas de microsserviços e computação serverless.

PARTE 3: PRÁTICA - GUIA PARA INICIAR EM QUARKUS

Agora que cobrimos os principais conceitos do Quarkus, você deve estar pronto para criar seu primeiro "Hello World" no framework. Siga o passo a passo a seguir para começar esta jornada.

Pré-requisitos

JDK 11+: Verifique se você tem o JDK 11 ou superior instalado.

  • Para verificar se você tem o JDK 11 ou superior instalado, basta abrir o terminal ou prompt de comando e digitar java -version. Se o JDK estiver instalado corretamente, você verá algo como:
  • java version "11.0.12" 2022-07-19 LTS
  • Java(TM) SE Runtime Environment 18.9 (build 11.0.12+8-LTS-259)
  • Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.12+8-LTS-259, mixed mode)
  • Certifique-se de que a versão exibida é 11 ou superior. Se não for o caso, você precisará instalar o JDK 11+ e configurar o PATH do sistema para apontar para a sua instalação. Após isso, execute novamente o comando para confirmar a instalação correta.

Maven: Embora o Quarkus possa ser usado com outras ferramentas de compilação, como o Gradle, o Maven é frequentemente utilizado.

  • Para verificar se o Maven está instalado e configurado corretamente como sua ferramenta de build, você pode usar o terminal ou prompt de comando e executar o comando “mvn -version”.
  • Isso exibirá a versão do Maven instalada no seu sistema, se estiver instalada corretamente.
  • Se você vir informações sobre a versão do Maven, incluindo o número da versão e o diretório da instalação do Maven, isso significa que o Maven está instalado e configurado corretamente como sua ferramenta de build.
  • Se o comando não for reconhecido ou retornar um erro, isso significa que o Maven pode não estar instalado ou não está configurado corretamente no seu PATH. Nesse caso, você precisará instalar o Maven ou configurá-lo corretamente.

Criação de um Novo Projeto

Passo 1: Abra um terminal e execute o seguinte comando:

mvn io.quarkus:quarkus-maven-plugin:2.7.1.Final:create \
 -DprojectGroupId=com.example \
 -DprojectArtifactId=hello-quarkus \
 -DclassName="com.example.HelloResource" \
 -Dpath="/hello"

Este comando cria um novo projeto Quarkus com uma classe Java chamada HelloResource e um endpoint REST '/hello'.

Passo 2: Implemente o endpoint REST

Navegue até o diretório do projeto que você acabou de criar:

cd hello-quarkus

Abra o arquivo HelloResource.java dentro do diretório src/main/java/com/example/ e substitua o conteúdo pelo seguinte:

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 HelloResource {
 @GET
 @Produces(MediaType.TEXT_PLAIN)
 public String hello() {
 return "Hello, World!";
 }
}

Passo 3: Execute o aplicativo

Agora, você pode executar o aplicativo Quarkus usando o seguinte comando Maven:

./mvnw compile quarkus:dev

Isso iniciará seu aplicativo Quarkus em modo de desenvolvimento. Quando estiver pronto, você verá algo como "Listening for transport dt_socket at address: 5005" indicando que o servidor está em execução.

Passo 4: Teste o endpoint

Abra um navegador da web ou use uma ferramenta como cURL ou Postman para acessar o endpoint em http://localhost:8080/hello. Você deve receber a mensagem "Hello, World!".

Isso é tudo! Você criou com sucesso um endpoint REST simples usando Quarkus.

CONCLUSÃO

Ao observarmos a trajetória histórica, as vantagens evidentes e os conceitos essenciais discutidos, percebemos que o Quarkus é uma escolha poderosa para desenvolvedores de todos os níveis. Suas extensões diversificadas simplificam a integração com diversas tecnologias, enquanto a programação reativa e a injeção de dependência facilitam a criação de sistemas escaláveis e modulares.

Seguindo o guia prático para iniciar com o Quarkus, você deu os primeiros passos para explorar todo o potencial deste framework. Com uma comunidade ativa e documentação abrangente, os recursos necessários para avançar estão ao seu alcance. Aproveite as ferramentas e capacidades do Quarkus para desenvolver aplicações que estejam preparadas para os desafios do presente e do futuro.

Para usuários Pro e Global da DIO, fica a recomendação de dois projetos incríveis com Quarkus, basta fazer uma busca pelo título:

  • Desenvolvendo um Sistema para Eleição Usando Quarkus Framework;
  • Criando um Sistema de Orçamento, Utilizando CQRS, Quarkus, Kafka e Deploy no EKS.

REFERÊNCIAS

Compartilhe
Comentários (2)
ALEX ALVES
ALEX ALVES - 13/06/2024 18:16

Muito bom artigo, gostei!

MS

Moacyr Santos - 13/06/2024 10:11


Gostei bastante do artigo, parece ter muito embasamento, imagino que tenha dado trabalho kkk parabéns