今日分享丨浅谈iGIX并行启动

2024-08-21 18:52

本文主要是介绍今日分享丨浅谈iGIX并行启动,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.概述

在Java生态里,有很多系统都是基于Spring Framework、Spring Boot来开发。Spring Boot 是一个基于 Spring 框架的快速开发框架,Spirng Boot 本身并不提供 Spring 框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序。

Spring Boot 以约定大于配置的核心思想,默认帮我们进行了很多设置,自动装配了Bean几乎可以零配置的供我们开箱即用。所以在Spring Boot的启动过程中Bean的装配是一个最主要的过程,从而使得Spring Boot应用的启动速度和Bean的数量,Bean初始化方式等成正相关。当一个大型Spring Boot应用包含了很多Bean的使用,那么应用的启动速度就会受到这些Bean初始化的严重影响。

2.iGIX并行启动

iGIX基于Spring Boot开发,Spring Boot启动过程本身是单线程的,应用启动过程中所有Bean的初始化工作全部串行执行。但从实际Bean依赖考虑,并非系统里所有的Bean之间都有相互依赖,而这些不相互依赖的Bean在启动阶段完全没有必要串行启动浪费等待时间。因此我们借助iGIX里SU模块隔离的方式,在Spring Boot启动过程中把不同SU模块Bean创建变成基于多线程机制的并行初始化,这样就可以省去非相互依赖Bean初始化的等待时间,充分利用多核CPU的性能,大大提升启动速度。

3.并行启动原理

3.1 Spring Bean加载

在说Bean加载的生命周期时,需要先说Spring Boot启动时的几个重要对象:

1. SpringApplication: Spring Boot核心启动类

2. ApplicationContext:Spring Boot应用程上下文

3. LaunchedURLClassLoader: Spring Boot类加载器

Spring Boot启动通过SpringApplication.run方法来启动应用程序,然后通过refreshContext()来通知ApplicationContext来refresh()。在refrsh里,ApplicationContext就完成了Bean生命周期的创建过程,包括:BeanFactory注册、BeanFactory创建前后处理器注册和触发、Bean创建前后处理的注册、Bean的创建等等过程。整个Spring Boot启动最耗时的部分也就是在整个Application的Context里。

3.2 iGIX并行启动Bean加载

由3.1我们知道Bean的初始化都是在ApplicationContext的refresh里完成,并且Spring整个过程都是单线程处理,那只要把不同模块的划分为不同的ApplicationContext,在多线程里完成refresh过程即可实现并行加载的过程。按照这个思路,iGIX通过以下两部完成了模块见的并行启动:

1. 通过自定义的ApplicaitonContext去维护不同模块的应用程序上下文和Bean容器,隔离了不同模块的Bean容器,这样保证了不同模块可以独立线程启动。

2.通过自定义的ClassLoader来统一持有了系统里的所有的Class,保证了系统里Class稳定性,在各个Bean容器共享。

通过以上方式,iGIX的启动速度相比Spring Boot原生的启动速度有了40%-50%的性能提升

同时也兼顾的Spring Boot本身的开发模式,对现有代码的改动侵入性降到了最低。


写在最后,欢迎大家下载我们的inBuilder低代码平台开源社区版,可免费下载使用,加入我们,开启开发体验之旅!

这篇关于今日分享丨浅谈iGIX并行启动的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1093993

相关文章

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

一文带你了解SpringBoot中启动参数的各种用法

《一文带你了解SpringBoot中启动参数的各种用法》在使用SpringBoot开发应用时,我们通常需要根据不同的环境或特定需求调整启动参数,那么,SpringBoot提供了哪些方式来配置这些启动参... 目录一、启动参数的常见传递方式二、通过命令行参数传递启动参数三、使用 application.pro

SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

《SpringBoot项目启动报错找不到或无法加载主类的解决方法》在使用IntelliJIDEA开发基于SpringBoot框架的Java程序时,可能会出现找不到或无法加载主类com.example.... 目录一、问题描述二、排查过程三、解决方案一、问题描述在使用 IntelliJ IDEA 开发基于

Python解析器安装指南分享(Mac/Windows/Linux)

《Python解析器安装指南分享(Mac/Windows/Linux)》:本文主要介绍Python解析器安装指南(Mac/Windows/Linux),具有很好的参考价值,希望对大家有所帮助,如有... 目NMNkN录1js. 安装包下载1.1 python 下载官网2.核心安装方式3. MACOS 系统安

SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法

《SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法》本文主要介绍了SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录方法1:更改IDE配置方法2:在Eclipse中清理项目方法3:使用Maven命令行在开发Sprin

Java嵌套for循环优化方案分享

《Java嵌套for循环优化方案分享》介绍了Java中嵌套for循环的优化方法,包括减少循环次数、合并循环、使用更高效的数据结构、并行处理、预处理和缓存、算法优化、尽量减少对象创建以及本地变量优化,通... 目录Java 嵌套 for 循环优化方案1. 减少循环次数2. 合并循环3. 使用更高效的数据结构4

Java之并行流(Parallel Stream)使用详解

《Java之并行流(ParallelStream)使用详解》Java并行流(ParallelStream)通过多线程并行处理集合数据,利用Fork/Join框架加速计算,适用于大规模数据集和计算密集... 目录Java并行流(Parallel Stream)1. 核心概念与原理2. 创建并行流的方式3. 适

Python中常用的四种取整方式分享

《Python中常用的四种取整方式分享》在数据处理和数值计算中,取整操作是非常常见的需求,Python提供了多种取整方式,本文为大家整理了四种常用的方法,希望对大家有所帮助... 目录引言向零取整(Truncate)向下取整(Floor)向上取整(Ceil)四舍五入(Round)四种取整方式的对比综合示例应

Nginx启动失败:端口80被占用问题的解决方案

《Nginx启动失败:端口80被占用问题的解决方案》在Linux服务器上部署Nginx时,可能会遇到Nginx启动失败的情况,尤其是错误提示bind()to0.0.0.0:80failed,这种问题通... 目录引言问题描述问题分析解决方案1. 检查占用端口 80 的进程使用 netstat 命令使用 ss