Spring Boot 是一个由 Pivotal 团队开发的开源 Java 框架,旨在简化 Spring 应用程序的开发和部署。它在 Spring 框架的基础上进行构建,但通过约定优于配置的理念,大大减少了 Spring 应用程序所需的繁琐配置,让开发者能够更快地构建生产级别的独立应用程序。
Spring Boot 的主要特点和优势
-
简化配置 (Auto-Configuration):
- Spring Boot 会根据项目中添加的依赖(JAR 包)自动配置 Spring 应用程序。例如,如果你添加了 Web 依赖,它会自动配置 Tomcat 或 Jetty 等嵌入式 Web 服务器;如果你添加了数据库依赖,它会自动配置数据源等。
- 这种
约定优于配置的方式大大减少了手动配置 XML 或 Java 配置类的工作量,让开发者可以专注于业务逻辑的实现。
-
创建独立应用程序 (Standalone Applications)
- Spring Boot 允许你创建可以直接运行的 JAR 包(可执行 JAR),而无需将其部署到外部的 Web 服务器(如 Tomcat、Jetty 等)。
- 它内置了主流的 Web 服务器(Tomcat、Jetty 或 Undertow),这意味着你只需一个
java -jar 命令即可启动应用程序。
-
启动器(Starters)依赖
- Spring Boot 提供了一系列
starter依赖,它们是预先定义好的 Maven 或 Gradle 依赖集合,包含了特定功能(如 Web、JPA、Security 等)所需的所有常用依赖。
- 通过引入这些 starter,可以大大简化项目构建配置,避免了手动添加大量单个依赖的麻烦。
-
提供生产级功能
- Spring Boot 集成了许多生产环境中常用的非功能性特性,例如:
监控和度量 (Actuator): 提供方便的 RESTful 端点来监控应用程序的健康状况、指标、环境信息等。
外部化配置: 允许通过配置文件(如 application.properties 或 application.yml)、命令行参数、环境变量等方式灵活地配置应用程序。
日志: 集成了常用的日志框架,并提供了统一的日志配置。
-
无代码生成,无需 XML 配置
- Spring Boot 强调
零配置,在大多数情况下,你不需要编写大量的 XML 配置文件,甚至不需要进行代码生成。
-
易于测试
- Spring Boot 提供了方便的测试支持,可以轻松地对应用程序进行单元测试、集成测试。
-
适用于微服务
- 由于其轻量级、快速启动和简化的配置,Spring Boot 成为构建微服务架构的理想选择。它与 Spring Cloud 等微服务相关项目能够很好地集成。
Spring Boot 与 Spring Framework 的关系
Spring Boot 是在 Spring Framework 之上构建的。Spring Framework 是一个功能强大且全面的 Java 应用程序框架,但它的配置相对复杂。Spring Boot 的目标是简化 Spring 应用程序的开发体验,它并没有取代 Spring Framework,而是对其进行了扩展和增强,让 Spring 的使用变得更加容易和高效。
入门
starter 介绍
starter 是 Spring Boot 提供的一类 开箱即用 的依赖包,通常命名为 spring-boot-starter-xxx(例如 spring-boot-starter-web)。
它的本质是一个 聚合依赖,内部包含了:
- 功能所需的依赖库(如
Tomcat、Jackson 等)
- 自动配置类(Auto-Configuration),根据类路径上的依赖自动完成配置
- 默认属性(如
application.properties 中的默认值)
starter 是 Spring Boot 的核心特性之一,通过 约定优于配置 的理念,大幅简化了项目搭建和依赖管理。开发者只需关注业务逻辑,无需纠结底层依赖和配置细节。
starter 的作用
-
简化依赖管理
不需要手动添加多个依赖库,只需引入一个 starter 即可自动引入所有相关依赖。
例如:
<!-- 引入 Web 功能的 starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
它会自动引入 Tomcat、Spring MVC、Jackson 等依赖。
-
自动配置
根据类路径上的依赖,Spring Boot 会自动配置 Bean(例如数据库连接池、Web 服务器等),无需手动编写配置类。
-
标准化依赖版本
starter 内部已经定义了兼容的依赖版本,避免版本冲突问题。
命名规范
Spring Boot 官方的 starter 通常遵循以下命名规则:
- 核心功能:
spring-boot-starter-xxx
(如 spring-boot-starter-data-jpa)
- 第三方库集成:
xxx-spring-boot-starter
(如 mybatis-spring-boot-starter)
F&Q
io.lettuce.core.RedisCommandTimeoutException
org.springframework.dao.QueryTimeoutException: Redis command timed out; nested exception is io.lettuce.core.RedisCommandTimeoutException: Command timed out after 10 second(s)
Springboot 默认使用的是 lettuce 驱动连接,目前暂时的解决办法是把它换成以前用的比较多的 jedis 驱动连接
org.springframework.core.task.TaskRejectedException: Executor [java.util.concurrent.ThreadPoolExecutor
产生原因:线程池饱和(ThreadPool Saturation)
优化建议方案
针对 8 CPU / 16G 内存的配置,按优先级给出以下建议:
- 修改拒绝策略(最重要的急救措施)
若使用 AbortPolicy 策略是(直接抛异常),会导致消息丢失。
建议修改为 CallerRunsPolicy(由调用者所在线程执行)。
- 原理:当线程池满了,不再抛出异常,而是让提交任务的线程(这里是 MQTT 的
CommsCallback 线程)自己去执行这个任务。
- 效果:这会产生**反压(Backpressure)**效果。因为 MQTT 接收线程被迫去处理业务逻辑,它接收新消息的速度就会变慢,从而缓解线程池压力。
- 调整线程池参数(核心配置)
当前的 32 个线程对于 8 核 CPU 来说,如果是 IO 密集型任务(如读写数据库、调用外部接口),可能偏小。
- 核心线程数 (Core Pool Size):建议设置为 16 (CPU 核数 * 2)。
- 最大线程数 (Max Pool Size):
- 如果是 CPU 密集型(纯计算):设置为 9 (CPU + 1)。
- 如果是 IO 密集型(大多数业务场景):建议设置为 64 ~ 128。32 有点保守,内存 16G 足够支撑更多的线程栈空间。
- 队列容量 (Queue Capacity):
- 当前积压了 4999,说明存在瞬间流量突发。建议适当调大到 10000 ~ 20000。
- 注意:不要无限大,否则积压过多会导致 OOM(内存溢出)。
总结
Spring Boot 使得 Java 应用程序的开发变得更加快速和简单,特别是对于构建 Web 应用程序和微服务而言。它通过智能的默认配置和约定优于配置的理念,显著缩短了开发时间,提高了开发效率,让开发者能够将更多精力投入到业务逻辑的实现上。