Micronaut: Uma visão geral
Lançado oficialmente em 23 de outubro de 2018, o Micronaut é um framework full-stack moderno, baseado na JVM e que pode ser utilizado para a construção de microserviços, ferramentas de CLI e aplicações Serverless, de forma modular e facilmente testável.
Mantido pela Object Computing Inc. (OCi), o Micronaut é open-source, sob a licença Apache 2.0, e o projeto está sob a liderança de Graeme Rocher, conhecido na comunidade Java/Groovy por ter sido o criador do framework Grails, trazendo mais de 10 anos de experiência e lições aprendidas com o Grails para criar um novo framework inovador no mundo da JVM. Atualmente, o Micronaut está na versão 1.1.2 e conta com um time de desenvolvedores da OCi dedicados ao projeto, além de vários colaboradores no Github e é apoiado por outras empresas como a JFrog.
No Tech Radar da ThoughtWorks lançado em 29 de abril, o Microunat foi incluído na sessão "experimente", sendo apontado como um promissor framework no ecossistema da JVM.
Uma breve retrospectiva
O Micronaut foi lançado em 2018, mas para entendermos as razões pela qual ele surgiu e o seu real impacto e inovação, precisamos voltar um pouco no tempo.
Dez anos antes do lançamento do Micronaut, em 2008, era lançada a versão 1.0 do Grails e o cenário de tecnologia era completamente diferente do atual. Não tínhamos frameworks front-end modernos como Angular, React, nem muito menos Vue.js. Não tínhamos Docker e microserviços era apenas um conceito em formação, pois sua primeira menção foi feita em um workshop em 2011.
Os softwares na década passada ainda eram monólitos e os principais frameworks do mercado na época, sendo o Spring e o então promissor Grails parte desses frameworks, foram pensados, criados e evoluídos para essa era, onde os monólitos reinavam.
Microrealidade
Agora, na era dos microserviços, os frameworks criados para desenvolver monólitos tiveram que ser adaptados para esse novo paradigma. O Spring recebeu um conjunto de módulos completamente novo, o Spring Cloud, para se adaptar aos novos tempos e solucionar os novos problemas que as aplicações distribuídas trouxeram.
Spring, Grails e Jakarta EE (Microprofile) são frameworks baseados em anotações e Aspect Oriented Programming (AOP), fazendo uso extensivo de reflection, onde são realizadas uma grande quantidade de análises no byte code em tempo de execução (Runtime). A consequência disso é que quanto maior o código da aplicação, maior será o tempo de startup e maior também será o consumo de memória, sendo esse crescimento não linear.
Apesar dos problemas relatados nos frameworks mais difundidos no ecossistema da JVM, eles possuem vantagens que são massivamente valorizadas pela comunidade de desenvolvedores e que promovem um ganho de produtividade muito alto, já que esses frameworks resolvem problemas como segurança, log, profile, sem muito esforço por parte do desenvolvedor, deixando-o focado apenas na lógica de negócio.
Numa época onde infraestrutura é oferecida como serviço, e esse serviço cobra apenas pela quantidade de recurso que é consumido, otimizar o consumo de memória está diretamente relacionado com economia de custos de um projeto.
Outro ponto que merece destaque é a relevância no tempo de disponibilidade das aplicações. Grandes aplicações, como e-commerces, precisam ter 100% de disponibilidade, pois caso a aplicação fique indisponível por pouco tempo poderá gerar um prejuízo financeiro considerável ao negócio. Não é mais plausível que aplicações fiquem indisponíveis devido a alguma atualização, portanto aplicações com alto tempo de startup podem comprometer até mesmo processos de deploy automatizados utilizando orquestradores de containers, como o Kubernetes.
Conciliando desempenho e produtividade
Assim como frameworks antigos nasceram na época dos monólitos para resolver problemas dos monólitos, novos frameworks surgiram na era dos microserviços para resolver problemas dos microserviços.
Um ponto de partida para criação de novos frameworks voltados para microserviços foi prover suporte para 12 fatores tidos como cruciais para web-apps modernos, conhecido como Twelve Factor.
A motivação para criar o Micronaut foi ter um framework escrito do zero, que fosse pensando para facilitar a criação de microserviços e aplicações serverless, seguindo o twelve factor, e que tivesse um baixo consumo de memória e baixo tempo de startup, além de possuir executáveis pequenos, tudo isso sem perder a produtividade que os frameworks modernos como o Spring e o Grails conseguem prover aos desenvolvedores.
Para atender a todos esses pré-requisitos era necessário pensar um passo a frente do que foi pensado para os frameworks já existentes.
O diferencial do Micronaut
O processo de reflection logo foi visto como um fator crítico, pois afetava diretamente o consumo de memória e o tempo de startup da aplicação, uma vez que era necessário analizar todos os beans em busca de anotações e então gerar metadados para essas anotações que eram armazenados em memória. A solução adotada pelo Micronaut foi mitigar ao máximo o uso de reflection, que não foi removido totalmente mas é utilizado apenas em casos muito pontuais.
Outro ponto que o Micronaut inovou foi na resolução de injeção de dependências e AOP, que antes eram realizados em tempo de execução e agora passam a ser resolvidos em tempo de compilação.
Essa mudança de ações que eram antes realizadas em tempo de execução e agora são resolvidas em tempo de compilação não é algo novo, o Google Dagger já utilizava essa abordagem para Android, uma vez que dispositivos móveis que utilizam o sistema operacional da Google possuem recurso de memória bastante limitado, então a otimização no consumo deste recurso se torna crucial para criar um app com desempenho satisfatório sem consumir grande parte da memória do dispositivo.
Visão Geral
Conhecido como um framework poliglota, o Micronaut suporta três diferentes linguagens que rodam na JVM: Java, Kotlin e Groovy. A flexibilidade do framework é algo que chama a atenção pois é possível escrever a implementação da aplicação em Java e os testes em Groovy usando a biblioteca Spock.
O framework se mostra flexível também nas diferentes possibilidades de aplicações que o mesmo suporta. Com o Micronaut é possível criar microserviços, aplicações Serverless, ferramentas de CLI, aplicativos Android, IoT ou até mesmo o "bom" e velho monólito.
Outra característica muito importante é que o Micronaut é cloud native, permitindo integração com uma série de ferramentas que dão suporte para cloud. O Micronaut suporta service discovery (Consul e Eureka), load balancing (Ribbon), circuit breakers (AOP, Hystrix), log tracing (Zipkin e Jaeger), configuration (Consul e Spring Cloud Config), monitoring (Micrometer). Além disso, o boilerplate do projeto já incluir um Dockerfile para criação da imagem da aplicação e possui suporte para integração com Amazon AWS e Google Cloud Plataform.
Suporte para Graal VM
A nova VM da Oracle, Graal VM, vem se mostrando como um novo caminho para melhorar o desempenho e consumo de recursos de linguagens que rodam na JVM. Devido a deficiências como tempo de startup e consumo de memória, já citados previamente, o Java vem perdendo espaço como linguagem escolhida para implementação de microserviços.
O fato do Micronaut não utilizar reflection e já resolver DI e AOP em tempo de compilação já torna o framework apto para ser compilado para código nativo pela Graal VM, melhorando ainda mais o desempenho da aplicação.
Comunidade
Apesar de ser um projeto recente, com menos de um ano após o lançamento da versão 1.0.0 GA, a comunidade do Micronaut já tem uma boa presença no Stackoverflow.
O Github do projeto possui também uma boa quantidade de threads e issues resolvidas. Caso tenha encontrado um novo bug, é possível abrir uma nova issue.
Outro meio de contato com a comunidade é através do Gitter, que já conta com uma boa quantidade de membros.
Próximos passos
Agora que o Micronaut foi apresentando, mostrando as suas diferenças com relação a outros frameworks já consolidados no cenário da JVM e quais os problemas que o Micronaut vem para resolver, é hora de mostrar como dar os primeiros passos com esse framework promissor.
Sequência: Primeiros passos com Micronaut
Referências
- [Talk Graeme Rocher] — https://www.youtube.com/watch?v=BL9SsY5orkA
- [Micronaut Doc] — https://docs.micronaut.io/latest/guide/index.html
- [Micronaut Guide] — https://guides.micronaut.io/index.html
- [Micronaut Cloud Native] — https://medium.com/@mesirii/cloud-native-with-micronaut-733c9784850f
- [ThoughtWorks Tech Radar] — https://www.thoughtworks.com/radar