Em aplicações web baseadas em Spring Boot, o pacote spring-boot inclui um servidor web embutido, incluindo tomcat, jetty, undertow e netty.
Introdução aos contêineres web comuns
Gato
Atualmente, Tomcat está incluído no projeto Apache, e o link oficial éO login do hiperlink está visível. Tomcat é um servidor web Java mainstream, então é muito estável e maduro, e a comunidade é ativa e rica em documentação e recursos. Tomcat suporta protocolos Http, Http/2, AJP, WebSocket e suporta Servlet 6.0
Quebra-mar
Jetty é um servidor fornecido pela Eclipse, o link oficial éO login do hiperlink está visível. É mais leve que o Tomcat e possui suporte assíncrono próprio. Jetty suporta protocolos Http, Http/2, Http/3, AJP, WebSocket e suporta Servlet 6.0
Netty
Netty é uma estrutura de rede assíncrona orientada pelo tempo amplamente utilizada em aplicações web de alto desempenho, especialmente aplicações do lado do servidor que lidam com um grande número de conexões concorrentes, o link oficial éO login do hiperlink está visível. O Netty suporta quase todos os protocolos, incluindo SSL/TLS, HTTP, HTTP/2, HTTP/3, WebSockets, DNS, SPDY, SMTP, etc
Ressaca
Undertow é um servidor fornecido pela JBoos, cujo endereço oficial éO login do hiperlink está visível. O Undertow é caracterizado por sua leveza, alto desempenho e consumo local de recursos, além de suportar aplicações embarcadas e microsserviços. Undertow suporta protocolos Http, Http/2, WebSocket e suporta Servlet 4.0
Apache Tomcat
Apache Tomcat é um servidor web amplamente utilizado e um contêiner de servlets. É a escolha padrão para aplicações tradicionais Spring Boot devido à sua robustez, facilidade de uso e compatibilidade com a API Servlet.
Principais características:
Baseado em Servlets: Tomcat é construído em torno da API Servlet, o que o torna ideal para aplicações tradicionais do Spring MVC. E/S bloqueante: Tomcat opera em um modelo de uma thread por requisição, o que significa que cada requisição recebida é tratada por uma thread separada. Configuração Fácil: Tomcat pode ser facilmente configurado e configurado com o Spring Boot, tornando-o ideal para uma ampla variedade de aplicações web.
Arquitetura interna
Conectores: gerencie conexões de rede, aceite e processe solicitações HTTP. Contêiner: Responsável pelo gerenciamento do ciclo de vida dos servlets, incluindo carregamento, inicialização e invocação. Modelo de Thread: O Tomcat usa pools de threads, onde cada requisição é tratada por uma thread separada dentro do pool. Esse modelo é simples, mas pode causar problemas de escalabilidade sob alta carga devido à contenda de threads e sobrecarga de memória.
Exemplo de cenário: Lidar com requisições paralelas
Vamos considerar um cenário em que cinco requisições paralelas chegam ao servidor Tomcat:
Uma thread por requisição: Tomcat atribui uma thread separada a cada uma das cinco solicitações de seu pool de threads. E/S de bloqueio: Cada thread processa suas requisições de forma síncrona, bloqueando se houver operações de E/S necessárias, como chamadas de banco de dados.
Gerenciamento de recursos: Se o pool de threads tiver threads livres suficientes, todas as cinco solicitações são processadas simultaneamente. Se não, outras solicitações ficarão na fila até que um thread esteja disponível.
Mérito:
Simples e fácil de entender. Ideal para aplicações web tradicionais. Maduro, estável e com amplo apoio da comunidade.
Deficiência:
Escalabilidade limitada sob alta carga devido à sobrecarga da thread. Maior consumo de memória por requisição.
Netty
Netty é uma framework de aplicações web de alto desempenho, assíncrona e orientada a eventos. É o framework padrão do Spring WebFlux, que é projetado para programação responsiva.
Principais características:
Orientado a Eventos: O Netty utiliza uma arquitetura orientada a eventos, tornando-o adequado para lidar com um alto volume de conexões simultâneas de forma eficiente. E/S não bloqueante: O Netty utiliza E/S não bloqueante, permitindo lidar com muitas conexões com menos threads. Escalabilidade: Projetado para aplicações de alta concorrência, baixa latência e alta taxa de transferência.
Arquitetura interna
Loop de Eventos: O componente central do Netty é o loop de eventos, que gerencia as operações de E/S de forma assíncrona. Um grupo de loops de eventos contém um ou mais loops de eventos. Canal: Representa uma conexão, como uma requisição HTTP recebida, e está associado a um loop de eventos. Modelo de Thread: O Netty usa um pequeno número de threads para lidar com um grande número de conexões. Cada loop de evento roda em uma única thread e lida com múltiplos canais, tornando-o altamente escalável.
Exemplo de cenário: Lidar com requisições paralelas
Considere um cenário em que cinco requisições paralelas chegam ao servidor Netty:
Modelo Orientado a Eventos: O Netty distribui cinco solicitações em seu ciclo de eventos. E/S não bloqueante: A operação não bloqueia o thread do loop de eventos. Em vez disso, as operações de E/S são tratadas de forma assíncrona, permitindo que a mesma thread gerencie múltiplas conexões de forma eficiente.
Escalabilidade: Devido à sua natureza não bloqueante, o Netty pode lidar com um grande número de conexões com um número relativamente pequeno de threads.
Mérito:
Altamente eficiente para tarefas intensivas em I/O. Escalabilidade e desempenho superiores em alta concorrência. Ideal para programação reativa e aplicações web modernas.
Deficiência:
É mais complexo de entender e configurar. Comparado às aplicações tradicionais baseadas em servlets, é necessário um modelo de programação diferente (reativo).
conclusão
Netty e Tomcat atendem áreas diferentes no campo de frameworks de servidores. Netty é uma framework subjacente altamente flexível, projetada para protocolos de rede personalizados e cenários de alto desempenho; O Tomcat é uma escolha comprovada para aplicações web Java que cumprem os padrões Java EE e Jakarta EE. A escolha entre os dois depende das necessidades específicas do projeto, seja construindo um servidor web com protocolos personalizados ou uma aplicação web tradicional.
Referência:
O login do hiperlink está visível.
O login do hiperlink está visível.
O login do hiperlink está visível.
O login do hiperlink está visível.
O login do hiperlink está visível. |