从一个例子开始体验轻量级类隔离容器 SOFAArk | SOFAChannel#11 直播整理

<SOFA:Channel/>,有趣实用的分布式架构频道。

本文根据 SOFAChannel#11 直播分享整理,主题:从一个例子开始体验轻量级类隔离容器 SOFAArk。
回顾视频以及 PPT 查看地址见文末。欢迎加入直播互动钉钉群:23372465,不错过每场直播。git

SOFAChannel#11

你们好,我是玄北,SOFAArk 开源负责人,今天跟你们分享的主题是《从一个例子开始体验轻量级类隔离容器 SOFAArk》,会跟你们一块儿解读 SOFAArk ,也会讲解一个 Demo 案例,但愿你们能够跟我一块儿实际操做,体验 SOFAArk 具体操做以及功能实现。github

SOFAArk:https://github.com/sofastack/sofa-ark算法

今天的分享将从一下面三个方面展开:编程

  • 初识 SOFAArk;
  • 组件运行时;
  • 动手实践;

今天的重点是最后一个部分的动手实践,前面两部分会跟你们简单介绍一下 SOFAArk 的基础概念,但愿在最后一个实践部分,你们能够跟着我一块儿经过 Demo 实际操做体验 SOFAArk,也能够在实践过程当中帮助你们更好得了解前面介绍到的概念。api

1、初识 SOFAArk

如今咱们就开始了解 SOFAArk,在实践以前,咱们先来了解一下什么是 SOFAArk。SOFAArk 是蚂蚁金服开源的一款基于 Java 实现的轻量级类隔离容器,欢迎你们关注并 Star SOFAArk。缓存

SOFAArk:https://github.com/sofastack/sofa-ark架构

在大型软件开发过程当中,一般会推荐底层功能插件化,业务功能模块化的开发模式,以期达到低耦合、高内聚、功能复用的优势。基于此,SOFAArk 提供了一套较为规范化的插件化、模块化的开发方案。产品能力主要包括:app

  • 定义类加载模型,运行时底层插件、业务应用(模块)之间均相互隔离,单一插件和应用(模块)由不一样的 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 包:maven

SOFAArk 三要素

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 包目录结构

Ark Biz 包目录格式

介绍完 Ark 包的目录格式,接下来介绍 Ark Biz 包的格式:

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 加载。

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 的类。

Ark 包运行时结构

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 的另外一个能力,即组件运行时能力。

2、组件运行时

组件运行时提供了一种能力,它可以在不重启应用的前提下,经过动态安装、卸载、切换 Biz 模块,实现修改应用运行方式的目的。下图展现了组件运行时的运行时结构,整个运行时结构与上文的 Ark 包运行时结构很类似,不一样的是咱们扩展了 Ark Biz 的类型,在组件运行时结构中,Ark Biz 有两种类型,分别是 Master App Biz 和 Dynamic Biz。 Master App Biz 咱们把他叫作宿主应用,不可动态安装、卸载,Dynamic Biz 就是动态模块,能够在运行时进行动态安装、卸载。

组件运行时

在动态安装、卸载组件的过程当中,SOFAArk 提供了丰富的生命周期管理:

SOFAArk 生命周期管理

安装一个 Biz 主要须要通过:解析模块-注册模块-启动模块-健康检查-切换状态,其中任何一个步骤失败,都会致使 Biz 安装失败。

卸载模块的时候也会有一些流程,首先须要把它切换成 deactivated - 关闭 applicationcontext - 注销 JVM 服务 - 发送卸载事件 - 清楚缓存 - 切换 unresolved。

不一样的模块并非孤岛,模块与模块之间确定须要通讯。下面来介绍一下模块之间是如何通讯的。两个 Ark Biz 之间能够经过 JVM、RPC/Dubbo/Rest、扩展点进行通讯。这样每一个模块能够互相感知其余模块。

幻灯片14.jpeg

例如左边的 Biz 是一个宿主 Biz,右边这个 Biz 是一个动态 Biz,宿主 Biz 去调用动态 Biz 的服务,若是这个动态 Biz 有 bug 须要修复时,咱们能够不重启宿主 Biz,而是经过给他装一个新版本动态 Biz 解决。

3、动手实践

前面带你们快速介绍了 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:

用 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

@陈鑫杰 Q2:

重启应用排序会发生变化吗?

A:能够在 Ark Biz 中指定 priority,保证启动顺序。 

@Tower Q3:

若是是多副本的状况下怎么更新?

A:多副本指的就是集群管理?目前咱们开源了 sofa-dashboard 能够帮助你们进行集群管理。

@祁路 Q4:

Biz 的安装能够经过 Api 吗?

A:sofa-ark 工程中提供 com.alipay.sofa.ark.api.ArkClient 类,用于支持 API 方式安装 Biz。

@盲僧 Q5:

运行期间安装 biz,而后激活模块这一过程作了哪些事情 ,若是这个 biz jar 包放在远程仓库怎么加载里面的代码呢?是拉下来放到本地的一个磁盘用 classloader 去加载使用吗?

A:运行期安装会动态建立一个 ClassLoader 将 Biz 代码加载起来,激活只是在内部修改了模块状态,同一时刻一个模块只能有一个版本是激活态。若是 Biz Jar 在远程仓库,会下载到本地后再用 classloader 加载的。

运行期间安装 biz 后,那个 execute jar 包里会有这个 biz 包吗?

A:不会。

@曾鹏 Q6:

SOFAArk 有什么实际的应用场景吗?

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!

相关文章
相关标签/搜索