`
OneAPM_Official
  • 浏览: 25187 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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 扫描到
    @Bean
    public 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 性能优化

以上是我使用 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 应用的小技巧,对于大的应用性能的提高还是很明显的。大家可以尝试一下,然后告诉我们你的测试结果。

最后,附上代码,大家可以去这里下载: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

OneAPM 为您提供端到端的 Java 应用性能解决方案,我们支持所有常见的 Java 框架及应用服务器,助您快速发现系统瓶颈,定位异常根本原因。分钟级部署,即刻体验,Java 监控从来没有如此简单。想阅读更多技术文章,请访问 OneAPM 官方技术博客

本文转自 OneAPM 官方博客

分享到:
评论

相关推荐

    后端框架:Spring Boot性能优化与监控详解

    内容概要:本文详细介绍了Spring Boot应用的性能优化与监控策略,涵盖启动时间、内存使用、数据库访问、网络I/O等多个层面。主要内容包括减少依赖、懒加载、配置优化、数据库连接池调优、异步编程、缓存策略、微服务...

    Spring Boot性能优化与架构设计:应对技术瓶颈及改进建议

    适合人群:具有一定的Java开发经验和Spring Boot使用经验的技术人员,特别是负责系统架构和性能优化的工程师。 使用场景及目标:适用于希望在实际项目中提升Spring Boot应用性能、优化内存管理和改进微服务架构的...

    Spring Boot性能优化:批量更新技术详解与效率提升指南.zip

    适用于对Spring Boot和数据库性能优化感兴趣的开发者、架构师和IT技术爱好者。无论您是正在寻求提升现有系统性能的资深开发者,还是正在学习新技术、探索更优解的新手,本文都将为您提供有价值的参考和启示,特别是...

    Spring Boot性能瓶颈与优化改进建议

    使用场景及目标:帮助开发人员理解Spring Boot的性能瓶颈,掌握优化方法,提升应用性能和系统可靠性。同时,为未来的技术选型和发展方向提供参考。 阅读建议:深入理解Spring Boot的技术栈及其工作原理,重点关注...

    LEARNING SPRING BOOT 3.0 - THIRD EDITION

    性能优化方面,Spring Boot 3.0可能会进一步改善其自动配置机制,提高应用启动速度和运行效率。对于微服务架构的支持也会得到增强,这对于构建大型分布式系统来说至关重要。同时,安全性一直是Spring Boot关注的重点...

    Spring boot视频

    #### 六、Spring Boot 性能优化 - **热部署**:使用 DevTools 实现代码修改后自动重启应用。 - **JVM 参数调优**:合理设置 JVM 参数以提高应用性能。 - **缓存策略**:使用 Spring Cache 或 Ehcache 等技术提高...

    Netty+Spring Boot仿微信 全栈开发高性能后台及客户端

    综上所述,"Netty+Spring Boot仿微信 全栈开发高性能后台及客户端"项目是一个综合性的学习和实践平台,涵盖了网络编程、后端开发、全栈集成以及性能优化等多个领域。通过这个项目,开发者不仅可以提升自己的技术能力...

    最新Spring Boot Admin 官方参考指南-中文版-2.x

    Spring Boot Admin 是...通过其直观的UI和与Spring Boot Actuator的紧密集成,开发者可以轻松地获取应用程序的实时状态,进行问题排查和性能优化。无论是快速部署还是深度定制,Spring Boot Admin都能提供有力的支持。

    十分钟上手spring boot

    - **性能优化:**针对生产环境进行必要的性能调优,如JVM参数调整、数据库连接池配置等。 **7. 高级主题** - **微服务架构:**利用Spring Cloud构建微服务架构。 - **安全性:**Spring Security集成,提供安全认证...

    Spring Boot实战 ,丁雪丰 (译者).zip

    最后,书中的最佳实践和经验分享部分,将指导读者如何优化Spring Boot应用,提高性能和可维护性。 总的来说,《Spring Boot实战》这本书全面覆盖了Spring Boot从入门到进阶的各项知识点,无论是初学者还是有一定...

    spring boot 相关技术

    6. **性能调优**:提供关于如何分析和优化 Spring Boot 应用性能的技巧。 《深入实践 Spring Boot》可能涉及更多高级和实践性的话题: 1. **分布式系统**:如分布式配置、分布式追踪(Zipkin 或 Sleuth)、分布式...

    Spring Boot高并发性能优化与微服务架构挑战分析

    内容概要:本文详细分析了Spring Boot在高并发场景下的性能瓶颈和技术挑战,并提出了具体的优化方案。主要讨论了启动性能与资源占用、内存管理与GC性能、高并发场景下的线程池优化、微服务架构中的服务治理与分布式...

    基于 Spring Cloud 2021 、Spring Boot 2.7、 OAuth2 的 RBAC 权限管理系统源码

    在2.7版本中,可能会包含性能优化、新特性和对其他库的升级,例如Spring Framework 5.x的支持。 Spring Cloud 2021作为微服务生态的重要组成部分,提供了服务发现、配置中心、负载均衡、熔断器、API网关等一系列...

    Spring Boot参考指南

    6. **Actuator监控**:Actuator提供了丰富的监控和管理应用的端点,如metrics、info、env、loggers等,帮助开发者深入了解应用的运行状态,方便问题诊断和性能优化。 7. **YAML与Properties配置**:Spring Boot支持...

    Spring Boot + Vue3 完整开发全栈项目附资料.zip

    Vue3是Vue.js的最新版本,提供了许多性能优化和新特性,如Composition API、Teleport、Suspense等,使得代码更加模块化,提升了开发体验和应用性能。 三、Spring Boot与Vue3整合 1. 构建RESTful API:Spring Boot...

    spring boot + netty websocket

    将Spring Boot与Netty结合,可以利用Spring Boot的便捷性和Netty的高性能。首先,我们需要在Spring Boot项目中引入Netty的相关依赖,并配置WebSocket处理器。Spring Boot的WebSocket配置通常涉及到`...

    Spring Boot源码(spring-boot-2.6.2.tar.gz)

    在2.6.2版本中,可能包含了性能优化、新功能的引入以及已知问题的修复。开发者可以通过阅读源码,理解这些改进的具体实现,从而更好地利用Spring Boot来构建高效、稳定的Java应用。 总的来说,深入研究Spring Boot ...

    spring-boot-assistant-222.17.2

    6. **性能优化提示**:当检测到可能影响性能的代码或配置时,插件会给出优化建议,帮助开发者提升应用性能。 7. **版本兼容性检查**:插件会自动检查项目中使用的Spring Boot版本与其他库的兼容性,避免因版本不...

Global site tag (gtag.js) - Google Analytics