🚀 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: truethreads:# 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程io: 8# 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载worker: 256