解决方案系列-基于 SOFAArk 实现应用的动态装载和卸载

2,267 阅读4分钟

原文链接:解决方案系列-基于 SOFAArk 实现应用的动态装载和卸载

本篇主要来看下蚂蚁金服开源的 SOFAArk 这个产品。SOFAArk 是一款基于 Java 实现的轻量级类隔离容器,主要提供类隔离和应用(模块)合并部署能力;本文主要基于 telnet 指令的方式进行应用 Biz 的装载和卸载操作。去年在上海 KubeCon 大会上有分享过 《SOFABoot 动态模块实践》,主要是通过 SOFADashboard 来下发指令的,基于 SOFABoot 3.1.4 和 SOFAArk 0.6.0 版本;目前 SOFABoot 已经发布到 3.3.x+ ,SOFAARK 1.1.1 版本,其中 ,SOFAARK 提供了很多新的特性,包括全生命周期的事件机制、卸载优化等。

由于 SOFABoot 3.3.0 版本中部分代码的重构,导致无法兼容 runtime plugin,所以本文是基于修复版的 SOFABoot 3.3.0-poc-ark-SNAPSHOT 来完成,案例工程kc-sofastack-dynamic-demo 分支 support-3.3.0

案例描述

先看下官方文档里面对于动态部署的描述,是通过变更/监听 zk 节点数据来实现运维命令的下发和接收:

本篇精简一下,使用 telnet 指令直接进行运维操作;案例描述如下:对于一个运行期的一个应用 A,将另外一个应用 B 动态的装载到 A 上(实际是 A 所在的 Ark 容器上),大体描述如下图所示:

下面两张图是具体的运行结果图:

  • 默认 master 运行、无动态 biz 运行时的运行结果

  • 动态安装 biz 之后运行结果

操作步骤

1、构建 SOFABoot 3.3.0-poc-ark-SNAPSHOT 版本,安装到本地仓库

git clone https://github.com/glmapper/sofa-boot.git
git checkout 3.3.0-poc-ark-SNAPSHOT
mvn clean install -DskipTest

2、下载 kc-sofastack-dynamic-demo 案例工程,打包

git clone https://github.com/sofastack-guides/kc-sofastack-dynamic-demo.git
git checkout support-3.3.0
mvn clean package -DskipTest

3、完成打包之后,案例工程根目录 target 目录下有两个包,dynamic-stock-mng-1.0.0-ark-biz.jardynamic-provider-1.0.0-ark-biz.jardynamic-stock-mng-1.0.0-ark-biz.jar 是 master biz + ark 容器,dynamic-provider-1.0.0-ark-biz.jar 是动态 biz

4、执行 java -jar dynamic-stock-mng-1.0.0-ark-biz.jar,浏览器输入 http://localhost:8080/,运行结果


这里看到的 SUPPORT BY: DEFAULT BIZ 是默认的 BIZ ,也就是 master BIZ

5、通过 telnet 指令安装 动态 biz

telnet localhost 1234
sofa-ark> biz -i file://xxxxx/dynamic-provider-1.0.0-ark-biz.jar #这里的文件路径根据你自己本地实际的包路径修改

通过 biz -a 查看安装结果:

sofa-ark>biz -a
provide:1.0.0:activated
stock-mng:1.0.0:activated
biz count = 2

在次通过浏览器输入 http://localhost:8080/,运行结果

这里 SUPPORT BY 是刚刚安装的 动态 BIZ 所提供的。

原理

来自官网

SOFAArk 包含三个概念,Ark Container, Ark Plugin 和 Ark Biz; 运行时逻辑结构图如下:

概念解释:

  • Ark Container: SOFAArk 容器,负责 Ark 包启动运行时的管理;Ark Plugin 和 Ark Biz 运行在 SOFAArk 容器之上;容器具备管理插件和应用的功能;容器启动成功后,会自动解析 classpath 包含的 Ark Plugin 和 Ark Biz 依赖,完成隔离加载并按优先级依次启动之;

  • Ark Plugin: Ark 插件,满足特定目录格式要求的 Fat Jar,使用官方提供的 Maven 插件 sofa-ark-plugin-maven-plugin 可以将一个或多个普通的 Java jar 打包成一个标准格式的 Ark Plugin;Ark Plugin 会包含一份配置文件,通常包括插件类导入导出配置、资源导入导出配置、插件启动优先级等;运行时,SOFAArk 容器会使用独立的 PluginClassLoader加载插件,并根据插件配置构建类加载索引表、资源加载索引表,使插件和插件之间、插件和应用之间相互隔离;

  • Ark Biz: Ark 应用模块,满足特定目录格式要求的 Fat Jar,使用官方提供的 Maven 插件 sofa-ark-maven-plugin 可以将工程应用打包成一个标准格式的 Ark Biz;Ark Biz 是工程应用以及其依赖包的组织单元,包含应用启动所需的所有依赖和配置;一个 Ark 包中可以包含多个 Ark Biz 包,按优先级依次启动,Biz 之间通过 JVM 服务交互;

运行 Ark 包,Ark Container 优先启动,容器自动解析 Ark 包中含有的 Ark Plugin 和 Ark Biz,并读取他们的配置信息,构建类和资源的加载索引表;然后使用独立的 ClassLoader 加载并按优先级配置依次启动。