架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 29|回复: 0

[技巧] Spring Boot 中 Web 容器 netty 和 tomcat 比较

[复制链接]
发表于 昨天 10:49 | 显示全部楼层 |阅读模式
基于 Spring Boot 的 web 应用中,在spring-boot包内包含了内置的 web server,具体包括 tomcat、jetty、undertow 和 netty。

常见 Web 容器介绍

Tomcat

Tomcat目前收录与 Apache 项目中,官方链接是 超链接登录可见。
Tomcat是主流的Java Web Server,所以是十分稳定和成熟的,同时社区活跃文档和资源丰富。
Tomcat可以支持Http, Http/2 , AJP, WebSocket 协议,支持Servlet 6.0

Jetty

Jetty是 Eclipse 提供的一款Server,官方链接是 超链接登录可见。
相比Tomcat它更加轻量级,有自己的异步支持。
Jetty可以支持Http, Http/2 ,Http/3, AJP, WebSocket 协议,支持Servlet 6.0

Netty

Netty是一个基于时间驱动的异步网络框架,被广泛应用于高性能的网络应用程序,尤其是处理大量并发连接的服务端应用,官方链接是 超链接登录可见。
Netty几乎支持了大部分的协议,有SSL/TLS,  HTTP,  HTTP/2, HTTP/3, WebSockets, DNS,  SPDY, SMTP 等

Undertow

Undertow是 JBoos 提供的一款Server,官方地址是 超链接登录可见。
Undertow的特点在于轻量级、高性能和地资源消耗,同时支持嵌入式应用程序和微服务。
Undertow可以支持Http, Http/2 , WebSocket 协议,支持Servlet 4.0

Apache Tomcat

Apache Tomcat 是一个广泛使用的 Web 服务器和 Servlet 容器。由于其稳健性、易用性以及与 Servlet API 的兼容性,它是传统 Spring Boot 应用程序的默认选择。

QQ截图20250812103628.jpg

主要特点

基于 Servlet:Tomcat 是围绕 Servlet API 构建的,这使其非常适合传统的 Spring MVC 应用程序。
阻塞 I/O:Tomcat 采用每个请求一个线程的模型,这意味着每个传入请求都由一个单独的线程处理。
易于配置:Tomcat 可以通过 Spring Boot 轻松设置和配置,使其成为各种 Web 应用程序的理想选择。

内部架构

连接器:管理网络连接,接受和处理HTTP请求。
容器:负责servlet生命周期管理,包括加载、初始化、调用。
线程模型:Tomcat 使用线程池,每个请求由池中单独的线程处理。这种模型很简单,但由于线程争用和内存开销,在高负载下可能会导致可扩展性问题。

示例场景:处理并行请求

让我们考虑这样一个场景:五个并行请求到达 Tomcat 服务器:

每个请求一个线程:Tomcat 从其线程池中为五个请求中的每一个请求分配一个单独的线程。
阻塞 I/O:每个线程同步处理其请求,如果需要任何 I/O 操作(例如数据库调用),则阻塞。

资源管理:如果线程池有足够的空闲线程,则所有五个请求都会被同时处理。如果没有,则其他请求将在队列中等待,直到有可用的线程。

优点:

简单且容易理解。
非常适合传统的网络应用程序。
成熟、稳定,拥有广泛的社区支持。

缺点:

由于线程开销,高负载下的可扩展性有限。
每个请求的内存消耗更高。

Netty

Netty 是一个高性能、异步事件驱动的网络应用框架。它是专为响应式编程设计的 Spring WebFlux 的默认框架。

QQ截图20250812103721.jpg

主要特点

事件驱动:Netty 使用事件驱动架构,使其适合高效处理大量同时连接。
非阻塞 I/O:Netty 利用非阻塞 I/O,使其能够用更少的线程处理许多连接。
可扩展性:专为高并发、低延迟和高吞吐量应用程序而设计。

内部架构

事件循环:Netty 的核心组件是事件循环,它异步管理 I/O 操作。一个事件循环组包含一个或多个事件循环。
Channel:表示一个连接,例如传入的 HTTP 请求,并与事件循环相关联。
线程模型:Netty 使用少量线程来处理大量连接。每个事件循环在单个线程中运行并处理多个通道,使其具有高度的可扩展性。

示例场景:处理并行请求

考虑这样一种情况,五个并行请求到达 Netty 服务器:

事件驱动模型:Netty 在其事件循环中分配五个请求。
非阻塞 I/O:操作不会阻塞事件循环线程。相反,I/O 操作是异步处理的,允许同一线程高效地管理多个连接。

可扩展性:由于其非阻塞特性,Netty 可以用相对较少的线程处理大量连接。

优点:

对于 I/O 密集型任务来说非常高效。
高并发下卓越的可扩展性和性能。
非常适合反应式编程和现代 Web 应用程序。

缺点:

理解和配置起来更加复杂。
与传统的基于 servlet 的应用程序相比,需要不同的编程模型(反应式)。

结论

Netty 和 Tomcat 在服务器框架领域服务于不同的领域。Netty 是一个高度灵活的底层框架,专为自定义网络协议和高性能场景而设计;而 Tomcat 则是服务于符合 Java EE 和 Jakarta EE 标准的 Java Web 应用的成熟之选。两者之间的选择取决于项目的具体需求,无论是构建自定义协议的网络服务器还是传统的 Web 应用。

参考:

超链接登录可见。
超链接登录可见。
超链接登录可见。
超链接登录可见。
超链接登录可见。




上一篇:.NET/C# 进程之间基于 gRPC 和 Unix 域套接字通信
下一篇:使用 Postman 测试(调试) gRPC 服务
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2025-8-13 16:25

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表