轻量级 Java 类隔离容器 SOFAArk

Apache 2.0
Java
跨平台
阿里巴巴
2018-08-15
王练

SOFAArk 是一款基于 Java 实现的轻量级类隔离容器,由蚂蚁金服公司开源贡献;主要为应用程序提供类隔离和依赖包隔离的能力;基于 Fat Jar 技术,应用可以被打包成一个自包含可运行的 Fat Jar,应用既可以是简单的单模块 Java 应用也可以是 Spring Boot 应用。可访问网址进入快速开始并获取更多详细信息。

背景

日常使用 Java 开发,常常会遇到包依赖冲突的问题,尤其当工程应用变得臃肿庞大,包冲突的问题也会变得更加棘手,导致各种各样的报错,例如LinkageError, NoSuchMethodError等;实际开发中,可以采用多种方法来解决包冲突问题,比较常见的是类似 SpringBoot 的做法,统一管理应用所有依赖包的版本,保证这些三方包不存在依赖冲突;这种做法只能有效避免包冲突的问题,不能根本上解决包冲突的问题;如果某个应用的确需要在运行时使用两个相互冲突的包,例如 protobuf2protobuf3,那么类似 SpringBoot 的做法依然解决不了问题;

为了彻底解决包冲突的问题,我们需要借助类隔离机制,使用不同的 Classloader 加载不同版本的三方依赖,进而隔离包冲突问题;OSGI 作为业内最出名的类隔离框架,自然是可以被用于解决上述包冲突问题,但是 OSGI 框架太过臃肿,功能繁杂;为了解决包冲突问题,引入 OSGI 框架,有牛刀杀鸡之嫌,反而使工程变得更加复杂,不利于开发;

SOFAArk 专注于解决类隔离问题,采用轻量级的类隔离方案来解决日常经常遇到的包冲突问题,在蚂蚁金服内部服务于整个 SOFABoot 技术体系,弥补 SpringBoot 没有的类隔离能力。实际上,SOFAArk 是一个通用的轻量级类隔离框架,并不限于 SpringBoot 应用,也可以和其他的 Java 开发框架集成;

原理

SOFAArk 框架包含有三个概念,Ark Container, Ark PluginArk Biz; 运行时逻辑结构图如下:

在介绍这三个概念之前,为了统一术语,有必要先说一下所谓的 Ark 包;Ark 包是满足特定目录格式要求的 Executed Fat Jar,使用官方提供的 Maven 插件 sofa-ark-maven-plugin可以将工程应用打包成一个标准格式的 Ark 包;使用命令 java -jar application.jar即可在 Ark 容器之上启动应用;Ark 包 通常包含 Ark ContainerArk PluginArk Biz;以下我们针对这三个概念简单做下名词解释:

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

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

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

在运行时,Ark Container 优先启动,自动解析 classpath 包含的 Ark PluginArk Biz,并读取他们的配置,构建类加载索引关系;然后使用独立的 Classloader 加载他们并按优先级配置依次启动;需要指出的是,Ark Plugin 优先 Ark Biz被加载启动;Ark Plugin 之间是双向类索引关系,即可以相互委托对方加载所需的类;Ark PluginArk Biz 是单向类索引关系,即只允许 Ark Biz 索引 Ark Plugin 加载的类,反之则不允许。

场景

SOFAArk初衷是为了解决包冲突问题,那什么情况下可以使用 SOFAArk 以及如何使用呢? 假设如下场景,如果工程需要引入两个三方包:A 和 B,但是 A 需要依赖版本号为 0.1 的 C 包,而恰好 B 需要依赖版本号为 0.2 的 C 包,且 C 包的这两个版本无法兼容:

此时,即可使用 SOFAArk 解决该依赖冲突问题;只需要把 A 和版本为 0.1 的 C 包一起打包成一个 Ark Plugin,然后让应用工程引入该插件依赖即可。

的码云指数为
超过 的项目
加载中

评论(1)

cabbage89
cabbage89
JAVA这方面差.net不是一丁点

暂无资讯

8
回答
SOFA:十年锤炼自研架构,拥抱开源共建

SOFA(Scalable Open Financial Architecture)是蚂蚁金服研发的金融级分布式中间件,很多人认为这个国产自主研发项目来势...

2018/09/12 15:49

没有更多内容

加载失败,请刷新页面

没有更多内容

蚂蚁开源 | 在 Spring Boot 中集成 SOFABoot 类隔离能力

SOFABoot 是蚂蚁金服中间件团队开源的基于 Spring Boot 的一个开发框架,其在 Spring Boot 基础能力之上,增加了类隔离能力。蚂蚁金服内部丰富的实践场景表明,类隔离能力对解决类冲突、版本...

2018/08/16 12:22
8
0
2018年阿里巴巴开源的那些牛逼java项目汇总

把阿里巴巴的一些重要的开源项目进行整理,希望对大家有所帮助。(以下项目排名不分先后) 1.分布式应用服务开发的一站式解决方案 Spring Cloud Alibaba Spring Cloud Alibaba 致力于提供分布...

02/15 17:40
8
0
蚂蚁金服微服务实践|开源中国年终盛典分享实录

章耿,花名余淮,蚂蚁金服高级技术专家。目前在蚂蚁金服中间件服务与框架组负责应用框架与SOFAStack相关的工作。本文根据余淮在 2018 开源中国年终盛典的演讲内容整理,完整的分享 PPT 获取方...

01/30 10:09
11
0
这就是巨人的肩膀!2018年阿里巴巴开源的那些牛逼项目汇总

导读: 开源展示了人类共同协作,成果分享的魅力,每一次技术发展都是站在巨人的肩膀上,技术诸多创新和发展往往就是基于开源发展起来的,没有任何一家网络公司可以不使用开源技术,仅靠自身...

2018/12/21 16:21
61
0
2018年阿里巴巴重要开源项目汇总(持续更新中)

摘要: 云栖社区特在2018年年末,将阿里巴巴的一些重要的开源项目进行整理,希望对大家有所帮助。 开源展示了人类共同协作,成果分享的魅力,每一次技术发展都是站在巨人的肩膀上,技术诸多创...

2018/12/12 11:34
89
0

没有更多内容

加载失败,请刷新页面

没有更多内容

返回顶部
顶部