《 Spring Boot 3实战案例锦集 》 PDF电子书已更新至130篇!
《 Spring Boot实战案例合集 》目前已更新 231个案例 ,我们将持续不断的更新。 文末有电子书目录。 → 目前就订阅合集
环境:Spring Boot 3.5.0
1. 简介
随着系统规模不断扩大,API 已成为系统性能的核心瓶颈之一。一次看似普通的接口调用,背后可能涉及数据库查询、对象转换、序列化、网络通信以及线程调度等多个环节,任何一个细节都可能导致响应时间增加。在高并发场景下,毫秒级的优化往往能够带来显著的吞吐量提升。
本文结合 Spring Boot 项目中的真实实践,总结了 9 个提升 API 响应速度的高价值优化技巧,协助你减少不必要的性能损耗,打造响应更快、吞吐更高、稳定性更强的高性能接口。
2.实战案例
2.1 异步处理
异步处理可以有效提升API的响应速度。当一个API需要执行耗时较长的任务时,我们可以将这部分内容异步处理,从而避免阻塞主线程。
@ServicepublicclassAsyncService {@AsyncpublicvoidlongRunningTask {// 假设这里有一个长期运行的任务System.out.println("Starting long-running task");try {Thread.sleep(5000); // 模拟长时间运行任务} catch (InterruptedException e) {e.printStackTrace;}System.out.println("Long-running task completed");}}
Controller接口异步处理
@GetMapping("/deferred")@ResponseBodypublicDeferredResult> deferred{long start = System.currentTimeMillis ;System.out.printf("%s - 开始时间:%d%n", Thread.currentThread.getName, start) ;DeferredResult> deferredResult = newDeferredResult<>;// 为了演示方便直观,这里直接创建线程newThread( -> {try {// 这里模拟耗时操作TimeUnit.SECONDS.sleep(3) ;// 将执行结果保存Map result = newHashMap<> ;result.put("code", 1) ;result.put("data", "你的业务数据") ;deferredResult.setResult(result) ;} catch (InterruptedException e) {}}).start ;long end = System.currentTimeMillis ;System.out.printf("%s - 结束时间:%d%n", Thread.currentThread.getName, end) ;System.out.printf("总耗时:%d毫秒%n", (end - start)) ;return deferredResult ;}
关于Controller接口异步处理的更多方式,可以查看下面链接:
快速掌握Spring异步请求接口,轻松解决并发问题
2.2 使用缓存
使用缓存是提升响应速度的另一种重大手段。对于不常常变动的数据,我们可以将其缓存起来,这样就不必每次都从数据库或远程服务中获取。
@Service@CacheConfig(cacheNames = {"userCache"})publicclassUserService {privatefinal Logger logger = LoggerFactory.getLogger(UserService.class) ;@Cacheable(key = "#id")public User queryById(Long id) {logger.info("从数据库查询用户:{}", id) ;return new User(id, "姓名 - " + new Random.nextInt(1000), new Random.nextInt(100)) ;}}
这里, @Cacheable 表明将该方法的返回值缓存起来,缓存名称为 userCache。这样,当参数 id 一样时,数据将直接从缓存中获取,而不再每次执行方法体。
2.3 数据库查询优化
优化数据库查询是减少 API 响应时间的关键。合理的索引、减少查询字段以及避免复杂的连接(Joins)是常见的优化方法。
@ServicepublicclassDatabaseOptimizationService {@PersistenceContextprivateEntityManager entityManager;publicList optimizedQuery {Query query = entityManager.createQuery("SELECT field1, field2 FROM MyTable WHERE condition");// Optimized queryreturn query.getResultList;}}
在此示例中,我们仅查询所需的字段(field1 和 field2),而不是查询整张表的所有字段。这可以大幅减少数据传输和处理时间。当然你完全可以通过基于注解@Query方式自定义查询。如下:
publicinterfaceUserProjection {Long getId;String getUsername;String getPhone;}publicinterfaceUserRepositoryextendsJpaRepository {@Query("SELECT u.id as id, u.username as username, u.phone as phone FROM User u WHERE u.status = 1")ListfindUserProjection;}
2.4 使用压缩技术
在处理传输大量数据的 API 时,使用数据压缩可以减少网络传输时间,从而提升响应速度。特别是在 RESTful API 中,你可以对 JSON 或 XML 响应体进行压缩来实现这一目标。
@RestControllerpublicclassCompressionController {@GetMapping("/compressedData")publicvoidgetCompressedData(HttpServletResponse response)throws IOException {Stringdata="This is a large amount of data that needs to be compressed...";ByteArrayOutputStreambyteArrayOutputStream=newByteArrayOutputStream;GZIPOutputStreamgzipOutputStream=newGZIPOutputStream(byteArrayOutputStream);gzipOutputStream.write(data.getBytes);gzipOutputStream.close;response.addHeader("Content-Encoding", "gzip");response.getOutputStream.write(byteArrayOutputStream.toByteArray);}}
在此示例中,我们使用 GZIPOutputStream 对数据进行 GZIP 压缩,并在响应头中指明内容编码方式。实际项目中不可能对每个接口都这样处理,那就太麻烦了,我们一般使用如下配置:
server:compression:enabled: truemin-response-size: 1024mime-types: text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml
2.5 WebFlux响应式技术
Spring WebFlux 是 Spring 5 引入的,它提供了对响应式编程的支持,能够在处理大量并发请求时提升性能。第一,需要引入如下依赖:
org.springframework.bootgroupId>spring-boot-starter-webfluxartifactId>dependency>
Controller接口
@RestControllerpublicclassWebFluxController {@GetMapping("/reactiveData")publicMono getReactiveData {returnMono.just("Reactive programming data");}}
在此示例中,我们使用 Mono 来异步返回数据。这种方式在处理大量请求时可以保持较低的资源占用。
2.6 日志优化
过度或不必要的日志记录的确 会影响 API 的响应时间。通过配置适当的日志级别并在生产环境中禁用 DEBUG 日志,可以有效提升 API 性能。
@RestControllerpublicclassLoggingController {private static final Logger logger = LoggerFactory.getLogger(LoggingController.class);@GetMapping("/efficientLogging")public String getEfficientLogging {// 仅在需要时打印日志if (logger.isInfoEnabled) {logger.info("Efficient logging");}return"Logging optimization example";}}
在此示例中,我们在记录日志之前先检查日志级别是否启用。这样可以避免在生产环境中生成大量的调试信息。
关于日志的更多优化,查看下面链接:
天天打 Log,你管这叫“无损”?写错一个日志,Spring Boot 吞吐量直接腰斩!
2.7 优化数据库查询索引
合理的数据库索引可以极大地提高查询效率。特别是在处理大规模数据集或频繁查询时,正确的索引可以显著减少查询时间。
代码示例:
假设我们有一个用户表,并且常常通过用户名(username)来查询用户。为了优化此查询,我们可以在 username 字段上创建索引。
CREATE INDEX idx_username_email_age ONUser(username, email, age);
查询时注意索引前缀:
publicinterfaceUserRepositoryextendsJpaRepository {UserfindByUsernameAndEmail(String username, String email);}
2.8 使用连接池管理数据库连接
这是最基本。合理配置和使用数据库连接池是提高数据库操作效率的关键。它可以减少频繁创建和销毁数据库连接所带来的开销。
common-datasource: &common-dsdriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: '{cipher}BlgIeTDSKwIfwjdXk5TzKQ=='type: com.zaxxer.hikari.HikariDataSourcespring:datasource:url: jdbc:mysql://localhost:3306/testjpa<<: *common-dshikari:minimumIdle: 20maximumPoolSize: 50autoCommit: true
2.9 使用CDN加速静态资源加载
将静态资源(如图片、CSS 和 JavaScript 文件)放置在 CDN 上可以加快这些资源的加载速度,从而间接提升 API 的响应时间。假设你有一个静态资源,例如一张图片,你可以将其上传到 CDN,并在应用程序中像这样引用它:
script>
当用户访问您的应用程序时,图片将从距离用户最近的 CDN 节点加载,从而缩短加载时间。
以上是本篇文章的全部内容,如对你有协助帮忙 点赞+转发+收藏
天天打 Log,你管这叫“无损”?写错一个日志,Spring Boot 吞吐量直接腰斩!
别再手动 if-else 了!Spring Boot 局部更新神器 @JsonMerge
接口优化!Spring Boot 整合 Kryo 提升接口性能,传输数据更小
弃用HTTP!Spring Boot 集成 GRPC 优化接口调用性能
技术专家!Spring Boot 运行时动态修改执行SQL,支持JPA,MyBatis,JDBC
代码量直降 30%!这个开源组件,零侵入统一 Controller 响应
Spring Boot 二进制数据传输:从内存优化到流式处理与断点续传
自己动手实现Agent统计API接口调用耗时
处理的神器Optional
优雅!Spring Boot 一个注解,开启 SQL 数据动态权限控制
高级开发!拒绝AOP,Spring Boot 性能更高的接口幂等设计















