Spring 框架给企业软件开发者提供了常见问题的通用解决方案,包括那些在未来开发中没有意识到的问题。但是,它构建的 J2EE 项目变得越来越臃肿,逐渐被 Spring Boot 所替代。Spring Boot 让我们创建和运行项目变得更为迅速,现在已经有越来越多的人使用它。我们已经在几个项目中使用了 Spring Boot ,今天我们就来一起讨论一下如何改进 Spring Boot 应用的性能。

首先,从之前我在开发中遇到的一个问题说起。在一次查看项目运行日志的时候,我偶然发现了一个问题,日志里显示这个项目总是加载 Velocity 模板引擎,但实际上这个项目是一个没有 web 页面的 REST Service 项目。于是我花了一点时间去寻找产生这个问题的原因,以及如何改进 Spring Boot 应用的性能。在查找了相关的资料后,我得出的结论如下:

组件自动扫描带来的问题

默认情况下,我们会使用 @SpringBootApplication 注解来自动获取的应用的配置信息,但这样也会给应用带来一些副作用。使用这个注解后,会触发自动配置( auto-configuration )和 组件扫描 ( component scanning ),这跟使用 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 三个注解的作用是一样的。这样做给开发带来方便的同时,也会有两方面的影响:

1、会导致项目启动时间变长。当启动一个大的应用程序,或将做大量的集成测试启动应用程序时,影响会特别明显。

2、会加载一些不需要的多余的实例(beans)。

3、会增加 CPU 消耗。

针对以上两个情况,我们可以移除 @SpringBootApplication 和 @ComponentScan 两个注解来禁用组件自动扫描,然后在我们需要的 bean 上进行显式配置:

// 移除 @SpringBootApplication and @ComponentScan, 用 @EnableAutoConfiguration 来替代
@Configuration
@EnableAutoConfiguration
public class SampleWebUiApplication {// ...// 用 @Bean 注解明确显式配置,以便被 Spring 扫描到@Beanpublic MessageController messageController(MessageRepository messageRepository) {return new MessageController(messageRepository);}

如何避免组件自动扫描带来的问题

我们在上面提到,@SpringBootApplication 注解的作用跟 @EnableAutoConfiguration 注解的作用是相当的,那就意味着它也能带来上述的三个问题。要避免这些问题,我们就要知道我们需要的组件列表是哪些,可以用 -Ddebug 的方式来帮助我们明确地定位:

mvn spring-boot:run -Ddebug
…
=========================
AUTO-CONFIGURATION REPORT
=========================Positive matches:
-----------------DispatcherServletAutoConfiguration- @ConditionalOnClass classes found: org.springframework.web.servlet.DispatcherServlet (OnClassCondition)- found web application StandardServletEnvironment (OnWebApplicationCondition)...

接着拷贝 Positive matches 中列出的信息:

DispatcherServletAutoConfiguration
EmbeddedServletContainerAutoConfiguration
ErrorMvcAutoConfiguration
HttpEncodingAutoConfiguration
HttpMessageConvertersAutoConfiguration
JacksonAutoConfiguration
JmxAutoConfiguration
MultipartAutoConfiguration
ServerPropertiesAutoConfiguration
PropertyPlaceholderAutoConfiguration
ThymeleafAutoConfiguration
WebMvcAutoConfiguration
WebSocketAutoConfiguration

然后来更新项目配置,显式地引入这些组件,引入之后,再运行一下应用确保没有错误发生:

@Configuration
@Import({DispatcherServletAutoConfiguration.class,EmbeddedServletContainerAutoConfiguration.class,ErrorMvcAutoConfiguration.class,HttpEncodingAutoConfiguration.class,HttpMessageConvertersAutoConfiguration.class,JacksonAutoConfiguration.class,JmxAutoConfiguration.class,MultipartAutoConfiguration.class,ServerPropertiesAutoConfiguration.class,PropertyPlaceholderAutoConfiguration.class,ThymeleafAutoConfiguration.class,WebMvcAutoConfiguration.class,WebSocketAutoConfiguration.class,
})
public class SampleWebUiApplication {

在上面的代码中,我们可以删掉我们不需要的组件信息,来提高应用的性能,比如在我的项目中,不需要 JMX 和 WebSocket 功能,我就删掉了它们。删掉之后,再次运行项目,确保一切正常。

将Servlet容器变成Undertow

默认情况下,Spring Boot 使用 Tomcat 来作为内嵌的 Servlet 容器。我们可以启动项目,然后用 VisualVM 或者 JConsole 来查看应用所占的内存情况:

以上是我使用 Spring Boot 的默认方式启动应用后,用 VisualVM 监控到的内存的占用情况:堆内存占用 110M,16 个线程被开启。

可以将 Web 服务器切换到 Undertow 来提高应用性能。Undertow 是一个采用 Java 开发的灵活的高性能 Web 服务器,提供包括阻塞和基于 NIO 的非堵塞机制。Undertow 是红帽公司的开源产品,是 Wildfly 默认的 Web 服务器。首先,从依赖信息里移除 Tomcat 配置:

<exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion>
</exclusions>

然后添加 Undertow:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

启动项目后,用 VisualVM 监控到的信息显示:堆内存占用 90M,13个线程被开启。

总结

这些都是我们在项目开发中使用到的一些优化 Spring
Boot 应用的小技巧,对于大的应用性能的提高还是很明显的。大家可以尝试一下,然后告诉我们你的测试结果。

最后,附上代码,大家可以去这里下载:spring-boot-performance。

文中大部分内容参考英国一个架构师的博客 和 DZone 近期发布的文章,在此感谢两位大牛。参考文章及链接:

(1)Spring Boot 性能优化:Spring Boot Performance;

(2)Spring Boot 内存优化:Spring Boot Memory Performance。

(3)https://www.techempower.com/benchmarks/;

(4)Spring 应用程序优化:Optimizing Spring Framework for App Engine Applications。

Spring Boot 性能优化相关推荐

  1. Spring Boot 这样优化,让你的项目飞起来!

    点击关注公众号,回复"1024"获取2TB学习资源! 介绍 在SpringBoot的Web项目中,默认采用的是内置Tomcat,当然也可以配置支持内置的jetty,内置有什么好处呢 ...

  2. 每秒上万并发下的Spring Cloud性能优化之道

    一.写在前面 相信不少朋友都在自己公司使用Spring Cloud框架来构建微服务架构,毕竟现在这是非常火的一门技术. 如果只是用户量很少的传统IT系统,使用Spring Cloud可能还暴露不出什么 ...

  3. 后端技术:Spring Boot 项目优化和 JVM 调优,真实有效。

    项目调优 作为一名工程师,项目调优这事,是必须得熟练掌握的事情. 在SpringBoot项目中,调优主要通过配置文件和配置JVM的参数的方式进行. 一.修改配置文件 关于修改配置文件applicati ...

  4. 这样优化Spring Boot,启动速度快到飞起!

    微服务用到一时爽,没用好就呵呵啦,特别是对于服务拆分没有把控好业务边界.拆分粒度过大等问题,某些 Spring Boot 启动速度太慢了,可能你也会有这种体验,这里将探索一下关于 Spring Boo ...

  5. 【springboot系列】这样优化Spring Boot,启动速度快到飞起!

    微服务用到一时爽,没用好就呵呵啦,特别是对于服务拆分没有把控好业务边界.拆分粒度过大等问题,某些 Spring Boot 启动速度太慢了,可能你也会有这种体验,这里将探索一下关于 Spring Boo ...

  6. springboot项目实战_2019学习进阶之路:高并发+性能优化+Spring boot等大型项目实战...

    Java架构师主要需要做哪些工作呢? 负责设计和搭建软件系统架构(平台.数据库.接口和应用架构等),解决开发中各种系统架构问题. 优化现有系统的性能,解决软件系统平台关键技术问题攻关.核心功能模块设计 ...

  7. VS Code 2022路线图:大量Spring Boot优化提上日程!难道是被JB Code吓到了?

    前沿技术早知道,弯道超车有希望 积累超车资本,从关注DD开始 1月20日,一名微软开发者发布了一篇标题为<Java on Visual Studio Code Update>的文章. 文中 ...

  8. Spring Boot 2.2.0 正式发布,大幅性能提升 + Java 13 支持

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | DD小分队 来源 | didispace.com/spring-boot-2-2- ...

  9. Spring Boot 微服务性能下降九成!使用 Arthas 定位根因

    作者 | 王瑞显  掌门教育基础架构部研发工程师 来源|阿里巴巴云原生公众号 背景 接收到公司业务部门的开发反馈,应用在升级公司内部框架后,UAT(预生产)环境接口性能压测不达标. 升级前压测报告: ...

最新文章

  1. go标准库的学习-crypto/aes
  2. php中引入shiro,基于shiro的自定义注解的扩展-图文详解
  3. 前端使用js发起http请求的几种方法
  4. C#。2.1 运算符
  5. C++_程序内存模型_new运算符---C++语言工作笔记030
  6. tablesample oracle,Hive DDL 内部表外部表 分区 分桶 行格式 存储文件格式 概述
  7. python验证身份证最后一位数字代表什么_身份证号码最后一位代表什么?
  8. webpack——快速入门【一】
  9. 浏览器对缓存的使用规则
  10. DataGrid相邻行有相同内容时对指定列合并和C#可以实现DLL库的动态调用
  11. 服务器lsass占用内存_服务器内存跑满是什么原因造成的呢?
  12. wps2000集成办公系统 v3.02.99专业版(附序列号)|wps2000老版本
  13. 计算机一级在线模拟试题,全国计算机等级考试一级模拟试题(一)
  14. asp.net core部署在docker容器中运行
  15. 高通源代码 Ubuntu14.04下载编译Android(1)
  16. guass白名单的配置命令
  17. 两个字说清楚编程语言实质-Python基础前传(3)
  18. 苹果内存其他怎么清理_手机内存不足怎么清理才有效?
  19. Twilight的卡牌游戏
  20. 华为WeAutomate RPA介绍

热门文章

  1. 3. golang 流程控制
  2. linux下定时清理磁盘日志步骤
  3. JDK1.6官方下载
  4. 利用 python 的各种开源工具自制浏览器
  5. Windows phone 应用开发[2]-数据缓存
  6. HLS实现点播和直播时,M3U8文件的不同
  7. RTP协议之Header结构解析
  8. python dlib学习(三):调用cnn人脸检测
  9. Thread-方法以及wait、notify简介
  10. 在Linux Debian 8下部署基于PHP的Web项目。