Spring Boot 支持的内嵌服务器详解

1. 支持的内嵌服务器
Spring Boot 默认支持以下内嵌服务器:
- Tomcat(默认)
- Jetty
- Undertow
- Netty (用于 WebFlux 响应式应用)
2. 各服务器使用示例
(1) Tomcat(默认)
特点:最广泛使用,适合传统 Spring MVC 应用。
代码示例
xml
<!-- pom.xml(无需额外依赖,Tomcat默认已包含) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
java
// 启动类(无需修改)
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
(2) Jetty
特点:轻量级,支持 WebSocket 和嵌入式 JDBC。
代码示例
xml
<!-- 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>
java
// 启动类保持不变
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
(3) Undertow
特点:高性能,非阻塞 I/O,适合高并发场景。
代码示例
xml
<!-- 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>
java
// 启动类保持不变
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
(4) Netty(WebFlux 响应式应用)
特点:基于事件驱动,适合异步非阻塞场景(如微服务、高吞吐量 API)。
代码示例
xml
<!-- 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>
java
// 启动类需标注 @SpringBootApplication 并包含 @EnableWebFlux(可选)
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
3. 配置内嵌服务器的通用方式
所有服务器可通过 application.properties
统一配置:
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 线程池
properties
# application.properties
server.undertow.io-threads=80 # I/O 线程数
server.undertow.worker-threads=64 # 工作线程数
(2) 配置 Jetty WebSocket
java
// 配置 WebSocket 端点
@Configuration
public class WebSocketConfig {
@Bean
public 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 响应式应用示例
java
// 响应式控制器
@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)必备。
根据应用需求选择合适的服务器,可显著提升性能和资源利用率。