灵活的类加载器OSGI

简介

OSGi中的每个模块(称为Bundle)与普通的Java类库区别并不太大,两者一般都以JAR格式进行 封装[2],并且内部存储的都是Java的Package和Class。但是一个Bundle可以声明它所依赖的Package(通 过Import-Package描述),也可以声明它允许导出发布的Package(通过Export-Package描述)。在OSGi 里面,Bundle之间的依赖关系从传统的上层模块依赖底层模块转变为平级模块之间的依赖,而且类库的可见性能得到非常精确的控制,一个模块里只有被Export过的Package才可能被外界访问,其他的 Package和Class将会被隐藏起来。 以上这些静态的模块化特性原本也是OSGi的核心需求之一,不过它和后来出现的Java的模块化系统互相重叠了,所以OSGi现在着重向动态模块化系统的方向发展。

说人话就是OSGI框架,可以对需要加载的类进行精细化的控制,形成一个网状结构,而不是之前的树形的结构。

在今天,通常引入OSGi的主要理由 是基于OSGi架构的程序很可能(只是很可能,并不是一定会,需要考虑热插拔后的内存管理、上下文状态维护问题等复杂因素)会实现模块级的热插拔功能,当程序升级更新或调试除错时,可以只停用、重新安装然后启用程序的其中一部分,这对大型软件、企业级程序开发来说是一个非常有诱惑力的特性,譬如Eclipse中安装、卸载、更新插件而不需要重启动,就使用到了这种特性。

OSGi之所以能有上述诱人的特点,必须要归功于它灵活的类加载器架构。OSGi的Bundle类加载器 之间只有规则,没有固定的委派关系。例如,某个Bundle声明了一个它依赖的Package,如果有其他 Bundle声明了发布这个Package后,那么所有对这个Package的类加载动作都会委派给发布它的Bundle类 加载器去完成。不涉及某个具体的Package时,各个Bundle加载器都是平级的关系,只有具体使用到某 个Package和Class的时候,才会根据Package导入导出定义来构造Bundle间的委派和依赖。 另外,一个Bundle类加载器为其他Bundle提供服务时,会根据Export-Package列表严格控制访问范 围。如果一个类存在于Bundle的类库中但是没有被Export,那么这个Bundle的类加载器能找到这个类, 但不会提供给其他Bundle使用,而且OSGi框架也不会把其他Bundle的类加载请求分配给这个Bundle来 处理。

加载方式从简单的树形变成平面网状

经典类加载结构

OGSI网状导入

在OSGi中,加载器之间的关系不再是双亲委派模型的树形结构,而是已经进一步发展成一种更为复杂的、运行时才能确定的网状结构。这种网状的类加载器架构在带来更优秀的灵活性的同时,也可能会产生许多新的隐患。

类加载时可能进 行的查找规则如下: ·以java.*开头的类,委派给父类加载器加载。

否则,委派列表名单内的类,委派给父类加载器加载。

否则,Import列表中的类,委派给Export这个类的Bundle的类加载器加载。

否则,查找当前Bundle的Classpath,使用自己的类加载器加载。

否则,查找是否在自己的Fragment Bundle中,如果是则委派给Fragment Bundle的类加载器加载。

否则,查找Dynamic Import列表的Bundle,委派给对应Bundle的类加载器加载。

否则,类查找失败。

实现

NBF(New-Retail Business Framework)是阿里巴巴供应链中台的基础技术团队打造的一个技术PaaS平台,—— 新零售服务开放框架NBF提供标准化业务定义 、 快捷服务开发和生态开放的能力,旨在为生态伙伴提供一整套完整的新零售PaaS和SaaS的解决方案。

所谓标准化业务定义,就是比如一个商家从交易到客户签收都会经历,付款,创单,配送,签收等流程。

所谓快捷开发就是只要接入默认实现,就已经拥有了标准流程。

所谓生态开放能力就是,在以上流程中行业对于配送的要求可能不一样,比如大家电需要预约配送时间,低货值的订单可以驿站代签等,只需要在标准定义中扩展即可。

其中就有用到诸如热插拔,中台部门应用与多行业业务bundle独立部署,bundle有问题快速回滚等问题。

当然bundle与中台也会有RPC协议通讯。

因为现在市面上介绍相关技术的资料比较少,基本都是一些大厂自研还没有开源的业界知名的案例,这里就不过多讨论细节了,不过身为工程师我们可以发散思维,如果自己做一套OSGI框架,需要考虑哪些问题,针对自己做的业务,可以做哪些定制化设计。可以加wx公众号一起讨论。

推荐
《深入理解OSGI框架》可惜就在这段时间微信读书下架了,感兴趣可以买实体书来看

灵活的类加载器OSGI相关推荐

  1. 简单了解Tomcat与OSGi的类加载器架构

    前言: 本次博客主要是对Tomcat与OSGi的类加载器架构,所以就需要对tomcat.OSGi以及类加载机制有所了解 类加载可以在http://www.cnblogs.com/ghoster/p/7 ...

  2. OSGi 规范和框架 OSGi框架类加载机制 Java默认类加载器机制和OSGI类加载器机制比较

    一.OSGi 规范 OSGi(Open Service Gateway Initiative) 技术是 Java 动态化模块化系统的一系列规范.OSGi 一方面指维护 OSGi 规范的 OSGi Al ...

  3. 接口多个实现类加载哪个_深入理解JVM虚拟机7:JNDI,OSGI,Tomcat类加载器实现

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutori ...

  4. java类加载器、双亲委派、沙箱安全机制全都让你整明白(三万字,收藏慢慢啃)

    目录 一.概述 1.类加载的分类 2.类加载器的必要性 3.命名空间 4.类加载机制的基本特征 二.类加载器的分类 1.引导类加载器 2.扩展类加载器 3.系统类加载器 4.用户自定义类加载器 三.测 ...

  5. 深入理解Java类加载器:Java类加载原理解析

    http://blog.csdn.net/zhoudaxia/article/details/35824249 1 基本信息 每个开发人员对java.lang.ClassNotFoundExcetpi ...

  6. 【Java类加载机制】深入类加载器(二)自定义加密、解密类加载器

    类加载器原理 将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口. 类加载 ...

  7. 编写递归下降语法分析器_面试BAT必问的JVM,今天我们来说一说它类加载器的底层原理...

    类加载器的关系 类加载器的分类 JVM支持两种类加载器,一种为引导类加载器(Bootstrap ClassLoader),另外一种是自定义类加载器(User Defined ClassLoader) ...

  8. 导出jar插件_利用类加载器解决不兼容的Jar包共存的问题

    问题描述 应用稍复杂一点之后,往往要引入多种不同的中间件,各种第三方jar,这就导致我们往往会遇到jar包冲突的问题,如果冲突的jar包是兼容的,我们需要选择合适的版本,把不合适的版本排除掉,虽然过程 ...

  9. 深入探讨 Java 类加载器

    深入探讨 Java 类加载器 类加载器(class loader)是 Java™中的一个很重要的概念.类加载器负责加载 Java 类的字节代码到 Java 虚拟机中.本文首先详细介绍了 Java 类加 ...

最新文章

  1. Android踩坑日记:Okhttp设置User-Agent你可能没遇到的坑
  2. MySQL服务的启动与停止-使用图形界面工具
  3. python3 一 多线程死锁问题及解决方案
  4. Linux 下第一个shell脚本
  5. FFmpeg AVFMT_NOFILE宏定义剖析
  6. torchvision.transforms
  7. [纯前端]打造自己的ORK管理软件
  8. 过来康康,一起来学VScode插件
  9. Windows7电脑启动时提示文件winload.exe无法验证其数字签名,错误代码0xc0000428的解决方法
  10. 房屋出租系统(java)
  11. STM8L SPI使用过程记录
  12. 【全志T113-S3_100ask】9-音频输入与输出(amixer、aplay、arecord)
  13. 音频基础 - Linein和Micin的区别及使用
  14. CodeForces - 3B Lorry【贪心】
  15. 关于神经网络算法使用场景的思考
  16. MySQL 数据库语句基础
  17. java 动态图表_【动态演示】3个套路带你玩转Excel动态图表!
  18. CentOS7安装Jenkins教程
  19. 58到家,或将到不了家
  20. 数字标牌(Digital Signage)

热门文章

  1. GPS定位系统源码,通用系统源码包含GPS行业核心功能可轻松开发出各类行业应用
  2. 计蒜客一月入门赛:《三个火枪手》题解
  3. 2017年最后两个工作日的年终总结
  4. 手机只是前菜,YunOS为何还要瞄准“家里、车里、路上和娱乐”?
  5. 微信小程序毕业设计 基于微信小程序的物业维修报修系统开题报告
  6. 7-6 哲哲打游戏 (25 分)
  7. 《世界上最远的距离》(泰戈尔)
  8. RabbitMQ(Java操作工作队列-按劳分配方式)
  9. 思科模拟器配置静态路由(下一跳使用端口)
  10. html ol中reverset,List T .Reverse()方法以及C#中的示例