- Acesso a uma conta de trial na Oracle Cloud Infrastructure
- Crie uma nova Virtual Cloud Network utilizando a documentação https://docs.oracle.com/pt-br/iaas/Content/GSG/Tasks/creatingnetwork.htm#Creating_a_Virtual_Cloud_Network
- Verifique se nas configurações da Virtual Cloud Network, em Listas de Segurança, se as portas 22/TCP, e 8080/TCP estão presentes nas regras de Ingresso (Ingress), senão adicione a regra que está faltando usando o template abaixo:
- Tipo: Ingress
- CIDR: 0.0.0.0/0
- Protocolo: TCP
- Target (Destino): 8080,22
- Crie uma instância utilizando a Guia de Imagens Oracle tendo como imagem a Oracle Cloud Developer Image https://docs.oracle.com/pt-br/iaas/oracle-linux/getting-started/index.htm#.
- A Instância deve ser provisionada na subnet publica!
- Não se esqueça de salvar o par de chaves gerado pelo formulario de criação
- Acesse a instancia utilizando o cloud shell:
- Abra o cloud shell na barra superior no direito da console
- Aguarde o terminal iniciar, clique e arraste os arquivos de chave gerados
- Utilize o comando abaixo para acessar a instancia via SSH substituindo as informações de IP Publico, e Chave privada:
ssh -i <chave-privada> opc@<IP-Publico>
- Ao acessar a instância adicione a porta 8080/TCP a regra de firewall
sudo firewall-cmd --zone=public --permanent --add-port=5000/tcp sudo firewall-cmd --reload
- Instale o recurso de native image da GraalVM:
gu install native-image
Essa demo mostra como você pode construir um simples microsserviço utilizando Spring Boot compilado a partir da GraalVM Native Image. O recurso de native image compila o código java como um executavel nativo do sistema, isso reduz drasticamente o tempo de startup da aplicação, e reduz também o consumo de recursos como tamanho (de imagens de containers), e de memória visto que a build final gera um executavel que não depende da JVM.
Para esse guide você vai usar: GraalVM, o projeto Spring Native(Experimental) e o recurso GraalVM Native Build Tools.
O microsserviço dessa demo gera frases aleatórias baseadas no estilo do poema Jabberwocky (por Lewis Carrol). Para executar essa feature nosso microsserviço utiliza uma cadeia de Markov para modelar o texto do poema original e randomizar frases que pareçam ser como as originais. (É importante darmos um pouquinho de trabalho para o microsserviço)
Esse projeto utiliza Maven. Para nossa primeira etapa, compilaremos da forma tradicional onde geraremos o arquivo jar
:
mvn clean package
isso também construirá uma imagem Docker contendo o arquivo jar
gerado. A imagem esta sendo executada usando o GraalVM Enterprise Edition como JVM, o que por si só já traz ganho de performance visto que a Graal tem um footprint menor, e formas mais otimizadas para acessar recursos.
Quick Note: O GraalVM possui sua versão Community, e sua versão Enterprise com suporte. Em Oracle Cloud, em todos os serviços onde você possui acesso, de alguma forma, ao sistema operacional (Containers, Functions, Instancias...), você tem direito a versão Enterprise do GraalVM e ao Java SE! (Yaaay!!)
Continuando execute:
java -jar ./target/benchmark-jibber-0.0.1-SNAPSHOT.jar &
# Aguarde um tempinho até a JVM iniciar
sleep 4
# Chame o endpoint
curl http://localhost:8080/jibber
# Traga o processo de volta, e finalize-o (CTRL+C)
fg
Para rodar como um container Docker execute: (A imagem foi gerada pelo processo do Maven)
docker run --rm --name graalce -d -p 8080:8080 jibber-benchmark:graalee.0.0.1-SNAPSHOT
Você pode testar a aplicação da mesma forma usando curl
- Lembre-se de esperar um tempinho até a aplicação estar no ar.
Agora vamos construir nossa aplicação como um executavel nativo. Esse processo também vai gerar uma nova Docker Image.
Execute:
# A propriedade -Dnative é usada para "ativar" o processo de build nativo que está dentro do arquivo do maven
mvn package -Dnative
Esse processo gerará um novo binário presente em target/jibber
. Agora você pode executa-lo como uma aplicação nativa do Linux:
./target/jibber &
curl http://localhost:8080/jibber
fg
Pelo log do executavel é possivel notar que a aplicação inicia muito mais rapido do que a versão anterior empacotada em jar
.
Execute os seguintes comandos:
docker build -f Dockerfiles/Dockerfile.native --build-arg APP_FILE=target/jibber -t jibber-benchmark:native.0.0.1-SNAPSHOT
Assim que iniciado você pode executar o container usando:
docker run --rm --name native -d -p 8080:8080 jibber-benchmark:native.0.0.1-SNAPSHOT
Essa demo foi baseada na demo presente no repositório de demos da GraalVM.
Existem mais projetos que já sairam de fase experimental, que também fazem uso do recurso de compilação nativa da GraalVM que valem a pena você dar uma olhada:
- Helidon
- Quarkus (Ele também possui um initializer similar ao Spring https://code.quarkus.io/)
- Micronaut (Também possui um initializer https://micronaut.io/launch)