今日分享丨浅谈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低代码平台开源社区版,可免费下载使用,加入我们,开启开发体验之旅!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值