大家好,我是玄北,SOFAArk 开源负责人,今天跟大家分享的主题是《从一个例子开始体验轻量级类隔离容器 SOFAArk》,会跟大家一起解读 SOFAArk ,也会讲解一个 Demo 案例,希望大家可以跟我一起实际操作,体验 SOFAArk 具体操作以及功能实现。
SOFAArk:https://github.com/sofastack/sofa-ark
今天的分享将从一下面三个方面展开:
- 初识 SOFAArk;
- 组件运行时;
- 动手实践;
今天的重点是最后一个部分的动手实践,前面两部分会跟大家简单介绍一下 SOFAArk 的基础概念,希望在最后一个实践部分,大家可以跟着我一起通过 Demo 实际操作体验 SOFAArk,也可以在实践过程中帮助大家更好得了解前面介绍到的概念。
一、初识 SOFAArk
现在我们就开始了解 SOFAArk,在实践之前,我们先来了解一下什么是 SOFAArk。SOFAArk 是蚂蚁金服开源的一款基于 Java 实现的轻量级类隔离容器,欢迎大家关注并 Star SOFAArk。
SOFAArk:https://github.com/sofastack/sofa-ark
在大型软件开发过程中,通常会推荐底层功能插件化,业务功能模块化的开发模式,以期达到低耦合、高内聚、功能复用的优点。基于此,SOFAArk 提供了一套较为规范化的插件化、模块化的开发方案。产品能力主要包括:
- 定义类加载模型,运行时底层插件、业务应用(模块)之间均相互隔离,单一插件和应用(模块)由不同的 ClassLoader 加载,可以有效避免相互之间的包冲突,提升插件和模块功能复用能力;
- 定义插件开发规范,提供 maven 打包工具,简单快速将多个二方包打包成插件(Ark Plugin,以下简称 Plugin);
- 定义模块开发规范,提供 maven 打包工具,简单快速将应用打包成模块 (Ark Biz,以下简称 Biz);
- 针对 Plugin、Biz 提供标准的编程界面,包括服务、事件、扩展点等机制;
- 支持多 Biz 的合并部署,开发阶段将多个 Biz 打包成可执行 Fat Jar,或者运行时使用 API 或配置中心(Zookeeper)动态地安装卸载 Biz;
SOFAArk 可以帮助解决依赖包冲突、多应用(模块)合并部署等场景问题。
SOFAArk 中有三个最主要的概念,分别是 Ark 包、Ark Biz 包、Ark Plugin 包:
Ark 包:类似 Spring Boot 的打包产物,是一个 Fat Jar,即应用交付终态,一个 Ark 包,可以通过 Java-jar 的方式把它运行起来。
Ark Biz 包: 简称 Biz,是组件的交付终态,大家通过名字也可以理解,里面主要封装了一些业务逻辑。
Ark Plugin 包: 简称 Plugin,提供把非业务基础组件下沉的能力,比如 RPC、消息等。
接下来按照上述三个的顺序,我们来看一下这三个包里主要是什么。
Ark 包目录结构
下图是 Ark 包的目录结构,Ark 包下有 Biz 目录,Container 目录,Plugin 目录,Biz 目录中就是一个一个的 Ark Biz,Plugin 目录保存了所有的 Ark Plugin,Container 是 Ark 容器,Ark 容器会负责启动 Ark Plugin 及 Ark Biz。
Ark Biz 包目录格式
介绍完 Ark 包的目录格式,接下来介绍 Ark Biz 包的格式:
在 Ark Biz 包的目录格式里同样有几个比较关键的目录格式,分别是:
- application.properties:标准 Spring Boot/SOFABoot 工程配置文件;
- lib 目录:应用依赖目录;
- META-INF/MANIFEST:Biz 配置文件。
Ark Plugin 包目录结构
接下来跟大家介绍 Ark Plugin 包,Ark Plugin 包的目录结构与 Ark Biz 包的目录结构类似,但是 Ark Plugin 包的 META-INF/MANIFEST.MF 文件会比 Ark Biz 包复杂一点,Ark Plugin 支持在 META-INF/MANIFEST.MF 文件中定义 Import package、Export package、Import classes 以及 Export classes 等属性,这些属性支持 Plugin ClassLoader 在加载类或者资源文件时可以委托给其他 Plugin 加载。
上文介绍了 Ark 包、Ark Biz 包、Ark Plugin 包的目录结构,接下来我们介绍下 Ark 包运行时的整个运行时结构。通过下面这张图我们可以看到,在整个运行时,Ark 包分为三层,底层是 Ark Container,中间层是 Ark Plugin,上层是 Ark Biz。Ark Container 负责启动所有 Ark Plugin 及 Ark Biz,Ark Plugin 支持类导入导出能力,所以 Ark Plugin 之间有双向箭头相互委托。为了简化 Ark Biz 的使用,Ark Biz 不支持导入导出类,Ark Biz默认会导入所有 Ark Plugin 的类。
SOFAArk 的不同 Plugin 相互委托类加载的能力可以帮助我们解决一个文件场景,那就是依赖冲突:
以上图的场景为例,有一个 Project,依赖了 Dependency A 以及 Dependency B,这两个依赖依赖了不同版本的 Hessian,Dependency A 依赖了 Hessian 3,Dependency B 依赖了 Hessian 4,Hessian 3 与 Hessian 4 是不兼容的,会出现冲突,那么要如何解决这个问题呢?
SOFAArk 就给出了一个解决方案。如果我们的 Dependency A 跟 Dependency B 的 Hessian 依赖有冲突的话,我们可以把 Dependency A 作为一个整体打包成一个 Ark Plugin, Dependency B 作为一个整体打包成一个 Ark Plugin,每个 Ark plugin 都是一个单独的 Classloader,这样 Dependency A 使用的 Hessian 3 和 Dependency B 使用的 Hessian 4 将不再冲突。
解决依赖冲突是 SOFAArk 的一个主要使用场景,但是今天我们不详细介绍这个场景,今天主要介绍 SOFAArk 的另一个能力,即组件运行时能力。
二、组件运行时
组件运行时提供了一种能力,它能够在不重启应用的前提下,通过动态安装、卸载、切换 Biz 模块,实现修改应用运行方式的目的。下图展示了组件运行时的运行时结构,整个运行时结构与上文的 Ark 包运行时结构很相似,不同的是我们扩展了 Ark Biz 的类型,在组件运行时结构中,Ark Biz 有两种类型,分别是 Master App Biz 和 Dynamic Biz。 Master App Biz 我们把他叫做宿主应用,不可动态安装、卸载,Dynamic Biz 就是动态模块,可以在运行时进行动态安装、卸载。
在动态安装、卸载组件的过程中,SOFAArk 提供了丰富的生命周期管理:
安装一个 Biz 主要需要经过:解析模块-注册模块-启动模块-健康检查-切换状态,其中任何一个步骤失败,都会导致 Biz 安装失败。
卸载模块的时候也会有一些流程,首先需要把它切换成 deactivated - 关闭 applicationcontext - 注销 JVM 服务 - 发送卸载事件 - 清楚缓存 - 切换 unresolved。
不同的模块并不是孤岛,模块与模块之间肯定需要通信。下面来介绍一下模块之间是如何通信的。两个 Ark Biz 之间可以通过 JVM、RPC/Dubbo/Rest、扩展点进行通信。这样每个模块可以互相感知其他模块。
例如左边的 Biz 是一个宿主 Biz,右边这个 Biz 是一个动态 Biz,宿主 Biz 去调用动态 Biz 的服务,如果这个动态 Biz 有 bug 需要修复时,我们可以不重启宿主 Biz,而是通过给他装一个新版本动态 Biz 解决。
三、动手实践
前面带大家快速介绍了 SOFAArk 中的基础概念以及组件运行时中的基础概念,接下来我们来动手实践操作一下组件运行时的使用。
这里先介绍一下今天要演示的场景,如上图,Scene 1 中主管觉得现在商品的列表展示毫无规则,需要修改算法,常规来说如果修改算法的话,一般需要重启应用,这样就显得比较繁重。Scene 2 中主管同样觉得需要修改算法,不过此时我们使用了 SOFAArk 的组件运行时能力,可以做到不重启应用修改算法的目的。
最终实现的效果就是在默认情况下,应用启动是如下图这样的排列顺序:
在实践完成之后,我们安装了新的模块之后,它的排序顺序会发生变化,如下图所示:
这就是我们今天主要要实现的效果,接下来我们就进入 Demo 实践,进行一步步操作,带大家更好地了解 SOFAArk 组件运行时。
本期的实验内容是通过 SOFAArk 提供的动态模块能力,实现商品列表排序策略的动态变更。通过在不重启宿主机,不更改应用配置的情况下实现应用行为的改变。
目前我们已经将 Demo 工程上传到 Github,大家可以跟着 README 一步步操作即可看到最终效果。
Demo:https://github.com/caojie09/sofachannel-demo
总结
以上就是我们本期 SOFAChannel 的全部分享内容,本次分享首先带大家快速了解了 SOFAArk 中比较重要的三个基础知识点,分别是 Ark 包、Ark Biz 包以及 Ark Plugin 包。在了解了 SOFAArk 基础知识点之后又带大家熟悉了 SOFAArk 组件运行时概念以及 SOFAArk 组件运行时需要解决的问题。最后通过一个实操例子,帮助大家快速上手 SOFAArk 组件运行时。
有任何问题,欢迎留言或在 Github 上与我们交流。
SOFAArk:https://github.com/sofastack/sofa-ark
本期视频回顾以及 PPT 查看地址
https://tech.antfin.com/community/live/1076
本期直播 QA 回顾
@鸿关 Q1:
A: 能直接集成到 SOFABoot 工程,不需要新建 SOFAArk 工程,也可以用于非 SOFABoot 工程,只要是 Spring Boot 工程即可,但是不引入 SOFA 相关依赖的话,@SofaService 及 @SofaReference 等注解就没法用了。
A:这个需要进行一些集群管理,重启的时候自动安装模块,目前我们开源了 sofa-dashboard 可以帮助大家进行集群管理。
SOFADashboard:https://github.com/sofastack/sofa-dashboard
@陈鑫杰 Q2:
A:可以在 Ark Biz 中指定 priority,保证启动顺序。
@Tower Q3:
A:多副本指的就是集群管理?目前我们开源了 sofa-dashboard 可以帮助大家进行集群管理。
@祁路 Q4:
A:sofa-ark 工程中提供 com.alipay.sofa.ark.api.ArkClient 类,用于支持 API 方式安装 Biz。
@盲僧 Q5:
A:运行期安装会动态创建一个 ClassLoader 将 Biz 代码加载起来,激活只是在内部修改了模块状态,同一时刻一个模块只能有一个版本是激活态。如果 Biz Jar 在远程仓库,会下载到本地后再用 classloader 加载的。
A:不会。
@曾鹏 Q6:
A:可以看下这个:https://mp.weixin.qq.com/s/PmB72OB3iALsyqRJztbpWA
欢迎参与《剖析 | SOFAArk 源码》系列共建
同时,我们开启了《剖析 | SOFAArk 源码》系列,会逐步详细介绍各个部分的代码设计和实现,预计按照如下的目录进行:
- 【已完成】轻量级类隔离框架 SOFAArk 简介
- 【已认领】SOFAArk 容器模型解析
- 【已认领】SOFAArk 类加载模型机制解析
- 【已认领】SOFAArk 合并部署能力解析
- 【已认领】SOFAArk SPI 机制和 ClassLoaderHook 机制解析
- 【待认领】SOFAArk 动态配置机制解析
- 【待认领】SOFAArk maven 打包插件解析
- 【待认领】(实践)SOFAArk 插件化机制解析与实践
领取方式
欢迎参与共建,在公众号后台或者评论区回复【想认领的文章名称】,我们将会主动联系你,确认资质后,即可加入,It's your show time!