阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

蚂蚁金服研发框架总览,SOFABoot 框架剖析

  • 2020-02-15
  • 本文字数:3497 字

    阅读完需:约 11 分钟

蚂蚁金服研发框架总览,SOFABoot 框架剖析

本文为《剖析 | SOFABoot 框架》第一篇,本篇作者纶珥,来自蚂蚁金服。《剖析 | SOFABoot 框架》系列由 SOFA 团队和源码爱好者们出品,项目代号:SOFA:BootLab。


SOFABoot 是蚂蚁金服开源的基于 SpringBoot 的研发框架,提供了诸如 Readiness Check、类隔离、日志空间隔离等能力,用于快速、敏捷地开发 Spring 应用程序,特别适合构建微服务系统。


SpringBoot 基于 Spring 的按条件配置(Conditional Configuration),结合 starter 依赖机制提供了快捷、方便开发 Spring 项目的体验,获得了极大的成功;SOFABoot 同样在这两个能力上基于 SpringBoot 扩展出适应于金融级应用开发框架。作为脱胎于蚂蚁金服内部对于 SpringBoot 的实践,SOFABoot 补充了 SpringBoot 在大规模金融级生产场景下一些不足的地方,例如 Readiness 检查、类隔离和日志空间隔离等等能力。在增强了 SpringBoot 的同时,SOFABoot 还提供了让用户可以在 SpringBoot 中非常方便地使用 SOFAStack 中间件的能力。


SOFABoot :https://github.com/sofastack/sofa-boot

1 功能点概览

SOFABoot 完全兼容 SpringBoot,SpringBoot 技术栈可以快速切换到 SOFABoot 技术栈:修改项目 pom 依赖的 <parent/> 节点,例如将:


<parent>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-parent</artifactId>    <version>${spring.boot.version}</version>    <relativePath/> </parent>
复制代码


替换为:


<parent>    <groupId>com.alipay.sofa</groupId>    <artifactId>sofaboot-dependencies</artifactId>    <version>${sofa.boot.version}</version></parent>
复制代码


当前 SOFABoot 的最新版本为 v3.2.2。

2 应用 Readliness 检查

一个应用启动之后,是否是“准备”好能够处理外部请求呢?作为应用流量入口的组件是否可以接收外部连接?这就很有必要引入应用 Readiness 的检查,SOFABoot 提供除 SpringBoot 健康检查之外的应用 Readiness 检查能力,保证应用组件的正常启动、应用安全上线。


SOFABoot 通过 HealthChecker 检查各组件的 ready 情况。在 Spring 上下文刷新完成之后(所有的 Spring Bean 已经实例化完成),SOFABoot 会获取 IoC 容器中所有的 HealthChecker 实现类,检查其返回的组件健康状况;在应用开启了模块化隔离之后,模块 HealthChecker 还会 kicks in,检查模块的健康状况。Spring 原生的 HealthIndicator 作为 Readiness 的一部分也会纳入 Readiness 的结果中,若 HealthIndicator 出现了失败的情况,那么应用的 Readiness 也是不通过。


Readiness 检查包含组件的后置检查,流量入口组件(例如:RPC、REST)需要保证后置检查通过之后能接受外部流量的请求,应用才是真正 ready 了。


应用 Readiness 与 Liveliness 不同的是 Readiness 表示的是应用启动完成之后是否“准备”好的状态,启动完成之后是不变的;两次部署间的 Readiness 的所有请求结果是一致的。

3 应用模块化

应用模块化的方案多种多样。传统方案是以应用功能为边界做模块划分;研发期间,不同职责的类放在不同的模块下,但在运行期间都在同一个 classpath 下,没有任何隔离。而与传统的模块划分方案不同,人们发现可以利用 Java 的 ClassLoader 机制,将模块与模块间的类完全隔离;当某个模块需要与另一个模块通信时,可以通过类的导入和导出来实现。OSGi 和 SOFAArk 都是基于 ClassLoader 隔离的模块化实践方案。


传统的模块化方案没有任何的隔离手段,模块间的边界得不到保障,容易出现模块间的紧耦合;而基于 ClassLoader 的模块化方案则过于彻底,研发人员必须十分清楚类的导入与导出、Java 的类加载体系,模块划分的负担转嫁到了普通研发人员身上。


SOFABoot 综合以上两种方案的利弊,引入了介于两者之间的模块化方案:每个模块有独立的 Spring 上下文,通过上下文的隔离,让不同模块之间的 Bean 的引用无法直接进行,达到模块在运行时的隔离。这样既保证了不引入过多的复杂性,也避免了没有任何隔离措施的模块边界保障。如下图所示:



所有的 SOFABoot 模块都会有一个相同的 Spring Context 的 Parent,称之为 Root Application Context。对于所有模块都需要引入的 Bean,可以选择将其放置于 Root Application Context 中,在所有的模块间共享。此外,SOFABoot 框架提供两种 Spring 上下文隔离方案后的模块间通信能力:


  • JVM 服务的发布和引用:同一个应用内不同模块间的通信。


// Publish a JVM service@Component@SofaServicepublic class MyServiceImpl implements MyService {    // implementation goes here}// Reference a JVM servicepublic class AnyClass {    @SofaReference    private MyService myService;}
复制代码


  • RPC 服务的发布和引用:不同应用间的通信。


// Publish a RPC service@Component@SofaService(interfaceType = MyService.class, bindings = { @SofaServiceBinding(bindingType = "bolt") })public class MyServiceImpl implements MyService {    // implementation goes here}// Reference a RPC servicepublic class AnyClass {    @SofaReference(binding = @SofaReferenceBinding(bindingType = "bolt"))    private MyService myService;}
复制代码


除了通过注解的方式,SOFABoot 还支持 XML 文件和编程 API 的配置方式。除了模块间通信能力,SOFABoot 还提供:


  • Module-Profile:模块级 Profile 能力,指定模块是否启动;

  • 扩展点:利用 Nuxeo Runtime 为 Bean 提供扩展点入口;

  • Require-Module:声明模块间依赖关系;

4 应用并行化启动

模块并行化启动


SOFABoot 模块之间的依赖关系可以通过 Require-Module 指定,SOFABoot 会计算模块间的依赖形成一个有向无环图(DAG,若是有环图则无法正常启动)。SOFABoot 按照拓扑关系顺序启动依赖模块,并行启动自由模块。例如有如下的模块间依赖:



从图中可知,模块 A 必须在 模块 B 和 C 之前启动,模块 D 必须在模块 E 之前启动;模块 A 和 D 是可以并行启动的(开始起点的自由模块)。相对于所有模块共享一个 Spring 上下文的应用,SOFABoot 应用的并行启动能显著加快应用启动速度。


Spring Bean 异步初始化


实际的 Spring/SpringBoot 开发中,Spring Bean 常常需要在初始化过程中执行准备操作,如拉取远程配置、初始化数据源等等;并且,这些准备操作在 Bean 初始化过程中占据了大量的时间,显著拖慢速度 Spring 上下文刷新速度。然而,Bean 初始化的准备操作与 Bean 的后置处理往往没有强制的前后顺序,是能够并行的!SOFABoot 敏锐地捕捉到了这个特点,提供了可配置选项,将 Bean 的 init-method 方法的执行异步化,从而加快 Spring 上下文刷新过程。



如图所示,Spring 在异步发射自定义 init-method 方法之后,马上进行 BeanPostProcessor 的后置处理,相当于“跳过”了最耗时的 init-method 环节。


Spring Bean 异步初始化配置方法:


<!-- 通过将 async-init 设为 true,开启对应 bean 的异步化初始化 --><bean id="testBean" class="com.alipay.sofa.beans.TimeWasteBean" init-method="init" async-init="true"/>
复制代码

5 中间件集成管理

SOFABoot 通过 starter 机制管理了中间件依赖,一个中间件的使用不用再引入一长串 JAR 包依赖,而只需要一个 starter 依赖,将中间件当作可独立插拔的插件;starter 依赖负责传递中间件需要的 JAR 包依赖。中间件 starter 版本与 SOFABoot 版本关联,并且保证这些中间件 starter 版本的传递依赖经过严格测试是互相兼容的。不过 SOFABoot 的依赖管理依然是弱管理,如果用户想要指定某个 JAR 包的版本,那么也可以覆盖 starter 中配置的版本。SOFABoot 支持 Maven 和 Gradle 的依赖配置方式。

6 日志隔离

SOFABoot 通过 sofa-common-tools 集成了日志空间的隔离能力,框架自动发现应用中的日志实现,避免中间件和应用日志实现的绑定。二方包或者引入的中间件面向日志编程接口 SLF4J 去编程,具体的日志实现交给 SOFABoot 应用开发者去选择;同时二方包或者中间件针对每一个日志实现提供配置以输出日志到相对固定目录下的文件。应用选择的日志实现,框架都能够自动感知并选择相应的配置文件日志输出。

7 应用类隔离

SOFABoot 通过 SOFAArk 提供类隔离能力和应用合并部署能力。SOFAArk 使用隔离的类加载模型,运行时底层插件、业务应用之间均相互隔离,单一插件和应用由不同的 ClassLoader 加载,可以有效避免相互之间的包冲突,提升插件和模块功能复用能力。支持多应用的合并部署,开发阶段将多个应用打包成可执行 Fat Jar,运行时使用 API 或配置中心动态地安装卸载应用。


本文转载自公众号金融级分布式架构(ID:Antfin_SOFA)。


原文链接


https://mp.weixin.qq.com/s/Jj6JLYkNcDBVtj2AEvE0Pg


2020-02-15 10:302927

评论

发布
暂无评论
发现更多内容

Mint Blockchain 2024 年发展路线图和开发计划

NFT Research

区块链 NFT Layer 2

Wireshark使用技巧

小齐写代码

app开发

Geek_8da502

软件测试/测试开发/人工智能丨人工智能是否会取代软件测试工程师

测试人

人工智能 软件测试

云原生之旅:一年的变革、成长与启示

熬夜磕代码、

低多边形植物模型法线贴图

3D建模设计

3D渲染 材质贴图 纹理贴图 材质纹理 材质编辑

如何为3D模型导入材质贴图

3D建模设计

3D渲染 纹理贴图 材质编辑

31 | 深度和广度优先搜索:如何找出社交网络中的三度好友关系

鲁米

Databend 开源周报第 123 期

Databend

2023年度总结——我是如何利用AI高效完成学习与工作任务的

小王撤了

AI

优化大模型的关键策略

百度开发者中心

大模型 深度学习、

落地设备备件按单采购,助力光伏单晶行业数智化管理

用友BIP

光伏单晶行业 数智化管理

入选首个开源贡献世纪榜,TDengine 亮相 FICC 开源计算机系统大会

TDengine

tdengine 时序数据库

深度解读 Cascades 查询优化器

KaiwuDB

KaiwuDB Cascades

人人都能用的AI编程助手 CodeGeeX

凌览

AI 前端 后端 AIGC

功能有更新 | Bonree ONE 权限版本新增环境、资源域、角色概念

博睿数据

浪潮云连续2年跻身中国分布式云市场领导者象限

浪潮云

云计算 数据云

大算力与大模型的融合之力

百度开发者中心

nlp 大模型

新型生成式 AI 助手 Amazon Q 为 IT 专业人士与开发人员提供有力支持(预览版)

亚马逊云科技 (Amazon Web Services)

re:Invent Amazon EC2 生成式人工智能 Amazon Lambda Amazon Chatbot

802.11ac-802.11n-IPQ4019 and IPQ4018: Give your network devices a powerful boost

wifi6-yiyi

802.11ac ipq4029 wifi5

mac专业视觉特效包处理工具 FxFactory pro 8 激活最新版

mac大玩家j

Mac软件 视觉特效插件

注册中心元数据的应用

姚秋实(Nacol)

Java 架构 配置中心 元数据 metadata

3D模型材质丢失怎么办?

3D建模设计

3D渲染 材质贴图 材质编辑

Fine-tuning: 一种针对大模型的优化策略

百度开发者中心

nlp 大模型

2023年终盘点系列| 用友BIP持续迭代,进化发展

用友BIP

如何找到数据资产入表的破局点,听听用友怎么说

用友BIP

数据资产入表

融合事项会计与用友BIP商旅及费控:提升企业运营效率和透明度

用友BIP

商旅费控 事项会计

强大的录屏截图标注工具:CleanShot X激活最新版

胖墩儿不胖y

Mac软件 屏幕截图工具 屏幕录屏软件

用友发布数智化转型成熟度评价体系,加速国有企业转型

用友BIP

企业数智化

上海国家会计学院第六届智能财务高峰论坛成功举办

用友BIP

智能财务

分布式基础概念-消息中间件[RabbitMQ]

派大星

Java 面试题

蚂蚁金服研发框架总览,SOFABoot 框架剖析_研发效能_纶珥_InfoQ精选文章