Bibliotecas de Servidores HTTP leves para Java e Kotlin
Palavras chave relacionadas: bibliotecas, micro frameworks, frameworks, RestFULL, Rest, APIs, backend
Frameworks para desenvolvimento de sistemas Web em Java e Kotlin como Spring, Spring Boot, Apache Struts, Seam trazem alguns contras se forem escolhidos como base para desenvolvimento de seu software como:
- Requer o download e uso de diversas bibliotecas dependentes, o que acaba deixando o software pesado
- Requer compreensão de padrões de projetos, convenções, Inversão de Controle, Injeção de Dependência, MVC, etc...
- Requer uso de annotations e um estudo de como o framework funciona, e de programar segundo esses moldes
- Requer uso de servidores de aplicação específicos pesados
Servidores de aplicação como Glassfish, Wildfly/JBoss, Tomcat (instalado), Jetty (instalado) são difíceis de instalar, configurar e podem requerer muito poder de processamento e memória para um simples programa hello world.
Para desenvolver aplicações simples e leves, aprender e até mesmo criar microserviços, o uso desses frameworks trazem esses malefícios, que as vezes podem inviabilizar a solução.
Como solução, você pode optar por usar frameworks, ferramentas e bibliotecas para criar servidores HTTP mais leves e simples, que irão resolver estes problemas.
Servidores HTTP leves para o Java
Para criar servidores HTTP leves temos no Java as bibliotecas/frameworks: Jetty, Netty, Javalin, Spark e Undertow. Ambos são web servers que podem ser embarcados em uma aplicação Java, sem necessidade de instalar pesados servidores de aplicação como o Glassfish, Wildfly ou JBoss.
Bibliotecas de "alto nível"
Spark
É um micro-framework para criação de serviços HTTP embarcados, e um dos mais famosos. Ele usa o Jetty por trás dos panos.
É muito fácil de usar e criar aplicações HTTP nele.
Javalin
É um micro-framework para criação de serviços HTTP embarcados, e um dos mais famosos. Ele usa o Jetty por trás dos panos e foi altamente inspirado pelo Spark. Grande parte de seu código foi feita em Kotlin, então sua integração com ele é muito boa apesar de funcionar muito bem em Java também.
É muito fácil de usar e criar aplicações HTTP nele.
Micronaut
É um framework leve e fortemente voltado para micro-serviços. Usa o Netty por trás dos panos e é compatível com o GraalVM.
Tem como base o uso de Annotations para reduzir a verbosidade no código e fazer injeção de dependência e inversão de controle.
Eclipse Vert.x
É uma biblioteca com servidor HTTP embutido para processamento assíncrono com base no paradigma reativo. O Vert.x não é apenas um servidor HTTP, mas ele conta com um para fazer suas operações. Usa o Netty por baixo dos panos.
Quarkus
É um framework baseado no Eclipse Vert.x para criar aplicações e micro serviços. É um dos concorrentes do Spring Boot e do Micronaut. Seu diferencial com relação aos concorrentes é de ser feito e otimizado para funcionar com Kubernetes, Java Virtual Machine versão HotSpot e o GraalVM.
Tem como base o uso de Annotations para reduzir a verbosidade no código e fazer injeção de dependência e inversão de controle.
Comparando Quarkus com Spring Boot
https://medium.com/swlh/springboot-vs-quarkus-a-real-life-experiment-be70c021634e
Bibliotecas de "baixo nível"
O que queri dizer com "baixo nível" é que são mais complexas e verbosas de se trabalhar. Geralmente fazer algo simples nestas bibliotecas requerem várias linhas de código e uma compreensão sobre os funcionamentos dos protocolos TCP e HTTP. É importante dizer que as bibliotecas abaixo não são exatamente "baixo nível" já que Java e Kotlin são linguagens de alto nível, mas é uma forma fácil de dizer.
jdk.httpserver e com.sun.net.httpserver
É o mais "baixo nível" que você pode chegar. Esta é a biblioteca base do Java para criar servidores HTTP, utilizando os pacotes com.sun.net.httpserver como base.
Algumas infos:
https://stackoverflow.com/questions/3732109/simple-http-server-in-java-using-only-java-se-api
Netty
Se você quer fazer algo bem "baixo nível" mas ter uma relativa ordem e segurança no desenvolvimento, essa é a biblioteca certa.
O Netty é a principal biblioteca para comunicação de rede no Java. Criar um servidor HTTP nele não é simples, pois o Netty mexe muito com comunicação em rede de baixo nível, deixando algumas coisas complexas.
Se você quer ter o máximo de performance, controle e tem poder de luta e tempo pra mexer com isso, esta é a biblioteca.
O Netty suporta HTTP/1, HTTP/2, HTTP/3, TLS e Websockets.
Repositório Maven
https://mvnrepository.com/artifact/io.netty/netty-all
Jetty (embarcado)
É um dos servidores HTTP e container de servlets mais famosos para o Java. Ele usa o Netty por trás dos panos.
É capaz de rodar servlets, assim como o Tomcat, em contraste com o Netty mas isso não faz muita diferença para micro serviços.
Criando um servidor HTTP com Jetty embarcado:
https://www.baeldung.com/jetty-embedded
Tomcat (embarcado)
É provavelmente o servidor HTTP e container de servlets de Java mais famoso. É muito comum utilizá-lo em sua forma standalone, mas é relativamente trabalhoso configurá-lo.
O Spring e Spring Boot o utilizam como servidor HTTP padrão.
Para projetos pequenos é interessante embarcá-lo juntamente dentro do arquivo .jar.
Criando um servidor HTTP com Tomcat embarcado:
https://mail.codejava.net/servers/tomcat/how-to-embed-tomcat-server-into-java-web-applications
Undertow
É o servidor HTTP usado no WildFly/JBoss. Alguns benchmarks antigos apontavam que sua performance era superior ao Jetty e ao Tomcat, entretanto as melhorias recentes do Netty ultrapassaram a do Undertow, forçando o time deste usar aquele como base.
Em seus primórdios usava o XNIO (uma biblioteca do time do JBoss para lidar com redes) como sevidor HTTP e isso o fazia mais rápido que as outras bibliotecas baseadas no Netty. Atualmente parece que o jogo virou e com o avanço do Netty, o time do Undertow deixou o XNIO de lado e está portando todo seu código para o Netty.
Referências
Jetty Server no Maven
https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-server
Javalin (Web Server leve baseado no Jetty) no Maven
https://mvnrepository.com/artifact/io.javalin/javalin
Criando um servidor HTTP com o Netty (parece bem complicado)
http://www.seepingmatter.com/2016/03/30/a-simple-standalone-http-server-with-netty.html
JDKs com VMs alternativas
https://adoptopenjdk.net/