|

基于 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 应用程序的默认选择。
主要特点
基于 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 的默认框架。
主要特点
事件驱动: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 服务
|