Spring boot 介绍

发布时间: 更新时间: 总字数:2204 阅读时间:5m 作者: IP上海 分享 网址

Spring Boot 是一个由 Pivotal 团队开发的开源 Java 框架,旨在简化 Spring 应用程序的开发和部署。它在 Spring 框架的基础上进行构建,但通过约定优于配置的理念,大大减少了 Spring 应用程序所需的繁琐配置,让开发者能够更快地构建生产级别的独立应用程序。

Spring Boot 的主要特点和优势

  1. 简化配置 (Auto-Configuration):

    • Spring Boot 会根据项目中添加的依赖(JAR 包)自动配置 Spring 应用程序。例如,如果你添加了 Web 依赖,它会自动配置 Tomcat 或 Jetty 等嵌入式 Web 服务器;如果你添加了数据库依赖,它会自动配置数据源等。
    • 这种约定优于配置的方式大大减少了手动配置 XML 或 Java 配置类的工作量,让开发者可以专注于业务逻辑的实现。
  2. 创建独立应用程序 (Standalone Applications)

    • Spring Boot 允许你创建可以直接运行的 JAR 包(可执行 JAR),而无需将其部署到外部的 Web 服务器(如 Tomcat、Jetty 等)。
    • 它内置了主流的 Web 服务器(Tomcat、Jetty 或 Undertow),这意味着你只需一个 java -jar 命令即可启动应用程序。
  3. 启动器(Starters)依赖

    • Spring Boot 提供了一系列starter依赖,它们是预先定义好的 Maven 或 Gradle 依赖集合,包含了特定功能(如 Web、JPA、Security 等)所需的所有常用依赖。
    • 通过引入这些 starter,可以大大简化项目构建配置,避免了手动添加大量单个依赖的麻烦。
  4. 提供生产级功能

    • Spring Boot 集成了许多生产环境中常用的非功能性特性,例如:
      • 监控和度量 (Actuator): 提供方便的 RESTful 端点来监控应用程序的健康状况、指标、环境信息等。
      • 外部化配置: 允许通过配置文件(如 application.propertiesapplication.yml)、命令行参数、环境变量等方式灵活地配置应用程序。
      • 日志: 集成了常用的日志框架,并提供了统一的日志配置。
  5. 无代码生成,无需 XML 配置

    • Spring Boot 强调零配置,在大多数情况下,你不需要编写大量的 XML 配置文件,甚至不需要进行代码生成。
  6. 易于测试

    • Spring Boot 提供了方便的测试支持,可以轻松地对应用程序进行单元测试、集成测试。
  7. 适用于微服务

    • 由于其轻量级、快速启动和简化的配置,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)。 它的本质是一个 聚合依赖,内部包含了:

  • 功能所需的依赖库(如 TomcatJackson 等)
  • 自动配置类(Auto-Configuration),根据类路径上的依赖自动完成配置
  • 默认属性(如 application.properties 中的默认值)

starter 是 Spring Boot 的核心特性之一,通过 约定优于配置 的理念,大幅简化了项目搭建和依赖管理。开发者只需关注业务逻辑,无需纠结底层依赖和配置细节。

starter 的作用

  • 简化依赖管理 不需要手动添加多个依赖库,只需引入一个 starter 即可自动引入所有相关依赖。 例如:

    <!-- 引入 Web 功能的 starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    

    它会自动引入 TomcatSpring MVCJackson 等依赖。

  • 自动配置 根据类路径上的依赖,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 内存的配置,按优先级给出以下建议:

  1. 修改拒绝策略(最重要的急救措施)

若使用 AbortPolicy 策略是(直接抛异常),会导致消息丢失。 建议修改为 CallerRunsPolicy(由调用者所在线程执行)。

  • 原理:当线程池满了,不再抛出异常,而是让提交任务的线程(这里是 MQTT 的 CommsCallback 线程)自己去执行这个任务。
  • 效果:这会产生**反压(Backpressure)**效果。因为 MQTT 接收线程被迫去处理业务逻辑,它接收新消息的速度就会变慢,从而缓解线程池压力。
  1. 调整线程池参数(核心配置)

当前的 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 应用程序和微服务而言。它通过智能的默认配置和约定优于配置的理念,显著缩短了开发时间,提高了开发效率,让开发者能够将更多精力投入到业务逻辑的实现上。

本文总阅读量 次 本站总访问量 次 本站总访客数
Home Archives Categories Tags Statistics