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/

You should also read: