Spring Boot 性能优化
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 性能优化相关推荐
- Spring Boot 这样优化,让你的项目飞起来!
点击关注公众号,回复"1024"获取2TB学习资源! 介绍 在SpringBoot的Web项目中,默认采用的是内置Tomcat,当然也可以配置支持内置的jetty,内置有什么好处呢 ...
- 每秒上万并发下的Spring Cloud性能优化之道
一.写在前面 相信不少朋友都在自己公司使用Spring Cloud框架来构建微服务架构,毕竟现在这是非常火的一门技术. 如果只是用户量很少的传统IT系统,使用Spring Cloud可能还暴露不出什么 ...
- 后端技术:Spring Boot 项目优化和 JVM 调优,真实有效。
项目调优 作为一名工程师,项目调优这事,是必须得熟练掌握的事情. 在SpringBoot项目中,调优主要通过配置文件和配置JVM的参数的方式进行. 一.修改配置文件 关于修改配置文件applicati ...
- 这样优化Spring Boot,启动速度快到飞起!
微服务用到一时爽,没用好就呵呵啦,特别是对于服务拆分没有把控好业务边界.拆分粒度过大等问题,某些 Spring Boot 启动速度太慢了,可能你也会有这种体验,这里将探索一下关于 Spring Boo ...
- 【springboot系列】这样优化Spring Boot,启动速度快到飞起!
微服务用到一时爽,没用好就呵呵啦,特别是对于服务拆分没有把控好业务边界.拆分粒度过大等问题,某些 Spring Boot 启动速度太慢了,可能你也会有这种体验,这里将探索一下关于 Spring Boo ...
- springboot项目实战_2019学习进阶之路:高并发+性能优化+Spring boot等大型项目实战...
Java架构师主要需要做哪些工作呢? 负责设计和搭建软件系统架构(平台.数据库.接口和应用架构等),解决开发中各种系统架构问题. 优化现有系统的性能,解决软件系统平台关键技术问题攻关.核心功能模块设计 ...
- VS Code 2022路线图:大量Spring Boot优化提上日程!难道是被JB Code吓到了?
前沿技术早知道,弯道超车有希望 积累超车资本,从关注DD开始 1月20日,一名微软开发者发布了一篇标题为<Java on Visual Studio Code Update>的文章. 文中 ...
- Spring Boot 2.2.0 正式发布,大幅性能提升 + Java 13 支持
点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | DD小分队 来源 | didispace.com/spring-boot-2-2- ...
- Spring Boot 微服务性能下降九成!使用 Arthas 定位根因
作者 | 王瑞显 掌门教育基础架构部研发工程师 来源|阿里巴巴云原生公众号 背景 接收到公司业务部门的开发反馈,应用在升级公司内部框架后,UAT(预生产)环境接口性能压测不达标. 升级前压测报告: ...
最新文章
- go标准库的学习-crypto/aes
- php中引入shiro,基于shiro的自定义注解的扩展-图文详解
- 前端使用js发起http请求的几种方法
- C#。2.1 运算符
- C++_程序内存模型_new运算符---C++语言工作笔记030
- tablesample oracle,Hive DDL 内部表外部表 分区 分桶 行格式 存储文件格式 概述
- python验证身份证最后一位数字代表什么_身份证号码最后一位代表什么?
- webpack——快速入门【一】
- 浏览器对缓存的使用规则
- DataGrid相邻行有相同内容时对指定列合并和C#可以实现DLL库的动态调用
- 服务器lsass占用内存_服务器内存跑满是什么原因造成的呢?
- wps2000集成办公系统 v3.02.99专业版(附序列号)|wps2000老版本
- 计算机一级在线模拟试题,全国计算机等级考试一级模拟试题(一)
- asp.net core部署在docker容器中运行
- 高通源代码 Ubuntu14.04下载编译Android(1)
- guass白名单的配置命令
- 两个字说清楚编程语言实质-Python基础前传(3)
- 苹果内存其他怎么清理_手机内存不足怎么清理才有效?
- Twilight的卡牌游戏
- 华为WeAutomate RPA介绍