Tutorial: Quarkus do Zero até o Deploy no Heroku, utilizando Quarkus Java + REST + CDI + Panache, Hibernate com Postgres + Postman
Introdução
Olá pessoal! vamos para o terceiro post sobre o Quarkus, caso você nunca tenha ouvido falar dele, sugiro uma leitura na Documentação Oficial e também nas duas publicações que já escrevi.
Publicações:
- Tutorial: Criando um CRUD utilizando Quarkus Java + REST + CDI + Panache, Hibernate com Postgres (Docker) + Postman — Linkedin Post | Medium
- Tutorial: Quarkus — Simplificando o Hibernate utilizando Panache — criando uma aplicação simples utilizando Quarkus Java + REST + CDI + Panache — Linkedin | Medium
Objetivo
Criar uma aplicação simples (CRUD) do zero, utilizando o Quarkus, CDI, Panache, Hibernate Validator, Postgres chegando até um deploy no Heroku. O Heroku é um serviço de Cloud, denominado de PAAS (Platform As A Service), em resumo, a ideia é que você não se preocupe com infraestrutura. Vamos para os pré-requisitos para desenvolver a aplicação.
Pré-requisitos:
- Você vai precisar de uma IDE como por exemplo: IntelliJ IDEA, Eclipse, VSCode.
- Instale a JDK 11
- Instale o Apache Maven 3.6+
- Docker (Apenas para subir o banco de dados Postgres Localmente)
- Escolha um cliente para conectar com o Banco de dados, exemplo: DBeaver, PGAdmin, Postico (Mac)
- Cliente para realizar requisições REST: Postman ou o Insomnia.
- Conta no Github (repositório de Código)
- Conta no Heroku (Gratuita)
Instruções Adicionais:
- Instalação do Docker (Documentação oficial)
- Instalando Docker no windows: (Youtube, ESR)
- Instalando o Docker no Linux: (Youtube: LinuxTips)
- Instalando o Docker no Mac: (Youtube: Wellington Rogati)
Escopo da aplicação
Criar uma API Simples, que será responsável por Listar, Cadastrar, Editar e Remover produtos. Todos esses dados serão salvos no banco de dados PostgreSQL.
Iniciando o Desenvolvimento
A criação da aplicação poderá ser através do site https://code.quarkus.io/, ou através do comando abaixo (Maven Archetype):
mvn io.quarkus:quarkus-maven-plugin:1.4.2.Final:create \
-DprojectGroupId=br.com.mp.product \
-DprojectArtifactId=quarkus-product \
-DclassName="br.com.mp.product.api.ProductResource" \-Dpath="/products"
No arquivo pom.xml, vamos adicionar as bibliotecas de persistência e o drive para o Banco de dados Postgres:
Em seguida, crie a entidade Product.java, que será a classe de mapeamento do Hibernate + Panache com o Banco de dados.
Hibernate Validator, veja a anotação @NotBlank com uma mensagem indicando que não é possível salvar um produto, caso o nome e/ou a marca estejam sem conteúdo.
Segundo passo, vamos criar a classe ProductRepository.java, que implementa PanacheRepository, a vantagem é que essa classe possui vários métodos que facilitam a implementação da camada de persistência, como o save, findById, delete, dentre outros.
Por fim, vamos implementar a classe ProductResource.java, que será responsável por prove os serviços REST da nossa aplicação:
Banco de Dados
No arquivo application.properties (dentro da pasta resource), configure o acesso ao banco de dados para o ambiente de desenvolvimento, conforme o exemplo abaixo.
Atenção: a última propriedade destrói e cria o banco de dados automaticamente a cada vez que a aplicação é iniciada, o ideal é utilizar alguma ferramenta de migração de dados, como o Flyway ou outra estratégia. Se vocês quiserem um post sobre o Flyway, deixem nos comentários.
Executando uma instância do Postgresql no Docker (nesse post, apenas para desenvolvimento local)
Iniciando uma instância do Postgresql, utilizando o Docker, para isso, é necessário ter o Docker instalado e então executar o comando listado abaixo:
# Criando uma instância do Postgressql através do Docker
docker run --name postgres-product -e "POSTGRES_PASSWORD=postgres" -p 5432:5432 -v ~/developer/PostgreSQL:/var/lib/postgresql/data -d postgres
Para executar a aplicação, basta executar o seguinte commando:
mvn compile quarkus:dev
ou, se você estiver no IntelliJ, pode executar pela área do Maven, conforme a imagem abaixo:
Após isso, abra o navegador no endereço: http://localhost:8080 e você verá a seguinte página:
Testando a aplicação com o POSTMAN
Listando os produtos cadastrados:
Cadastrar um produto:
Observação: Para o post não ficar muito extenso, o arquivo do Postman está dentro do projeto no Github, com todos os métodos (listar, cadastrar, alterar e remover).
Hibernate Validator
No exemplo a seguir, vamos cadastrar um produto, deixando o nome sem conteúdo, conforme a imagem abaixo:
A própria validação do Hibernate Validator retornou um erro, informando que o Nome do produto não pode ficar sem conteúdo.
Github
Crie um repositório no Github e envie (“commit”) o seu código para lá, esse passo é necessário para realizarmos o deploy no Heroku.
Deploy no Heroku
Criar uma conta no Heroku é super simples, basta seguir os passos do link: https://signup.heroku.com/, lembrando que a conta é gratuita, caso goste, você pode contratar outros planos.
Limitações do plano gratuito:
- A aplicação entra em estado de repouso, caso não receba uma requisição em 30 minutos
- No plano gratuito, as máquinas têm uma configuração mais modesta
Na página inicial do Heroku, clique no botão NEW e em seguida Create new app.
No passo seguinte, escolha um nome para o projeto.
Vá até a aba Deploy e conecte com a conta do Github, conforme a imagem abaixo:
Instruções:
- Digite o nome do seu repositório no Github, no exemplo: quarkus-product
- Clique no botão Search
- Clique no botão Connect
Você pode habilitar o Deploys automáticos, ou seja, assim que tiver um “commit” no Github, uma nova versão será disponibilizada:
Antes de clicar, no botão Deploy Branch, precisamos de duas configurações para executar no Heroku:
Crie o arquivo system.properties (raiz do projeto) e adicione a versão do Java, conforme o exemplo abaixo:
java.runtime.version=11
Crie o arquivo Procfile (raiz do projeto) e adicione a seguinte linha para a execução do projeto no Heroku:
web: java -Dquarkus.http.port=$PORT $JAVA_OPTS -jar target/*-runner.jar
Pode “commitar” os arquivos para o Github, porém, sua aplicação não estará funcionando ainda.
Configuração do Banco de dados no Heroku
Vá até a aba Resource e adicione um Add-ons, do Heroku Posgres
Confirme a opção abaixo:
Após isso, o banco de dados estará disponível, clique no Heroku Postgres, você será redirecionado para a página que contém a configuração do banco de dados.
Página inicial do Heroku Postgres:
Vá até a aba Settings e clique no botão View Credentials, para exibir as configurações do banco de dados
Os dados da configuração são exibidos na imagem abaixo, por questões de segurança os dados de acesso foram omitidos.
Volte para o Dashboard do Heroku, vá até a aba Settings e procure a opção Config Vars, clique no botão Reveal Config Vars, conforme a imagem abaixo:
Configure as seguintes variáveis com seus respectivos valores, lembrando que as configurações, estão na imagem acima:
- DATABASE_HOST
- DATABASE_NAME
- DATABASE_PASSWD
- DATABASE_PORT
- DATABASE_USER
O último passo é configurar o acesso da aplicação, como uma boa prática de segurança, você nunca deve “commitar” dados de produção ou dados sensíveis para o github, já que alguém mal-intencionado pode utilizar os dados de forma abusiva. A melhor forma para evitar qualquer tipo de problemas é configurar variáveis de ambiente.
Arquivo que contém as configurações do banco de dados de desenvolvimento e produção application.properties:
Após isso, faça um commit no Github e aguarde o Deploy no Heroku. (caso tenha configurado o Deploy Automático), se não, basta clicar no Botão Deploy lá no Heroku.
Testando nossa aplicação no Heroku
Cadastrando um produto através do Postman no Heroku
Listando os produtos cadastrados (no Heroku)
Conclusão
Espero que vocês tenham gostado, sinta-se à vontade para sugerir, criticar ou elogiar. Um grande abraço e até a próxima.
Código-Fonte
O código-fonte está disponível no endereço: https://github.com/marcuspaulo/quarkus-product