Transformando seu projeto Spring Boot em Nativo com Spring Native

Odilio Noronha
RapaduraTech
Published in
4 min readSep 22, 2021

O projeto Spring Native fornece suporte para empacotar aplicativos Spring Boot(Buildpaks) como imagens nativas usando GraalVM.

Em comparação com o padrão da ​​JVM, as imagens nativas têm tempos de inicialização mais rápidos (<100 ms) e menor consumo de memória. No entanto, construir uma imagem nativa requer mais tempo do que uma baseada em JVM.

O projeto ainda está em beta, mas já suporta a maioria dos módulos do Spring, incluindo Spring Framework, Spring Boot, Spring Security e Spring Cloud.

Seus recursos o tornam uma boa opção para criar aplicativos com Spring Cloud Function e implantá-los em uma plataforma como Azure Functions, AWS Lambda ou Knative.

Na minha opinião, graalvm foi a mais relevante criação na era java na nuvem(pro ecossistema java).

Desvantagens

Mas nem tudo são flores, além do seu alto tempo de build nos não contamos com alguns recursos de aplicações java comuns como

Java agents, JMX, JVMTI, Java Flight Recorder support

Alguns desses recursos são realmente úteis para gerenciar, testar e controlar seus aplicativos JVM. Como as imagens nativas não residem em um contêiner JVM, esses recursos não estão disponíveis.

Reflection precisa de configurações adicionais

Reflection é amplamente usada em muitos frameworks, portanto, esses frameworks precisam fazer configurações extras para oferecer suporte a imagens nativas. É por isso que o Spring criou o projeto Spring Native.

Temos também o ponto que as otimizações que a jvm costuma fazer, não irão mais ocorrer, coisa que pode ser praticamente irrelevante em um cenário de nuvem com containers subindo e descendo sob demanda.

Construindo um exemplo com o spring native

Primeiro utilize o site https://start.spring.io/ para criar um projeto spring com o modulo web e o modulo native, como mostrado na imagem abaixo, lembrando que o spring native so esta disponível no momento para a versão 2.5.x do spring boot, e no repositório experimental, ja que ainda esta em beta.

Alem da estrutura normal de um projeto spring boot O spring-boot-maven-plugin recebe uma configuração extra pra gerar a imagem nativa:

e essa pra compilar AOT

Coloquei somente as imagens porque esse codigo vai estar no projeto gerado pelo spring initializr.

Agora podemos esse comando maven para gerar a imagem nativa, é um pouco demorado…

./mvnw spring-boot:build-image

o projeto ir buildar e depois começar a gerar a imagem nativa como na imagem abaixo

A saída da execução do comando Maven acima mostra a imagem Docker resultante que contém a imagem nativa GraalVM:

Successfully built image ‘docker.io/library/spring-kotlin-microservice:1.0.0’

agora podemos checar nossas imagens no docker com o comando

docker images

E executar sua imagem com o comando

docker run — name spring-kotlin-microservice -p 8080:8080 spring-kotlin-microservice:1.0.0

Após subir o projeto pode usar um postman da vida ou curl se estiver no linux para testar o seu serviço que agora é nativo!!

curl localhost:8080/print

Com esse simples exemplo podemos ver um pouco do spring native e de como o spring tem tentado se reinventar pra não ficar pra trás na corrida dos frameworks java na nuvem. Com o aplicativo de exemplo conseguimos ver que a imagem nativa inicializa muito mais rápido. Atualmente, o Spring Native ainda é experimental e em beta, mas parece realmente promissor para arquiteturas na nuvem e principalmente serverless.

--

--