🚀 1、Java 生态中的 Web 服务器(Servlet 容器)
名称 |
简介 |
特点 |
Tomcat |
Apache 开发的 Servlet 容器,最广泛使用 |
稳定、成熟、社区大 |
Jetty |
Eclipse 维护的轻量级容器,适合嵌入式使用 |
启动快、可扩展性好 |
Undertow |
JBoss(Red Hat)开发,WildFly 默认使用 |
异步非阻塞、超轻量、支持 HTTP/2 |
Resin |
商业产品,性能好但闭源(部分开源) |
快速、高性能 |
GlassFish |
Oracle 推出的全功能 Java EE 服务器 |
支持完整 Java EE 规范,重量级 |
WildFly |
JBoss 新一代 Java EE 服务器 |
支持微服务、集成 Undertow |
WebLogic |
Oracle 商业产品,用于大型企业 Java EE 部署 |
重型、功能强、企业级支持 |
WebSphere |
IBM 推出的 Java EE 服务器 |
重型、功能强、用于大型企业系统 |
🌐 2、其他主流 Web 服务器(跨语言)
名称 |
开发语言 |
简介 |
应用场景与特点 |
Nginx |
C |
高性能反向代理服务器,支持静态资源和负载均衡 |
Web 网关、静态资源服务、代理后端 Java 等 |
Apache HTTP |
C |
最老牌 Web 服务器之一,功能全面 |
支持模块多,但性能不如 Nginx |
Caddy |
Go |
自动 HTTPS、配置简洁的新一代 Web 服务器 |
适合中小型项目 |
Lighttpd |
C |
轻量 Web 服务,适合低内存场景 |
嵌入式设备或轻量部署 |
💡 3、总结:Java 项目常用选择
场景需求 |
推荐服务器 |
说明 |
Spring Boot 默认 |
Tomcat |
支持好,稳定,开箱即用 |
高并发、高性能 |
Undertow |
非阻塞 IO、轻量 |
嵌入式、微服务部署 |
Jetty/Undertow |
启动快,占内存少 |
Java EE 全规范 |
GlassFish/WildFly |
支持 Java EE 全栈 |
商业项目、企业采购 |
WebLogic/WebSphere |
企业支持强,功能全面 |
⚡ 4、常见用途搭配
前端服务 |
后端服务 |
搭配示例 |
Nginx |
Spring Boot + Tomcat |
Nginx 代理静态资源和 API 请求给后端 |
Nginx |
Spring Boot + Undertow |
支持高并发接口服务,响应快 |
Apache HTTP |
WebLogic |
用于传统 Java EE 项目部署 |
📌 5、三个最常用的服务器(Tomcat和 Jetty 和 Undertow)
5.1 ✅ 基本介绍
项目 |
Tomcat |
Jetty |
Undertow |
开发组织 |
Apache |
Eclipse |
Red Hat / JBoss |
采用方式 |
Spring Boot 默认内嵌容器 |
手动引入依赖或替换默认容器 |
手动引入依赖或替换默认容器 |
IO 模型 |
支持 NIO(阻塞为主) |
支持异步 NIO(部分支持非阻塞) |
完全异步、非阻塞 |
是否支持 HTTP/2 |
需扩展支持 |
支持 |
原生支持 |
5.2 ⚙️性能与资源占用
指标/对比点 |
Tomcat |
Jetty |
Undertow |
启动速度 |
中 |
快 |
非常快 |
内存占用 |
中 |
较低 |
最低 |
并发处理能力 |
中等 |
中等偏上 |
高并发处理优异 |
CPU 占用 |
稳定 |
低 |
利用率高但高效 |
请求吞吐量 |
普通 |
中等 |
高 |
5.3 📦功能特性对比
功能特性 |
Tomcat |
Jetty |
Undertow |
Servlet 支持 |
✅ 完整 |
✅ 完整 |
✅ 完整 |
JSP 支持 |
✅ 支持 |
⚠️ 需额外依赖 |
❌ 不支持 |
WebSocket 支持 |
✅ |
✅ |
✅ |
HTTP/2 支持 |
⚠️ 手动配置 |
✅ 支持 |
✅ 原生支持 |
支持异步请求 |
部分支持 |
支持 |
✅ 原生支持 |
嵌入式部署支持 |
✅ |
✅ |
✅ |
5.4 📁 Spring Boot 配置对比
容器 |
Maven 依赖 |
Tomcat |
默认(无需额外配置) |
Jetty |
排除 Tomcat,引入 spring-boot-starter-jetty |
Undertow |
排除 Tomcat,引入 spring-boot-starter-undertow |
5.5 🧠 适用场景建议
应用场景 |
推荐服务器 |
理由 |
普通企业 Web 项目 |
Tomcat |
稳定、支持 JSP、社区广泛 |
嵌入式系统、启动快、轻量服务 |
Jetty |
启动快,内存占用少,易于嵌入 |
高并发微服务系统、网关服务 |
Undertow |
非阻塞 IO,吞吐量高,性能优 |
使用 JSP 页面渲染 |
Tomcat |
唯一默认支持 JSP 的容器 |
要求支持 HTTP/2、高性能接口 |
Undertow |
原生支持 HTTP/2 与异步 |
🔚 6、一句话总结:微服务前后端分离、不用JSP,用undertow就对了!
6.1 Springboot项目maven引入undertow
<dependencies>
<!-- SpringBoot Web容器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 移除springboot默认的tomcat服务器 -->
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-tomcat</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- web 容器使用 undertow -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
</dependencies>
6.2 yml文件配置
undertow:
# HTTP post内容的最大大小。当值为-1时,默认值为大小是无限的
max-http-post-size: -1
# 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
# 每块buffer的空间大小,越小的空间被利用越充分
buffer-size: 512
# 是否分配的直接内存
direct-buffers: true
threads:
# 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
io: 8
# 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
worker: 256