Criando uma aplicação REST com Helidon

Neste post veremos como podemos utilizar o micro framework Helidon para criarmos uma api rest rapidamente.

Esse é o terceiro post sobre o assunto de micro framework, outros post sobre o mesmos podem ser vistos aqui :

Para esse post criaremos 2 simples endpoints (get /post) utilizando as seguintes libs :


Introdução ao Project Helidon

Helidon é uma coleção de bibliotecas Java para escrever MicroServiço .

Helidon é composto de 3 componentes :

  • WebServer : Uma API HTTP programática com recursos reativos, desenvolvida pela Netty .
  • Config: Uma estrutura de configuração flexível com suporte para várias fontes e formatos.
  • Security: Uma cadeia de ferramentas para lidar com autenticação, autorização e propagação de contexto.

Alguns do seus recursos são :

  • Simples e rápido : Helidon é projetado para ser simples de usar, com ferramentas e exemplos para você ir rapidamente.
  • Suporte a MicroProfile: Fornece APIs familiares, como JAX-RS, CDI e JSON-P / B. Nossa implementação do MicroProfile é executada em nosso rápido WebServer reativo Helidon .
  • Reactive WebServer: Fornece um modelo de programação funcional moderno e é executado sobre o Netty. Leve, flexível e reativo, o Helidon WebServer fornece uma base simples de usar e rápida para seus microsserviços.
  • Observable e Resilient: Com suporte para verificações de integridade, métricas, rastreamento e tolerância a falhas, o Helidon tem o que você precisa para escrever aplicativos prontos para a nuvem que se integram ao Prometheus, Zipkin e Kubernetes.

Além disso o Helidon é um produto da Oracle e 100% Open Source e está em constante evolução, sinta-se livre para contribuir com o projeto . : )

Bem feita essa rápida introdução sobre o Helidon, vamos partir para construção do nosso projeto .


Criando o Projeto

Crie um projeto Maven com seguinte pom.xml :

O pom.xml não tem nada demais e esta configurado para executar com Java 10, por esse motivo foi incluído o jax-b por causa de algumas bibliotecas fazerem uso da mesma, mais Helidon também funciona com Java 8 .

após criar o projeto, crie dois arquivo xml na pasta “resource/META-INF” conforme mostrado abaixo : beans.xml e persistence.xml

agora daremos inicio na construção das nossas classes, começaremos pelas classes model :

até aqui também nada demais, somente temos um método que faz a conversão para Rest utilizando o Json-P que é o que o Helidon usa por default.

e uma classe que retorna um código e uma mensagem de resposta de sucesso ou erro durante o uso da api :

agora criaremos uma classe produtora utilizando o CDI, para o EntityManager-JPA :

aqui fizemos o uso de duas anotações do CDI o @Produces e @ApplicationScope :

  • @ApplicationScoped : mantém a instância durante todo o tempo de execução da aplicação. É um escopo que compartilha os objetos para todos os usuários do sistema.
  • @Produces: são apenas métodos que produzem objetos que serão administrados pelo contêiner CDI e injetados em outros objetos.

Com o nosso produtor feito, faremos a parte de persistência de dados utilizando o DeltaSpike-Data.

O DeltaSpike-Data é uma alternativa ao Spring-Data para fazermos nossas persistência de forma simples e objetiva, conforme pode ser visto abaixo :

Agora iremos fazer nossa classe Principal do Helidon para nosso serviços Rest :

essa é a nossa classe principal para executarmos o nosso serviço, como pode ser visto não foi utilizado o método main comum,neste caso a aplicação vai ser executada pelo contêiner do CDI na linha 31 .

na linha 33 fazendo o uso do ServerConfiguration para configuramos algumas partes do WebServer , no nosso caso estamos configurando uma porta que vai ser preenchida com um valor aleatório quando a aplicação subir no Application Container através da variável de ambiente .

Já na linha 35 começa de fato a inicialização do Helidon-SE, no caso estamos criando um WebServer passando um configuração da linha 33 e em seguida estamos configurando também uma rota para a nossa aplicação :

Routing.builder : Permite usar critérios de correspondência de solicitação para vincular solicitações a um manipulador que implemente sua lógica de negócios personalizada. Critérios de correspondência incluem um ou mais Métodos HTTP e, opcionalmente, um correspondente de caminho de solicitação.

logo em seguida registramos o suporte a JSON fazendo uso do JsonSupport, que pode padrão o Helidon usa o Json-P para manipular.

Até o momento a versão Helidon-SE não suporta o Json-B, para usar o mesmo podemos fazer o uso do Helidon-MP ou mesmo adicionar uma dependência para suporta via Jersey -> helidon-webserver-jersey .

Nas linha 36 configuramos um endpoint POST para estarmos passando valores via postman/curl em formato de Json com o endereço “/event” passando um Handler com o nome da classe JsonObject e chamando o nosso método addEvent para esta recebendo os valores e persistir em nossa base de dados .

Na linha 37 fazemos um GET e trazemos todas as informações do banco e retornado em formato de Json e na linha de baixo inicia o Helidon chamando o método start.

Da linha 41 a 51 é o nosso método que irá fazer nossa persistência dos dados recebidos em formato Json no que será armazenado na variável json do JsonObject e passado para o nosso método construtor da classe Event fazendo um getString() com os nomes dos campos referentes no documento Json .

Em seguida é criado um ArrayBuilder() o mesmo recebe a classe ResponseModel recebendo com parâmetro o código do status da requisição res.status().code e uma mensagem, logo depois chamamos o método forRest() para que o objeto seja preenchido e que seja devolvido um documento json e passado para o res.send() do Helidon.

Na linha 53 a 59 é o nosso método que devolve todo os dados da base de dados e devolvendo um array de documentos .

apos isso podemos fazer build de nossa aplicação com o comando :

mvn clean package 

após isso dentro da pasta target terá o seguinte conteúdo :

a pasta libs contem os jars que utilizamos no nosso pom.xml, agora basta executar o jar com o comando :

java -jar helidon-sample.jar

e fazer o uso conforme mostrado usando o PostMan :

agora o passo final é subir para um provedor de Cloud através do TerraForm, no caso eu optei pela plataforma da Oracle Cloud, por possuir conta na mesma.


Deploy na Oracle Application Container com TerraForm

Nesta parte faremos um deploy do nosso jar para a Oracle cloud, para isso o leitor(a) precisa ter uma conta Oracle Cloud, você pode usar o seguinte post para se familiarizar com o serviço Oracle Application Container.

Terraform permite criar, alterar e melhorar a infraestrutura de forma segura e previsível. É uma ferramenta de software livre que codifica APIs em arquivos de configuração declarativa que podem ser compartilhados entre os membros da equipe, tratados como código, editados, revisados e versionados.

Podemos fazer o download o TerraForm aqui e configura o mesmo aqui .

e vamos configurar um arquivo para provisionar toda a infraestrutura para fazer deploy para a Oracle .

Aqui vamos utilizar dois provider que o TerraForm oferece para o Oracle Cloud que são :

abra um editor de texto de sua preferencia e crie o seguinte arquivo dentro do nosso projeto :

além disso crie também um manifest.json com o seguinte conteúdo :

e crie um arquivo bash chamado zip.sh, esse script irá automatizar o build do nosso projeto e também executar o TerraForm para criar a infraestrutura :

TerraForm em Execução

bastando acessar a URL apresentada e ao final adicionar os Eventos.

Bem isso é tudo, espero que os leitores tenham gostado de conhecer um novo framework da Oracle para construções de serviços Rest rapidamente .

Código fonte = https://github.com/Daniel-Dos/DanielDiasjava-Blog/tree/master/Projeto-Cloud/helidon-se

REFERÊNCIAS