Spring Boot 支持的内嵌服务器(Tomcat、Jetty、Undertow、Netty(用于 WebFlux 响应式应用))详解
Spring Boot 支持的内嵌服务器详解

1. 支持的内嵌服务器
Spring Boot 默认支持以下内嵌服务器:
- Tomcat(默认)
- Jetty
- Undertow
- Netty(用于 WebFlux 响应式应用)
2. 各服务器使用示例
(1) Tomcat(默认)
特点:最广泛使用,适合传统 Spring MVC 应用。
代码示例
<!-- pom.xml(无需额外依赖,Tomcat默认已包含) -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
// 启动类(无需修改)
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
(2) Jetty
特点:轻量级,支持 WebSocket 和嵌入式 JDBC。
代码示例
<!-- pom.xml(排除Tomcat并添加Jetty依赖) -->
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId></dependency>
</dependencies>
// 启动类保持不变
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
(3) Undertow
特点:高性能,非阻塞 I/O,适合高并发场景。
代码示例
<!-- pom.xml(排除Tomcat并添加Undertow依赖) -->
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId></dependency>
</dependencies>
// 启动类保持不变
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
(4) Netty(WebFlux 响应式应用)
特点:基于事件驱动,适合异步非阻塞场景(如微服务、高吞吐量 API)。
代码示例
<!-- pom.xml(需切换到WebFlux并添加Netty依赖) -->
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency><groupId>io.projectreactor.netty</groupId><artifactId>reactor-netty-http</artifactId></dependency>
</dependencies>
// 启动类需标注 @SpringBootApplication 并包含 @EnableWebFlux(可选)
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
3. 配置内嵌服务器的通用方式
所有服务器可通过 application.properties 统一配置:
server.port=8080
server.servlet.context-path=/api
server.tomcat.max-threads=200 # Tomcat 特定配置
server.undertow.io-threads=80 # Undertow 特定配置
4. 对比表格:优缺点分析
| 服务器 | 适用场景 | 性能特点 | 资源占用 | 线程模型 | WebSocket 支持 | 文档与生态 |
|---|---|---|---|---|---|---|
| Tomcat | 传统 Spring MVC 应用 | 平衡,成熟稳定 | 中等 | 阻塞 I/O | 支持 | 最广泛支持 |
| Jetty | 需要 WebSocket 或轻量级部署 | 中等性能,轻量 | 较低 | 支持非阻塞 | 原生支持 | 较成熟但社区活跃度较低 |
| Undertow | 高并发、低延迟、高吞吐场景 | 高性能,非阻塞 I/O | 低 | 非阻塞(线程复用) | 支持 | 适合现代高性能应用 |
| Netty | 响应式 WebFlux 应用 | 极高性能,异步非阻塞 | 极低 | 事件驱动 | 支持(需配置) | 需熟悉响应式编程 |
5. 详细优缺点对比
(1) Tomcat
- 优点:
- 默认配置,开箱即用。
- 社区支持广泛,文档丰富。
- 与传统 Spring MVC 完全兼容。
- 缺点:
- 高并发下线程数较多,资源占用较高。
- 非阻塞 I/O 支持有限。
(2) Jetty
- 优点:
- 轻量级,启动速度快。
- 原生支持 WebSocket 和嵌入式 JDBC。
- 适合需要轻量级容器的场景。
- 缺点:
- 性能略低于 Undertow。
- 配置选项相对复杂。
(3) Undertow
- 优点:
- 非阻塞 I/O,适合高并发场景。
- 资源占用低,内存效率高。
- 支持 HTTP/2 和 WebSocket。
- 缺点:
- 部分传统 Spring 特性(如 JSP)支持有限。
- 配置需熟悉其线程池参数。
(4) Netty
- 优点:
- 事件驱动模型,适合高吞吐量、低延迟场景。
- 原生支持响应式编程(WebFlux)。
- 轻量且高性能。
- 缺点:
- 需要应用采用响应式编程模型(WebFlux)。
- 配置和调试复杂度较高。
6. 选择建议
| 需求 | 推荐服务器 | 理由 |
|---|---|---|
| 传统 Spring MVC 应用 | Tomcat | 成熟稳定,无需额外配置。 |
| WebSocket 或轻量级部署 | Jetty | 原生支持 WebSocket,启动速度快。 |
| 高并发、低延迟 API | Undertow | 非阻塞 I/O,资源效率高。 |
| 响应式 WebFlux 应用 | Netty | 与 Reactor 生态无缝集成,性能最优。 |
7. 示例代码补充
(1) 配置 Undertow 线程池
# application.properties
server.undertow.io-threads=80 # I/O 线程数
server.undertow.worker-threads=64 # 工作线程数
(2) 配置 Jetty WebSocket
// 配置 WebSocket 端点
@Configuration
public class WebSocketConfig {@Beanpublic ConfigurableServletWebServerFactory webServerFactory() {JettyServletWebServerFactory factory = new JettyServletWebServerFactory();factory.addServerCustomizers(server -> {server.setStopAtShutdown(true);// 配置 WebSocket 插件server.setConnectors(new Connector[]{new ServerConnector(server)});server.setHandler(new WebSocketHandler());});return factory;}
}
(3) Netty 响应式应用示例
// 响应式控制器
@RestController
public class UserController {@GetMapping("/users/{id}")public Mono<User> getUser(@PathVariable String id) {return userService.findById(id); // 返回 Mono 对象}
}
8. 注意事项
- 切换服务器需排除默认依赖:如从 Tomcat 切换到 Jetty,需在
pom.xml中排除spring-boot-starter-tomcat。 - WebFlux 仅支持 Netty 或 Undertow:若使用响应式编程,需选择非阻塞服务器。
- WebSocket 支持:Tomcat、Jetty、Undertow 原生支持,Netty 需通过 WebFlux 配置。
9. 总结
Spring Boot 提供了多种内嵌服务器以适应不同场景:
- Tomcat:传统应用首选。
- Jetty:轻量级与 WebSocket 场景。
- Undertow:高并发与低延迟需求。
- Netty:响应式架构(WebFlux)必备。
根据应用需求选择合适的服务器,可显著提升性能和资源利用率。
相关文章:
Spring Boot 支持的内嵌服务器(Tomcat、Jetty、Undertow、Netty(用于 WebFlux 响应式应用))详解
Spring Boot 支持的内嵌服务器详解 1. 支持的内嵌服务器 Spring Boot 默认支持以下内嵌服务器: Tomcat(默认)JettyUndertowNetty(用于 WebFlux 响应式应用) 2. 各服务器使用示例 (1) Tomcat(默认…...
微软Exchange管理中心全球范围宕机
微软已确认Exchange管理中心(Exchange Admin Center,EAC)发生全球性服务中断,导致管理员无法访问关键管理工具。该故障被标记为关键服务事件(编号EX1051697),对依赖Exchange Online的企业造成广…...
基于AI的Web应用防火墙(AppWall)实战:漏洞拦截与威胁情报集成
摘要:针对Web应用面临的OWASP、CVE等漏洞攻击,本文结合群联AI云防护系统的AppWall模块,详解AI规则双引擎的防御原理,并提供漏洞拦截配置与威胁情报集成代码示例。 一、Web应用安全挑战与AppWall优势 传统WAF依赖规则库更新滞后&a…...
基于Qt的串口通信工具
程序介绍 该程序是一个基于Qt的串口通信工具,专用于ESP8266 WiFi模块的AT指令配置与调试。主要功能包括: 1. 核心功能 串口通信:支持串口开关、参数配置(波特率、数据位、停止位、校验位)及数据收发。 AT指令操作&a…...
CSS 字体学习笔记
在网页设计中,字体的使用对于提升用户体验和页面美观性至关重要。CSS 提供了一系列字体属性,用于控制文本的显示效果。以下是对 CSS 字体属性的详细学习笔记。 一、字体系列(font-family) 1. 字体系列的分类 在 CSS 中…...
《MySQL是怎样运行的》总结笔记
内容太多,主要总结一些自己认为重要的,另外太基础常见可能不会总结上。 字符集和比较规则 MySQL会通过把字符串编码后再进行比较大小并排序,有一些很早的字符集可能会不支持中文,比如ASCII、ISO 8859-1,现在最常用的…...
力扣每日打卡 1922. 统计好数字的数目 (中等)
力扣 1922. 统计好数字的数目 中等 前言一、题目内容二、解题方法1. 暴力解法(会超时,此法不通)2. 快速幂运算3. 组合计数的思维逻辑分析组合计数的推导例子分析思维小结论 4.官方题解4.1 方法一:快速幂 三、快速幂运算快速幂运算…...
上层 Makefile 控制下层 Makefile 的方法
在复杂的项目中,通常会将项目划分为多个模块或子项目,每个模块都有自己的 Makefile。上层 Makefile 的作用是协调和控制这些下层 Makefile 的构建过程。下面是几种常见的示例,实现上层 Makefile 对下层 Makefile 的控制。 直接调用࿱…...
html简易实现推箱子小游戏原理(易上手)
实现效果 使用方向键移动,将橙色箱子推到绿色目标区域(黑色块为墙,白色块为可通过区域,蓝球为小人) 实现过程 <!DOCTYPE html> <html> <head><title>推箱子小游戏</title><style&g…...
搭建一个Spring Boot聚合项目
1. 创建父项目 打开IntelliJ IDEA,选择 New Project。 在创建向导中选择 Maven,确保选中 Create from archetype,选择 org.apache.maven.archetypes:maven-archetype-quickstart。 填写项目信息: GroupId:com.exampl…...
字符串与栈和队列-算法小结
字符串 双指针 反转字符串(双指针) 力扣题目链接 void reverseString(vector<char>& s) {for (int i 0, j s.size() - 1; i < s.size()/2; i, j--) {swap(s[i],s[j]);} }反转字符串II 力扣题目链接 遍历字符串的过程中,只要让 i (2 * k)&#…...
类似东郊到家的上门按摩预约服务系统小程序APP源码全开源
🔥 为什么上门按摩正在席卷全国? 万亿蓝海市场爆发 2024年中国按摩市场规模突破8000亿,上门服务增速达65% 90后成消费主力,**72%**白领每月至少使用1次上门按摩(数据来源:艾媒咨询) 传统痛点…...
Python | 在Pandas中按照中值对箱形图排序
箱形图是可视化数据分布的强大工具,因为它们提供了对数据集内的散布、四分位数和离群值的洞察。然而,当处理多个组或类别时,通过特定的测量(如中位数)对箱形图进行排序可以提高清晰度并有助于揭示模式。在本文中&#…...
[实战] 二分查找与哈希表查找:原理、对比与C语言实现(附完整C代码)
二分查找与哈希表查找:原理、对比与C语言实现 一、引言 在计算机科学中,高效的数据查找是核心问题之一。本文深入解析两种经典查找算法:二分查找与哈希表查找,从算法原理、时间复杂度、适用场景到完整C语言实现,提供…...
游戏引擎学习第215天
总结并为今天做铺垫 今天的工作内容是解决调试系统中的一个小问题。昨天我们已经完成了大部分的调试系统工作,但还有一个小部分没有完全处理,那就是关于如何层次化组织数据的问题。我们遇到的一个问题是,演示代码中仍有一个尚未解决的部分&a…...
【Redis】redis事物与管道
Redis 事务(Transaction) 事务概念 事务:是一组操作的集合,是不可分割的工作单元。Redis 事务特点: 一个事务可以一次执行多个命令。所有命令都被顺序化,形成一个队列。所有命令在执行 EXEC 时一次性、顺…...
Django信号使用完全指南示例
推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 **引言:****先决条件:****目录:****1. 什么是Django信号?****2:设置你的Django项目****2.1. 安装Django**2.2. 创建一个Django项…...
DeepSeek BLEU和ROUGE(Recall)的计算
以下是 BLEU Score (Bilingual Evaluation Understudy)和 ROUGE Score(Recall-Oriented Understudy for Gisting Evaluation) 的原生Python实现(不依赖第三方库),通过分步计算逻辑和示例详细说明。 一、BLEU Score 实现 核心逻辑…...
vulkanscenegraph显示倾斜模型(5.9)-vsg中vulkan资源的编译
前言 上一章深入剖析了GPU资源内存及其管理,vsg中为了提高设备内存的利用率,同时减少内存(GPU)碎片,采用GPU资源内存池机制(vsg::MemoryBufferPools)管理逻辑缓存(VkBuffer)与物理内存(VkDeviceMemory)。本章将深入vsg中vulkan资源的编译(包含…...
今日行情明日机会——20250409
今日行情还需要考虑关税对抗~ 2025年4月8日涨停的主要行业方向分析 1. 军工(19家涨停) 细分领域:国防装备、航空航天、军民融合。催化因素:国家安全战略升级、国防预算增加、重大军工项目落地预期。 2. 免税(15家涨…...
XHR、FetchAxios详解网络相关大片文件上传下载
以下是 XHR(XMLHttpRequest) 与 Fetch API 的全面对比分析,涵盖语法、功能、兼容性等核心差异: 一、语法与代码风格 XHR(基于事件驱动) 需要手动管理请求状态(如 onreadystatechange 事件)和错误处理,代码冗长且易出现回调地狱。 const xhr = new XMLHttpRequest(); x…...
Python基础总结(四)之元组
文章目录 一、元组格式二、元组操作2.1 转换元组 与 列表一样,元组也是序列,唯一的区别在于元组是不能修改的,与字符串一样。 一、元组格式 元组的创建方式很简单,秩序用逗号将元素隔开就能自动创建一个元组 示例: …...
系统分析师(六)-- 计算机网络
概述 TCP/IP 协议族 DNS DHCP 网络规划与设计 逻辑网络设计 物理网络设计 题目 层次化网络设计 网络冗余设计 综合布线系统 IP地址 网络接入技术 其他网络技术应用 物联网...
【前端】【React】useCallback的作用与使用场景总结
一、useCallback 的作用与使用场景总结 useCallback 是 React 提供的一个 Hook,用于缓存函数的引用,避免因为组件重新渲染而导致函数地址发生变化。它返回一个记忆(memoized)后的回调函数,只有当依赖项发生变化时才会…...
Qwen2.5-VL Technical Report 论文翻译和理解
一、TL;DR Qwen2.5-VL是QwenVL的最新模型,在视觉识别、精准目标定位、稳健文档解析以及长视频理解等方面实现了重大突破引入了动态分辨率处理和绝对时间编码,使其能够处理不同尺寸的图像以及长达数小时的视频,并实现秒级事件定位…...
Foxmail邮件客户端跨站脚本攻击漏洞(CNVD-2025-06036)技术分析
Foxmail邮件客户端跨站脚本攻击漏洞(CNVD-2025-06036)技术分析 漏洞背景 漏洞编号:CNVD-2025-06036 CVE编号:待分配 厂商:腾讯Foxmail 影响版本:Foxmail < 7.2.25 漏洞类型&#x…...
C语言打印的坑
使用下面的代码buf dprt("data: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]); 明明是一个字节一个字节的打,打出来的数据有些却是4个字节 0xffffffff 0xffffffff 0xffffffff 0x7f 0xffffffff 0x7f0…...
高并发内存池(三):PageCache(页缓存)的实现
前言: 在前两期内容中,我们深入探讨了内存管理机制中在 ThreadCache 和 CentralCache两个层级进行内存申请的具体实现。这两层缓存作为高效的内存分配策略,能够快速响应线程的内存需求,减少锁竞争,提升程序性能。 本期…...
pycharm已有python3.7,如何新增Run Configurations中的Python interpreter为python 3.9
在 PyCharm 中,如果你已经安装了 Python 3.9,并且希望在 Run Configurations 中新增一个 Python 3.9 的解释器,可以按照以下步骤操作: 步骤 1:打开 PyCharm 设置 点击 PyCharm 左上角的 File 菜单。选择 Settings&am…...
Linux驱动开发-网络设备驱动
Linux驱动开发-网络设备驱动 一,网络设备总体结构1.1 总体架构1.2 NAPI数据处理机制 二,RMII和MDIO2.1 RMII接口2.2 MDIO接口 三,MAC和PHY模块3.1 MAC模块3.2 PHY模块 四,网络模型4.1 网络的OSI和TCP/IP分层模型4.1.1 传输层&…...
