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

相关文章

Spring核心思想之浅谈IoC容器与依赖倒置(DI)

《Spring核心思想之浅谈IoC容器与依赖倒置(DI)》文章介绍了Spring的IoC和DI机制,以及MyBatis的动态代理,通过注解和反射,Spring能够自动管理对象的创建和依赖注入,而MyB... 目录一、控制反转 IoC二、依赖倒置 DI1. 详细概念2. Spring 中 DI 的实现原理三、

SpringBoot项目启动后自动加载系统配置的多种实现方式

《SpringBoot项目启动后自动加载系统配置的多种实现方式》:本文主要介绍SpringBoot项目启动后自动加载系统配置的多种实现方式,并通过代码示例讲解的非常详细,对大家的学习或工作有一定的... 目录1. 使用 CommandLineRunner实现方式:2. 使用 ApplicationRunne

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

C#读取本地网络配置信息全攻略分享

《C#读取本地网络配置信息全攻略分享》在当今数字化时代,网络已深度融入我们生活与工作的方方面面,对于软件开发而言,掌握本地计算机的网络配置信息显得尤为关键,而在C#编程的世界里,我们又该如何巧妙地读取... 目录一、引言二、C# 读取本地网络配置信息的基础准备2.1 引入关键命名空间2.2 理解核心类与方法

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表

bat脚本启动git bash窗口,并执行命令方式

《bat脚本启动gitbash窗口,并执行命令方式》本文介绍了如何在Windows服务器上使用cmd启动jar包时出现乱码的问题,并提供了解决方法——使用GitBash窗口启动并设置编码,通过编写s... 目录一、简介二、使用说明2.1 start.BAT脚本2.2 参数说明2.3 效果总结一、简介某些情

Python中处理NaN值的技巧分享

《Python中处理NaN值的技巧分享》在数据科学和数据分析领域,NaN(NotaNumber)是一个常见的概念,它表示一个缺失或未定义的数值,在Python中,尤其是在使用pandas库处理数据时,... 目录NaN 值的来源和影响使用 pandas 的 isna()和 isnull()函数直接比较 Na

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间