<SOFA:Channel/>,有趣实用的分布式架构频道。本文根据 SOFAChannel#11 直播分享整理,主题:从一个例子开始体验轻量级类隔离容器 SOFAArk。
回顾视频以及 PPT 查看地址见文末。欢迎加入直播互动钉钉群:23372465,不错过每场直播。git
你们好,我是玄北,SOFAArk 开源负责人,今天跟你们分享的主题是《从一个例子开始体验轻量级类隔离容器 SOFAArk》,会跟你们一块儿解读 SOFAArk ,也会讲解一个 Demo 案例,但愿你们能够跟我一块儿实际操做,体验 SOFAArk 具体操做以及功能实现。github
SOFAArk:https://github.com/sofastack/sofa-ark算法
今天的分享将从一下面三个方面展开:编程
今天的重点是最后一个部分的动手实践,前面两部分会跟你们简单介绍一下 SOFAArk 的基础概念,但愿在最后一个实践部分,你们能够跟着我一块儿经过 Demo 实际操做体验 SOFAArk,也能够在实践过程当中帮助你们更好得了解前面介绍到的概念。api
如今咱们就开始了解 SOFAArk,在实践以前,咱们先来了解一下什么是 SOFAArk。SOFAArk 是蚂蚁金服开源的一款基于 Java 实现的轻量级类隔离容器,欢迎你们关注并 Star SOFAArk。缓存
SOFAArk:https://github.com/sofastack/sofa-ark架构
在大型软件开发过程当中,一般会推荐底层功能插件化,业务功能模块化的开发模式,以期达到低耦合、高内聚、功能复用的优势。基于此,SOFAArk 提供了一套较为规范化的插件化、模块化的开发方案。产品能力主要包括:app
SOFAArk 能够帮助解决依赖包冲突、多应用(模块)合并部署等场景问题。框架
SOFAArk 中有三个最主要的概念,分别是 Ark 包、Ark Biz 包、Ark Plugin 包:maven
Ark 包:相似 Spring Boot 的打包产物,是一个 Fat Jar,即应用交付终态,一个 Ark 包,能够经过 Java-jar 的方式把它运行起来。
Ark Biz 包: 简称 Biz,是组件的交付终态,你们经过名字也能够理解,里面主要封装了一些业务逻辑。
Ark Plugin 包: 简称 Plugin,提供把非业务基础组件下沉的能力,好比 RPC、消息等。
接下来按照上述三个的顺序,咱们来看一下这三个包里主要是什么。
下图是 Ark 包的目录结构,Ark 包下有 Biz 目录,Container 目录,Plugin 目录,Biz 目录中就是一个一个的 Ark Biz,Plugin 目录保存了全部的 Ark Plugin,Container 是 Ark 容器,Ark 容器会负责启动 Ark Plugin 及 Ark Biz。
介绍完 Ark 包的目录格式,接下来介绍 Ark Biz 包的格式:
在 Ark Biz 包的目录格式里一样有几个比较关键的目录格式,分别是:
接下来跟你们介绍 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
https://tech.antfin.com/community/live/1076
用 SOFAArk 的话,能直接集成到 SOFABoot 工程不?仍是说必需要建个 SOFAArk 的工程?SOFAArk 能够运用于非 SOFABoot 的项目么?
A: 能直接集成到 SOFABoot 工程,不须要新建 SOFAArk 工程,也能够用于非 SOFABoot 工程,只要是 Spring Boot 工程便可,可是不引入 SOFA 相关依赖的话,@SofaService 及 @SofaReference 等注解就无法用了。
宿主包刚开始是指定的1.0版本,若是我线上我已经升到2.0的版本,万一线上机器挂掉重启,那个人算法都变了吧,就有问题。
A:这个须要进行一些集群管理,重启的时候自动安装模块,目前咱们开源了 sofa-dashboard 能够帮助你们进行集群管理。
SOFADashboard:https://github.com/sofastack/sofa-dashboard
重启应用排序会发生变化吗?
A:能够在 Ark Biz 中指定 priority,保证启动顺序。
若是是多副本的状况下怎么更新?
A:多副本指的就是集群管理?目前咱们开源了 sofa-dashboard 能够帮助你们进行集群管理。
Biz 的安装能够经过 Api 吗?
A:sofa-ark 工程中提供 com.alipay.sofa.ark.api.ArkClient 类,用于支持 API 方式安装 Biz。
运行期间安装 biz,而后激活模块这一过程作了哪些事情 ,若是这个 biz jar 包放在远程仓库怎么加载里面的代码呢?是拉下来放到本地的一个磁盘用 classloader 去加载使用吗?
A:运行期安装会动态建立一个 ClassLoader 将 Biz 代码加载起来,激活只是在内部修改了模块状态,同一时刻一个模块只能有一个版本是激活态。若是 Biz Jar 在远程仓库,会下载到本地后再用 classloader 加载的。
运行期间安装 biz 后,那个 execute jar 包里会有这个 biz 包吗?
A:不会。
SOFAArk 有什么实际的应用场景吗?
A:能够看下这个:https://mp.weixin.qq.com/s/PmB72OB3iALsyqRJztbpWA
同时,咱们开启了《剖析 | SOFAArk 源码》系列,会逐步详细介绍各个部分的代码设计和实现,预计按照以下的目录进行:
欢迎参与共建,在【金融级分布式架构】公众号后台回复【想认领的文章名称】,咱们将会主动联系你,确认资质后,便可加入,It's your show time!