写点什么

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

  • 2024-08-21
    山东
  • 本文字数:1199 字

    阅读完需:约 4 分钟

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

用户头像

还未添加个人签名 2023-03-07 加入

塑造企业一体化研发新范式

评论

发布
暂无评论
今日分享丨浅谈iGIX并行启动_inBuilder低代码平台_InfoQ写作社区