今日分享丨浅谈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

相关文章

Python虚拟环境与Conda使用指南分享

《Python虚拟环境与Conda使用指南分享》:本文主要介绍Python虚拟环境与Conda使用指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python 虚拟环境概述1.1 什么是虚拟环境1.2 为什么需要虚拟环境二、Python 内置的虚拟环境工具

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

Oracle修改端口号之后无法启动的解决方案

《Oracle修改端口号之后无法启动的解决方案》Oracle数据库更改端口后出现监听器无法启动的问题确实较为常见,但并非必然发生,这一问题通常源于​​配置错误或环境冲突​​,而非端口修改本身,以下是系... 目录一、问题根源分析​​​二、保姆级解决方案​​​​步骤1:修正监听器配置文件 (listener.

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

MySQL启动报错:InnoDB表空间丢失问题及解决方法

《MySQL启动报错:InnoDB表空间丢失问题及解决方法》在启动MySQL时,遇到了InnoDB:Tablespace5975wasnotfound,该错误表明MySQL在启动过程中无法找到指定的s... 目录mysql 启动报错:InnoDB 表空间丢失问题及解决方法错误分析解决方案1. 启用 inno

Python处理大量Excel文件的十个技巧分享

《Python处理大量Excel文件的十个技巧分享》每天被大量Excel文件折磨的你看过来!这是一份Python程序员整理的实用技巧,不说废话,直接上干货,文章通过代码示例讲解的非常详细,需要的朋友可... 目录一、批量读取多个Excel文件二、选择性读取工作表和列三、自动调整格式和样式四、智能数据清洗五、

JDK9到JDK21中值得掌握的29个实用特性分享

《JDK9到JDK21中值得掌握的29个实用特性分享》Java的演进节奏从JDK9开始显著加快,每半年一个新版本的发布节奏为Java带来了大量的新特性,本文整理了29个JDK9到JDK21中值得掌握的... 目录JDK 9 模块化与API增强1. 集合工厂方法:一行代码创建不可变集合2. 私有接口方法:接口

电脑系统Hosts文件原理和应用分享

《电脑系统Hosts文件原理和应用分享》Hosts是一个没有扩展名的系统文件,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应... Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失