QuarkusIO — Supersonic Subatomic Java

Hoje vamos iniciar um tutorial para aprender um pouco como utilizar esse framework java nativo da RedHat, que espera se tornar a plataforma líder em ambientes Serverless e Kubernetes, além de oferecer aos desenvolvedores um modelo unificado de programação reativa e imperativa.

O QuarkusIO aproveita uma série de libs comuns para os desenvolvedores Java, e algumas delas estão muito no hype como a Eclipse MicroProfile, Kafka e Vert.x. A injeção de dependência na framework é baseada no CDI, permitindo que os desenvolvedores usem JPA/Hibernate, JAX-RS/RESTEasy e etc.

Baseado nos melhores padrões, baixo consumo de processamento e tempo de inicialização incrivelmente rápido, o Quarkus permite o uso do Java em ambientes serverless, suportando um ambiente responsivo e escalável.

1 — Nossa primeira aplicação

A forma mais fácil e rápida de criar nossa primeira aplicação Quarkus seria via linha de comando utilizando o Maven.

mvn io.quarkus:quarkus-maven-plugin:0.13.1:create \
 -DprojectGroupId=com.ivanmarreta.quarkus \
 -DprojectArtifactId=quarkus-project \
 -DclassName=”com.ivanmarreta.quarkus.SampleResource” \
 -Dpath=”/sample”

Este comando irá gerar um esqueleto do projeto, com um resource chamado SampleResource e com um endpoint /sample exposto, configurações e Dockerfiles.
Sendo um projeto maven, agora basta fazer o importe para sua IDE favorita, a estrutura será similar a esta:

Image for post
Eu utilizo o Intellij IDEA

Na nossa classe SampleResource temos o seguinte código:

@Path(“/sample”)
public class SampleResource {
  @GET
  @Produces(MediaType.TEXT_PLAIN)
  public String hello() {
    return “hello”;
  }
}

E para executar nossa aplicação basta executar no terminal o comando:

./mvnw compile quarkus:dev

Na primeira vez o maven irá efetuar o download dos artefatos necessários e logo a aplicação estará up:

Image for post
Mac OSX terminal screenshot

Pronto! Sua primeira aplicação está UP!

Para acessar o endpoint exposto podes testar via browser ou, como gosto de testar, via terminal:

curl -w “\n” http://localhost:8080/sample

Obtemos o resultado esperado: a string “hello”. (clap clap clap)

2 — Hot Reload

Image for post

No modo de desenvolvimento (./mvn compile quarkus:dev), o Quarkus fornece um recurso de Hot Reload. Com isso, as alterações feitas nos arquivos Java ou nos arquivos de configuração serão compiladas automaticamente assim que o navegador for atualizado ou, uma request for efetuada. O recurso mais impressionante aqui é que não precisamos salvar nossos arquivos. Portanto, dependendo da sua preferência, podes achar isso bom ou ruim.

Agora vamos observar como o Hot Reload age!


Na nossa ide criaremos uma classe chamada SampleService:

@ApplicationScoped
public class SampleService {
  public String hello(String name) {
    return String.format(“Hello %s. This is your first QuarkusIO
                          sample!”, name);
  }
}

E agora vamos injetar essa classe utilizando CDI no nosso resource, criando também um novo endpoint exposto:

@Path(“/sample”)
public class SampleResource {
  @Inject
  SampleService service;
  @GET
  @Produces(MediaType.TEXT_PLAIN)
  public String hello() {
    return “hello”;
  }
  @GET
  @Path(“/{name}”)
  public String hello(@PathParam(“name”) String name) {
    return service.hello(name);
  }
}

E então executamos nossa requisição ao nosso novo endpoint:

curl -w “\n” http://localhost:8080/sample/Ivan

Hello Ivan. This is your first QuarkusIO sample!

Conforme mencionei, podemos também alterar arquivos de configuração.

Vamos adicionar ao arquivo application.properties a linha:

hello=Hello %s. This is your first QuarkusIO sample!

E em nossa classe de serviço SampleService, vamos injetar a propriedade utilizando a anotação @ConfigProperty do Eclipse Microprofile.

Nossa classe ficará simples como isso:

@ApplicationScoped
public class SampleService {
  @ConfigProperty(name = “hello”)
  private String hello;
  public String hello(String name) {
    return String.format(hello, name);
  }
}

Basta repetir a request e verás que o resultado será o mesmo e, podes até brincar alterando a string adicionada ao application.properties.


3 — Json no response dos Rest Services

Agora vamos tornar as coisas um pouco mais divertidas e aumentar um pouco a “dificuldade”.

Vamos adicionar código para retornar uma lista de objetos do tipo Sample.

public class Sample {
  private int order;
  private String name;
  //…
}

Na nossa SampleService, adicionamos o método:

public List<Sample> list(){
   Sample sample1 = new Sample(1, “Nossa primeira aplicação”);
   Sample sample2 = new Sample(1, “Hot Reload”);
   Sample sample3 = new Sample(1, “Json no response dos Rest ...”);
   return Arrays.asList(sample1, sample2, sample3);
}

E nossa classe SampleResource, agora completa, ficará assim:

package com.ivanmarreta;
import javax.inject.Inject;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
@Path(“/sample”)
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class SampleResource {
  @Inject
  SampleService service;
  @GET
  public String hello() {
     return “hello”;
  }
  @GET
  @Path(“/{name}”)
  public String hello(@PathParam(“name”) String name) {
     return service.hello(name);
  }
  @GET
  @Path(“/list”)
  public Response list() {
     return Response.ok(service.list()).build();
  }
}

Ao executar a request:

curl -w “\n” http://localhost:8080/sample/list

Iremos receber a seguinte resposta:

Could not find MessageBodyWriter for response object of type: java.util.Arrays$ArrayList of media type: application/json

Mas não se preocupe, está correto. O que tem de errado então? Precisamos adicionar no pom.xml a seguinte dependencia:

<dependency>
 <groupId>io.quarkus</groupId>
 <artifactId>quarkus-resteasy-jsonb</artifactId>
</dependency>

JSON-B não é a única forma de desserialização, podes também utilizar o Jackson, depende da sua preferência.

Bom, após adicionar a dependência, enfim, devemos reiniciar a app no nosso terminal, pois o maven precisará adicionar bibliotecas ao projeto. Desta vez verá que em questão de milisegundos a aplicação é started. õ/

Agora podemos testar nossa request e verificar o resultado:

curl -w “\n” http://localhost:8080/sample/list

[{“name”:”Nossa primeira aplicação”,”order”:1},{“name”:”Hot Reload”,”order”:1},{“name”:”Json Rest Services”,”order”:1}]

Nossa, muito complicado não é? 🙂


4 — Packaging da nossa aplicação

Via terminal, executamos:

./mvnw package

Serão gerados 2 artefactos jar dentro da pasta target:

Jar executável com todas as dependencias:
ivanmarreta-quarkus-project-1.0-SNAPSHOT-runner.jar

Jar contendo classes e resources:
ivanmarreta-quarkus-project-1.0-SNAPSHOT.jar

Agora para executar sua aplicação basta rodar o jar:

java -jar target/ivanmarreta-quarkus-project-1.0-SNAPSHOT-runner.jar

😉

5 — Conclusão

Demonstramos aqui um pouco do Quarkus, e verificamos que é um ótimo framework para levar o Java de maneira mais eficaz à nuvem. Por exemplo, agora é possível imaginar Java no AWS Lambda ou outra plataforma Serverless. Além disso, o QuarkusIO é baseado em padrões como JPA e JAX/RS. Portanto, para desenvolvedores Java experientes, não existe uma barreira de curva de aprendizado.

No próximo post sobre o QuarkusIO iremos explorar recursos mais avançados! õ/

Espero ler o que acham sobre o framework nos comentários e debater sobre o assunto.

Obrigado 🙂

Published by Ivan Marrêta

Software Engineer

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: