当前位置: 首页 > 软件库 > 云计算 > PaaS系统/容器 >

SOFAArk

轻量级 Java 类隔离容器
授权协议 Apache 2.0
开发语言 Java
所属分类 云计算、 PaaS系统/容器
软件类型 开源软件
地区 国产
投 递 者 岳安福
操作系统 跨平台
开源组织 蚂蚁金服
适用人群 未知
 软件概览

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,然后让应用工程引入该插件依赖即可。

  • 一.使用方法及示例 简介:当引入二方依赖包或三方依赖包时,可能出现外部依赖jar包与自己的工程需要依赖的冲突,或者多个二方三方依赖包互相冲突。这时候就需要一个隔离容器对他们进行隔离,其依赖的原理就是jvm认为不同classloader加载的类即使包名类名相同,也认为他们是不同的。sofa-ark将需要隔离的jar包打成plugin,对每个plugin都用独立的classloader去加载。 (温馨

  • 本篇主要来看下蚂蚁金服开源的 SOFAArk 这个产品。SOFAArk 是一款基于 Java 实现的轻量级类隔离容器,主要提供类隔离和应用(模块)合并部署能力;本文主要基于 telnet 指令的方式进行应用 Biz 的装载和卸载操作。去年在上海 KubeCon 大会上有分享过 《SOFABoot 动态模块实践》,主要是通过 SOFADashboard 来下发指令的,基于 SOFABoot 3.1.

  • 1:博主最近接触了支付宝开源的sofa框架,支付宝开源的项目地址在 在接触当中,使用到我个人的项目中。本人项目中使用到sofa多模块的方式,sofa的多模块,与普通多模块最大的区别是,sofa多模块住提现每个每个模块都是独立的spring上下文,我个人比较喜欢这样的方式,因为这样在多个团队维护项目过程中,不必关系其他团队的修改代码,引入其他jar包导致我的模块出现问题。A模块中想要调用B模块内容,

 相关资料
  • 问题内容: 考虑一下我正在使用的一些代码的简化视图: 我已经在类级别设置了注释。我理解这意味着必须在提供的事务中调用诸如之类的所有方法。在这种情况下,我们正在使用容器管理的事务。 在根本不被用于或…既没有类,也没有方法的水平。我明白这意味着并会为双方提供的事务中进行操作。 但是,我严重错过了 某些东西 !如代码注释所示,… 将数据写入数据库,然后读取该数据作为其操作的一部分。由于所有这些都在同一个

  • 问题内容: 题 我正在寻找Java内存对象缓存API。有什么建议吗?您过去使用过什么解决方案? 当前 现在,我只是在使用地图: 要求 我需要扩展缓存以包括以下基本功能: 最大尺寸 生存时间 但是,我不需要更复杂的功能,例如: 来自多个进程的访问(缓存服务器) 持久性(到磁盘) 意见建议 内存中缓存: Guava CacheBuilder-活动开发。请参阅此演示文稿。 LRUMap-通过API配置。

  • 问题内容: 在解决了另一个愚蠢的日食问题之后,我想尝试获得尽可能轻巧,最小的Eclipse安装。 为了清楚起见,我使用eclipse做两件事: 编辑Java 调试Java 我通过Emacs / Zsh完成的所有其他工作(编辑JSP / XML / JS,文件管理,SVN签入等)。我还没有发现在Eclipse中进行工作以使这些任务高效甚至可靠的任何方面,因此我不希望与之相关的插件。 在eclipse

  • 问题内容: 编写新的工作流引擎还是使用现有的BPM引擎更好吗:jBPM 5,Activiti 5? 我的应用程序是基于Web的应用程序,性能非常重要。我的疑问是,与编写简单的工作流引擎相比,使用jBPM / Activiti是否会增加性能开销。 如果我采用自我实现,我会错过工作流程的可视化。为了性能,可以进行交易。 问题答案: 这确实取决于您的要求。首先,查看您是否真的需要工作流引擎(此资源或其他

  • 问题内容: 我想将隔离级别设置为。如何使用gorm orm for postgres实现此目的。 示例代码: 问题答案: 我在这里有完全一样的问题: 和pg完全一样。

  • SOFABoot 提供了类隔离框架 SOFAArk, 弥补了 Spring Boot 在类隔离能力上的缺失,用以解决在实际开发中常见的类冲突、包冲突问题,详细请参考 SOFAArk。 在 SOFABoot 工程中使用类隔离能力,只需两步操作;配置 sofa-ark-maven-plugin 打包插件以及引入 sofa-ark-springboot-starter 类隔离框架依赖; 配置 Maven