# SOFAArk Project
[![Build Status](https://travis-ci.org/sofastack/sofa-ark.svg?branch=master)](https://travis-ci.org/sofastack/sofa-ark)
[![Coverage Status](https://codecov.io/gh/sofastack/sofa-ark/branch/master/graph/badge.svg)](https://codecov.io/gh/sofastack/sofa-ark/branch/master/graph/badge.svg)
[![Gitter](https://img.shields.io/badge/chat-on%20gitter-orange.svg)](https://gitter.im/sofa-ark/Lobby)
![license](https://img.shields.io/badge/license-Apache--2.0-green.svg)
![maven](https://img.shields.io/nexus/r/https/oss.sonatype.org/com.alipay.sofa/sofa-ark-all.svg)
SOFAArk 是一款基于 Java 实现的动态热部署和轻量级类隔离框架,由蚂蚁集团开源贡献,主要提供应用模块的动态热部署和类隔离能力。基于 [Fat Jar](https://docs.spring.io/spring-boot/docs/current/reference/html/executable-jar.html#executable-jar-jar-file-structure) 技术,可以将多个应用模块打包成一个自包含可运行的 Fat Jar,应用既可以是简单的单模块 Java 应用也可以是 SpringBoot/SOFABoot 应用。[访问网址](https://www.sofastack.tech/sofa-boot/docs/sofa-ark-readme?lang=zh-cn)进入快速开始并获取更多详细信息。
## 背景
SOFAArk 最初的场景是解决 Java 开发常常会遇到的包依赖冲突的问题,尤其当工程应用变得臃肿庞大,包冲突的问题也会变得更加棘手,导致各种各样的报错,例如`LinkageError`, `NoSuchMethodError`等。实际开发中,可以采用多种方法来解决包冲突问题,比较常见的是类似 SpringBoot 的做法,统一管理应用所有依赖包的版本,保证这些三方包不存在依赖冲突。这种做法只能有效避免包冲突的问题,不能根本上解决包冲突的问题。如果某个应用的确需要在运行时使用两个相互冲突的包,例如 `protobuf2` 和 `protobuf3`,那么类似 SpringBoot 的做法依然解决不了问题。
为了彻底解决包冲突的问题,我们需要借助类隔离机制,使用不同的 ClassLoader 加载不同版本的三方依赖,进而隔离包冲突问题。OSGI 作为业内最出名的类隔离框架,自然是可以被用于解决上述包冲突问题,但是 OSGI 框架太过臃肿,功能繁杂。为了解决包冲突问题,引入 OSGI 框架,有牛刀杀鸡之嫌,反而使工程变得更加复杂,不利于开发。
SOFAArk 则采用较为轻量级的类隔离方案来解决日常经常遇到的包冲突问题,在蚂蚁金服内部服务于整个 [SOFABoot](https://github.com/sofastack/sofa-boot) 技术体系,弥补 SpringBoot 没有的类隔离能力。实际上,SOFAArk 是一个通用的轻量级类隔离框架,并不限于 SpringBoot 应用,也可以和其他的 Java 开发框架集成。
基于类隔离能力 SOFAArk 还提供了动态热部署能力。SOFAArk 不但支持将多个应用合并打成一个可执行的 Fat Jar 包,也支持运行时通过 API 或者 Zookeeper 动态推送配置达到动态部署应用模块的能力。在多团队协作开发时,各个功能模块由不同的团队负责开发,通常情况下,这些功能模块独立开发,但是运行时部署在一起。借助 SOFAArk 提供的合并部署能力,各团队开发时拥有相当大自由度,只需要定义各模块之间的交互接口即可,尤其对于中台应用开发,提高团队合作效率。除了合并部署,SOFAArk 还对接了 Zookeeper 接受动态配置,控制应用模块的动态安装和卸载。
## 原理
SOFAArk 框架包含有三个概念,`Ark Container`, `Ark Plugin` 和 `Ark Biz`; 运行时逻辑结构图如下:
![framework](resource/SOFA-Ark-Framework.png)
在介绍这三个概念之前,为了统一术语,有必要先说一下所谓的 `Ark 包`;Ark 包是满足特定目录格式要求的 `Executed Fat Jar`,使用官方提供的 `Maven` 插件 `sofa-ark-maven-plugin`可以将工程应用打包成一个标准格式的 `Ark 包`;使用命令 `java -jar application.jar`即可在 Ark 容器之上启动应用;`Ark 包` 通常包含 `Ark Container`、`Ark Plugin`、 `Ark Biz`;以下我们针对这三个概念简单做下名词解释:
+ `Ark Container`: Ark 容器,负责整个运行时的管理;`Ark Plugin` 和 `Ark Biz` 运行在 Ark 容器之上;容器具备管理多插件、多应用的功能;容器启动成功后,会自动解析 classpath 包含的 `Ark Plugin` 和 `Ark Biz` 依赖,完成隔离加载并按优先级依次启动之;
+ `Ark Plugin`: Ark 插件,满足特定目录格式要求的 `Fat Jar`,使用官方提供的 `Maven` 插件 `sofa-ark-plugin-maven-plugin` 可以将一个或多个普通的 `Java Jar` 包打包成一个标准格式的 `Ark Plugin`; `Ark Plugin` 会包含一份配置文件,通常包括插件类导入导出配置、插件启动优先级等;运行时,Ark 容器会使用独立的 `PluginClassLoader` 加载插件,并根据插件配置构建类加载索引表,从而使插件与插件、插件与应用之间相互隔离;
+ `Ark Biz`: Ark 业务模块,满足特定目录格式要求的 `Fat Jar` ,使用官方提供的 `Maven` 插件 `sofa-ark-maven-plugin` 可以将工程应用打包成一个标准格式的 `Ark-Biz` 包;是工程应用模块及其依赖包的组织单元,包含应用启动所需的所有依赖和配置;
在运行时,`Ark Container` 优先启动,自动解析 classpath 包含的 `Ark Plugin` 和 `Ark Biz`,并读取他们的配置,构建类加载索引关系;然后使用独立的 ClassLoader 加载他们并按优先级配置依次启动;需要指出的是,`Ark Plugin` 优先 `Ark Biz` 被加载启动;`Ark Plugin` 之间是双向类索引关系,即可以相互委托对方加载所需的类;`Ark Plugin` 和 `Ark Biz` 是单向类索引关系,即只允许 `Ark Biz` 索引 `Ark Plugin` 加载的类,反之则不允许。
## 场景
### 包冲突
SOFAArk初衷是为了解决包冲突问题,那什么情况下可以使用 SOFAArk 以及如何使用呢? 假设如下场景,如果工程需要引入两个三方包:A 和 B,但是 A 需要依赖版本号为 0.1 的 C 包,而恰好 B 需要依赖版本号为 0.2 的 C 包,且 C 包的这两个版本无法兼容:
![conflict](resource/SOFA-Ark-Conflict.png)
此时,即可使用 SOFAArk 解决该依赖冲突问题;只需要把 A 和版本为 0.1 的 C 包一起打包成一个 `Ark Plugin`,然后让应用工程引入该插件依赖即可;
### 合并部署
SOFAArk 基于类隔离能力,实现了应用的合并部署,可以简单分为静态合并部署和动态合并部署,介绍如下。
#### 静态合并部署
在实际开发过程中,经常会出现多个团队合作开发同一款产品,他们各自负责不同的功能模块,这些功能模块通常可以独立开发,但是运行时需要作为一个整体的应用运行。在这种情况下,所有团队需要协商统一技术栈及各自的二方包版本,这无疑增加了开发和联调的成本。为了让开发人员专注自身功能业务的开发,理想情况下开发人员希望能像开发独立应用一样,仅定义好对外交互接口,而不用考虑和其他功能模块出现的版本冲突、技术栈不统一等问题。正是基于这种场景,SOFAArk 提供了静态合并部署能力,应用可以依赖其他应用打成的 Biz 包,而当自身被打成 Ark 包时,可以将其他应用 Biz 包一并打入,启动时,则会根据优先级依次启动各应用。由于每个应用使用独立的 BizClassLoader 加载,因此不需要考虑依赖冲突或者技术栈不统一问题。应用之间则通过 `SofaService/SofaReference` JVM 服务进行交互。
#### 动态合并部署
动态合并部署区别于静态合并部署最大的一点是,在应用运行时可以通过 API 或者配置中心(Zookeeper)来控制应用的部署和卸载。动态合并部署的设计理念图如下:
![life-a
没有合适的资源?快使用搜索试试~ 我知道了~
SOFAArk Project Java轻量级类隔离框架.rar
共453个文件
java:342个
xml:43个
jar:28个
需积分: 5 0 下载量 83 浏览量
2023-07-11
22:03:41
上传
评论
收藏 64.88MB RAR 举报
温馨提示
开源之夏是由“开源软件供应链点亮计划”发起并长期支持的一项暑期开源活动,旨在鼓励在校学生积极参与开源软件的开发维护,促进优秀开源软件社区的蓬勃发展,培养和发掘更多优秀的开发者。 活动联合国内外各大开源社区,针对重要开源软件的开发与维护提供项目任务,并面向全球高校学生开放报名。 2023 年,SOFAStack 社区再次加入中国科学院软件研究所的高校开源活动——“开源之夏 2023”,一共为大家准备了五个任务,涵盖 SOFARPC、SOFAArk、SOFAJRaft 和 Layotto 等核心项目,涉及 Golang、Java、Kubernetes、Cloud Native、Distributed System 等多个领域。 SOFARPC 项目介绍 SOFARPC 是由蚂蚁集团开源的一款 Java RPC 框架,具有高可扩展性、高性能和生产级特性。该框架旨在简化应用之间的 RPC 调用,并为应用提供便捷透明、稳定高效的点对点远程服务调用方案。为方便用户和开发者进行功能扩展,SOFARPC 提供了丰富的模型抽象和可扩展接口,包括过滤器、路由、负载均衡等。
资源推荐
资源详情
资源评论
收起资源包目录
SOFAArk Project Java轻量级类隔离框架.rar (453个子文件)
com.alipay.sofa.ark.common.guice.AbstractArkGuiceModule 51B
SampleClass.class 258B
SampleClass.class 258B
com.alipay.sofa.ark.spi.service.classloader.ClassLoaderHook 158B
spring.factories 369B
spring.factories 133B
spring.factories 133B
.gitignore 75B
HEADER 755B
org.testng.ITestNGListener 132B
static-combine-springboot-executable.jar 43.6MB
sample-springboot-fat-biz.jar 29.64MB
profile-test.jar 13.44MB
sample-ark-3.0.0-ark-biz.jar 3.97MB
junit-4.12.jar 308KB
static-combine-demo.jar 277KB
sample-ark-plugin-0.5.0.jar 86KB
sample-ark-plugin.jar 86KB
sample-ark-plugin-0.5.0.jar 86KB
sample-biz-withjar.jar 52KB
sample-biz.jar 7KB
sample-biz-0.3.0.jar 7KB
sample-biz.jar 7KB
sample-biz.jar 7KB
sample-biz-0.3.0.jar 7KB
test-jar.jar 7KB
com.springsource.org.aopalliance-1.0.0.jar 5KB
com.springsource.org.aopalliance-1.0.0.jar 5KB
aopalliance-1.0.jar 4KB
aopalliance-1.0.jar 4KB
sample-ark-2.0.0-ark-biz.jar 3KB
sample-ark-2.0.1-ark-biz.jar 3KB
sample-ark-1.0.0-ark-biz.jar 3KB
sample-ark-1.0.0-ark-biz.jar 3KB
test.jar 2KB
test-demo.jar 2KB
sample-plugin.jar 2KB
test 2.jar 0B
AbstractClasspathClassLoader.java 25KB
RepackageMojo.java 24KB
Repackager.java 24KB
BizClassLoaderTest.java 20KB
PluginClassLoaderTest.java 17KB
BizModel.java 16KB
ArkPluginMojo.java 16KB
ServiceRegistrationTest.java 15KB
OperationTransformer.java 15KB
ArkClient.java 15KB
BizCommandProvider.java 15KB
JarFile.java 14KB
JarWriter.java 14KB
Constants.java 14KB
ClassLoaderServiceImpl.java 14KB
ArkTomcatServletWebServerFactory.java 13KB
JarURLConnection.java 13KB
OperationTransformerTest.java 13KB
ZookeeperConfigActivator.java 13KB
ClasspathLauncher.java 12KB
Handler.java 12KB
ArkTomcatWebServer.java 12KB
ArkContainer.java 11KB
PluginFactoryServiceImpl.java 11KB
EventTest.java 11KB
JarFileEntries.java 11KB
HandleArchiveStage.java 11KB
MainClassFinder.java 11KB
PluginModel.java 10KB
PluginCommandProvider.java 10KB
DefaultClassLoaderHookTest.java 10KB
ArkClientTest.java 9KB
JarUtils.java 9KB
BizClassLoader.java 9KB
BizCommandProviderTest.java 9KB
ExtensionLoaderServiceImpl.java 9KB
ClassLoaderServiceTest.java 9KB
BizFactoryServiceImpl.java 9KB
RandomAccessDataFile.java 9KB
BizManagerServiceImpl.java 8KB
ArkLogger.java 8KB
ExplodedArchive.java 7KB
PluginClassLoader.java 7KB
AsciiBytes.java 7KB
JarFileArchive.java 7KB
EventAdminServiceImpl.java 7KB
HandleArchiveTest.java 7KB
AbstractLauncher.java 7KB
CentralDirectoryFileHeader.java 7KB
LaunchCommand.java 6KB
ClasspathLauncherTest.java 6KB
ClassLoaderHookTest.java 6KB
ArtifactItem.java 6KB
PluginCommandProviderTest.java 6KB
BizManagerServiceTest.java 6KB
RegistryServiceImpl.java 6KB
ArkServiceContainer.java 6KB
JGitParser.java 6KB
BaseTest.java 6KB
FileUtils.java 6KB
RepackageMojoTest.java 6KB
ArkTomcatEmbeddedWebappClassLoader.java 6KB
共 453 条
- 1
- 2
- 3
- 4
- 5
资源评论
野生的大熊
- 粉丝: 229
- 资源: 247
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功