Alura > Cursos de Programação > Cursos de Java > Conteúdos de Java > Primeiras aulas do curso Java e Quarkus: desenvolva aplicações Cloud Native

Java e Quarkus: desenvolva aplicações Cloud Native

Criando API's Rest - Apresentação

Olá, tudo bem? Meu nome é João Victor e serei o instrutor no curso sobre Quarkus.

Audiodescrição: João Victor é um homem branco, de cabelo curto castanho, sobrancelhas castanhas e olhos castanhos. Ele veste uma camisa azul e está em um ambiente de escritório com uma parede clara ao fundo.

O Quarkus é um framework que vem ganhando cada vez mais espaço na comunidade entre as pessoas desenvolvedoras de software que utilizam Java, Kotlin e outras linguagens que usam a Java Virtual Machine (JVM).

O Quarkus é conhecido como Java Supersônico Subatômico porque tende a ser mais rápido que os demais frameworks, entregando respostas de forma mais rápida e iniciando de maneira mais ágil. É um framework muito bem cotado para ser usado em aplicações Cloud Native.

O que vamos aprender?

Neste curso, utilizaremos diversos recursos do Quarkus, desde suas extensões até extensões externas que o próprio Quarkus incorporou e melhorou.

Na IDE do IntelliJ, simularemos um sistema bancário, onde teremos um endpoint para cadastrar, remover e alterar agências bancárias - um sistema comum em empresas de fintech e outras que utilizam esse tipo de linguagem.

Teremos também a oportunidade de consumir alguns recursos REST. Utilizaremos recursos do Quarkus para consumir APIs e criaremos nossas próprias APIs usando o new RestClient.

Haverá uma parte dedicada a testes, então, se você ainda não há muito conhecimento sobre teste de unidade, este é o momento de aprender. Implementaremos uma regra de negócio que permitirá realizar testes interessantes usando JUnit e Mockito.

Além disso, discutiremos sobre observabilidade, abordando log e métricas com Prometheus e Grafana. Inclusive, construiremos um dashboard interessante com métricas desenvolvidas ao longo do curso e também com métricas da aplicação.

Feito isso, ainda teremos a parte de deploy, onde utilizaremos o Docker Compose para subir a aplicação, integrando-a com o banco de dados, permitindo seu uso onde desejarmos.

É um conteúdo bastante interessante, com especificações que usamos no dia a dia no mundo Java e recursos utilizados em ambientes produtivos e em grandes empresas no Brasil e no mundo. Por isso, não deixe de participar deste curso.

Até o próximo vídeo!

Criando API's Rest - Criando o projeto

Para começar a desenvolver nossa aplicação Quarkus, precisamos de um ambiente onde possamos criar nossas classes e todos os recursos necessários ao longo do curso.

Configurando a aplicação

O Quarkus nos fornece uma interface gráfica de configuração da aplicação para poder selecionar o nome da aplicação, as dependências que utilizaremos e a versão do Quarkus desejada. No momento da gravação, estamos na versão 3.16, mas utilizaremos a versão 3.15, que é uma versão LTS (long-term support). Basta escolher essa versão no dropdown na barra superior do site.

Podemos configurar todos os detalhes da aplicação no tópico "Configure your application":

Definimos o grupo como br.com.alura e o nome da aplicação como banking-service, pois criaremos uma aplicação para cadastro de agências bancárias. Também mantemos selecionado o Maven como ferramenta de construção.

Além disso, definimos a versão do projeto como 1.0, já que será a primeira versão do projeto e o Java na versão 21. Configuramos o código inicial como No, pois não queremos que inicie com nenhum código fornecido pelo Quarkus. Desenvolveremos toda a aplicação do zero.

Definindo dependências

No tópico "Start from an extensions preset", o Quarkus já oferece alguns modelos de dependências para criar a aplicação. Por exemplo, se quisermos uma aplicação com REST e serviço com banco de dados, ele já sugere as dependências necessárias.

Vamos usar isso como exemplo. Clicando no quadrante "REST service with database", encontraremos as seguintes dependências:

Primeiro, precisamos do quarkus-rest, pois teremos APIs REST na aplicação. Também precisamos de um desserializador, então usaremos o quarkus-rest-jackson. Como utilizaremos um banco de dados, também utilizaremos o Panache, uma dependência própria do Quarkus, e o PostgreSQL.

Além dessas dependências, precisaremos do quarkus-micrometer para trabalhar com métricas. No centro da tela, há uma barra de pesquisa onde digitamos "Micrometer" e selecionamos a primeira opção, "Micrometer Metrics".

Também precisaremos da dependência quarkus-rest-client-jackson. Vamos procurá-la na barra de pesquisa e selecionar a opção "REST Client Jackson", que já traz o Serializador Jackson.

Gerando a aplicação

Com essas configurações de dependência (REST, REST Jackson, ORM, Panache, JDBC Driver, Micrometer e REST Client Jackson), estamos prontos para começar a aplicação.

No canto superior direito, clicamos no botão "Generate Your Application" (ou atalho "Alt + Enter") para fazer o download. Optamos por baixar o app compactado, clicando no botão "Download the ZIP".

No explorador de arquivos, acessamos a pasta de "Downloads" e copiamos o arquivo banking-service.zip para a pasta "Workspace", onde desenvolveremos o projeto. Feito isso, podemos clicar com o botão direito e escolher a opção "Extrair tudo" para extrair a aplicação nessa pasta. Por fim, podemos apagar o ZIP.

Subindo a aplicação

Agora, podemos abrir a IDE. No menu superior do IntelliJ, selecionamos a opção "File > Open" e escolhemos a pasta banking-service. Abrimos em uma nova janela, pois já temos outra aplicação aberta.

Podemos abrir a pasta "src" para conferir a estrutura de diretórios de um projeto Maven. Nela, encontramos o "main", que por sua vez, contém "docker", "java", "resources". Mas ainda não há nenhum código, pois pedimos para não gerar classes pelo Quarkus.

Agora, podemos subir a aplicação. No canto inferior direito, aparece um aviso "Maven Build Script Found". Clicamos no botão "Load" para mandar carregar e construir a aplicação. Devemos esperar enquanto todas as dependências são baixadas.

Com isso, aparece o ícone do Maven na barra lateral direita. A aplicação pode já mostrar esse ícone ou, como no nosso caso, pedir para fazer o load. Assim que resolvermos todas as dependências, poderemos subir a aplicação.

No painel de ferramentas do Maven, vamos expandir a parte do plugin para conferir um subplugin chamado quarkus. Podemos expandi-lo clicando na seta à esquerda. Dentre uma série de outros subplugins, encontramos o quarkus:dev. Esse modo é interessante, pois podemos clicar duas vezes nele para subir a aplicação.

A diferença é que, ao desenvolver e precisar alterar algo, podemos modificar o código sem parar e subir a aplicação novamente. As alterações refletem imediatamente ao fazer uma nova requisição, permitindo um desenvolvimento contínuo.

Clicamos duas vezes no quarkus:dev, o que é suficiente para carregar a aplicação. Neste momento, não há nada desenvolvido, mas podemos verificar que a aplicação está funcionando, pois Quarkus possui uma página padrão de boas-vindas.

No terminal, podemos conferir todas as features instaladas, como REST, REST Client e REST Client Jackson. No navegador, acessamos a seguinte URL:

http://localhost:8080

Desse modo, acessamos uma interface do Quarkus que nos parabeniza por subir a primeira aplicação Quarkus.

Próximos passos

A partir deste ponto, cabe a nós desenvolvermos o sistema de cadastro de agências. Neste vídeo, o objetivo era criar a aplicação. Nos próximos vídeos, começaremos o desenvolvimento da aplicação.

Criando API's Rest - Consumindo API com RestClient

Agora que criamos nossa aplicação, chegou o momento de começar a desenvolver nossos recursos. Antes de adicionar uma agência via REST API, precisaremos fazer uma requisição para uma API externa para validar se essa agência está ativa ou não.

Para consumir uma API externa, utilizaremos o REST Client.

Voltando para nossa aplicação, podemos minimizar o menu do Maven, clicando no botão "Hide" canto superior direito (ou atalho "Shift + Escapa") e fechar a aba do arquivo pom.xml, clicando em "Close" (ou atalho "Ctrl + F4").

Verificando retorno da API externa

Primeiro, vamos verificar o que essa API externa retorna. No Postman, vamos fazer uma requisição GET para http://localhost:8181/situacao-cadastral, teremos o retorno dessa API.

Retorno com status 200 OK em 10ms:

[
    {
        "id": 1,
        "nome": "Agencia BSB",
        "razaoSocial": "Asa Norte AGENCIA BSB",
        "cnpj": "15130254000100",
        "situacaoCadastral": "ATIVO"
    }
]

Ela retornará o nome da agência, a razão social, o CNPJ e a situação cadastral. Precisamos consumir essa API para validar se a agência está ativa ou não. Se não estiver ativa, faremos algum tratamento, por exemplo, não adicionar a agência ao nosso sistema.

Criando Enum para situação cadastral

Precisamos de um modelo na nossa aplicação banking-service que contenha o nome, a razão social, o CNPJ e a situação cadastral para consumir esses dados.

Vamos voltar à IDE para começar o desenvolvimento da aplicação. No painel lateral esquerdo que contém a estrutura de diretórios do Maven, expandiremos os módulos. Em "src > main", há um diretório para o "docker", um para "java" e um para "resources".

No diretório "java", clicaremos com o botão direito e escolheremos as opções "New > Package" para criar um pacote chamado "br.com.alura.service.http".

Clicando no pacote recém-criado com o botão direito, vamos selecionar "New > Java Class" para criar um Enum chamado SituacaoCadastral. A nomenclatura será PascalCase, ou seja, tudo junto e com "S" e "C" maiúsculos.

Definiremos dois tipos de situação cadastral: ATIVO e INATIVO.

SituacaoCadastral.java:

package br.com.alura.service.http;

public enum SituacaoCadastral {

    ATIVO, INATIVO
}

Criando modelo para referenciar dados da API

Agora, precisamos criar uma classe Java chamada AgenciaHttp. Esta será nosso modelo para referenciar os dados retornados pela API. Precisamos traduzir a informação da API para nosso sistema, usando a classe AgenciaHttp.

Vamos criar os mesmos campos que conferimos no Postman. Não precisamos mapear o ID, apenas o nome, a razão social, o CNPJ e a situação cadastral.

O nome, a razao social e o cnpj serão strings, e a situacaoCadastral será o enum SituacaoCadastral que acabamos de criar. Todos serão variáveis privadas.

AgenciaHttp.java:

package br.com.alura.service.http;

public class AgenciaHttp {

    private String nome;
    private String razaoSocial;
    private String cnpj;
    private SituacaoCadastral situacaoCadastral;

}

Com isso, temos o modelo da informação que retornará da API.

Configurando serviço HTTP

Agora, ainda dentro do pacote "http", precisamos criar uma interface Java chamada SituacaoCadastralHttpService. Este será o serviço que permitirá à aplicação banking-service fazer requisições para a API externa.

A primeira etapa é indicar que este serviço é um @RegisterRestClient(). Precisamos informar à aplicação que este serviço é um REST Client. O Quarkus usa o MicroProfile para trabalhar com essas especificações, muito utilizado no mundo Java para aplicações cloud services.

Além disso, precisamos adicionar o path da aplicação. O path indicará qual requisição fazer para a API externa, ou seja, qual recurso acessar. Nesse caso, queremos cadastrar /situacao-cadastral.

Por isso, acima do @RegisterRestClient(), anotamos com @Path() que utiliza uma especificação do Jakarta EE, passando o recurso que iremos acessar entre aspas duplas, /situacao-cadastral. O host será configurado em outro momento.

Também configuraremos uma configKey no @RegisterRestClient(), que será útil ao configurar o host. Essa chave será chamada de situacao-cadastral-api.

SituacaoCadastralHttpService.java:

package br.com.alura.service.http;

import jakarta.ws.rs.Path;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;

@Path("/situacao-cadastral")
@RegisterRestClient(configKey = "situacao-cadastral-api")
public interface SituacaoCadastralHttpService {

}

Criamos como uma interface, pois o Quarkus, no tempo de build, criará a implementação. Isso nos dá flexibilidade, pois não precisamos nos preocupar com a implementação.

O que a API vai nos retornar? Retornará informações que representaremos como AgenciaHttp. O método que o serviço de banking-service chamará para acessar a API externa retornará uma AgenciaHttp, onde mapeamos esses dados.

Usamos o REST Client Jackson, pois, quando o sistema faz a requisição para a API, ele fará a serialização para uma AgenciaHttp - sem precisar de conversão manual. Essas são as facilidades que o uso do Quarkus e suas dependências nos possibilita.

O nome do método será buscarPorCnpj(), pois chamaremos pelo CNPJ para saber se uma agência está ativa. O método receberá o cnpj como parâmetro, que será do tipo string.

Desse modo, antes de cadastrar a agência, chamamos buscarPorCnpj(), que verificará se está ativa e responderá. Dependendo da resposta, cadastramos ou não.

Agora, explicitamos o @GET, pois a requisição para o serviço que consumimos é um GET, passando o CNPJ. Também precisamos definir um @Path da API que consumimos, passando um placeholder que será cnpj, entre aspas duplas e chaves.

import com.alura.agencias.domain.http.AgenciaHttp;
import jakarta.ws.rs.GET;

@Path("/situacao-cadastral")
@RegisterRestClient(configKey = "situacao-cadastral-api")
public interface SituacaoCadastralHttpService {

    @GET
    @Path("{cnpj}")
    AgenciaHttp buscarPorCnpj(String cnpj);
}

Com isso, informamos que a requisição para cadastrar a agência na aplicação será um GET, chamando /situacao-cadastral e passando um CNPJ.

Implementando métodos de recuperação de dados

Agora que criamos a interface SituacaoCadastralHttpService, que o próprio Quarkus vai configurar, precisamos retornar a AgenciaHttp.java.

Vamos criar os métodos GET, com a ajuda do IntelliJ, para recuperar essas informações. Basta digitar get e usar o autocompletar para criar um getNome(), getRazaSocial(), getCnpj() e getSituacaoCadastral().

AgenciaHttp.java:

public String getNome() {
        return nome;
}

public String getRazaoSocial() {
        return razaoSocial;
}

public String getCnpj() {
        return cnpj;
}

public SituacaoCadastral getSituacaoCadastral() {
        return situacaoCadastral;
}

Configurando o host no arquivo de propriedades

Como a aplicação saberá que deve chamar a API em http://localhost:8181? Configuraremos no arquivo application.properties, que o Quarkus já forneceu, dentro do diretório "resources".

No application.properties, cadastramos o host da API quarkus.rest-client.situacao-cadastral-api. É por isso que criamos um configKey no serviço. Sem essa chave, precisaríamos passar o full qualified name, ou seja, o nome completo da classe de serviço - o que ficaria muito longo.

Falta apenas colocar .url que será igual a http://localhost:8181.

application.properties:

quarkus.rest-client.situacao-cadastral-api.url=http://localhost:8181

Com isso, a aplicação banking-service está pronta para chamar a API externa. Configuramos o host e o Quarkus, no momento de build, implementará a interface de serviço e fará a requisição HTTP para utilizarmos os dados.

Próximos passos

No próximo vídeo, iremos criar a API para cadastrar a agência.

Sobre o curso Java e Quarkus: desenvolva aplicações Cloud Native

O curso Java e Quarkus: desenvolva aplicações Cloud Native possui 157 minutos de vídeos, em um total de 47 atividades. Gostou? Conheça nossos outros cursos de Java em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Java acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas