前言
在最近做的一个项目中,需要实现对jar包的热更新,最初的实现方式是使用自定义的ClassLoader。但这种自定义ClassLoader的方式只能实现首次jar包的热加载(即在程序启动后,引入新的jar包到jvm),如果要更新这个jar包版本却没有办法。
具体为啥没有办法实现对jar包的热更新呢,假设现在jar1.0中对应的class文件使用自定义的ClassLoader已经加载到JVM内存,生成了对应版本的Class对象,这些对象都会被缓存起来(放到方法区中)。此时如果更新jar2.0,由于缓存中已经存在(方法区)老版本的Class对象,新的class文件是无法加载到JVM中的。由于jvm中没有提供class及classloader的卸载方法,要自己去实现是个复杂的过程。
这其实就涉及到java的模块化编程,OSGI刚好就是现在比较成熟的技术解决方案,而且大名鼎鼎的Eclipse就是基于OSGI实现了对插件的热插拔(Eclipse 3.0以后)。引入这项技术后很好的解决了我们面临的问题。另外jdk1.9也推出了自己的模块化编程解决方案Jigsaw,但目前jdk1.9还没有大范围商用,在技术选型时被排除。
在现有项目中使用OSGI还是有一定的学习成本,准备对OSGI的引入过程做一些总结。首先从一些理论基础开始。
OSGI的三个概念层
OSGI规范和OSGi框架:OSGI规范是由OSGI联盟制定的一套技术规范,本质就是一系列的接口;OSGI框架 简单的理解就是各个软件厂商对OSGI规范中定义的接口的实现,比较有名的三个OSGI框架:Apache Felix、Eclipse Equinox、Knopflerfish。OSGI规范和OSGi框架的关系有点类似于jvm规范和Hotspot虚拟机。
OSGI的三个概念层,确切的说应该是OSGI规范定义的三个概念层:模块层、生命周期层、服务层。
模块层:OSGI的每个模块都称之为bundle,它是一个包含元数据的jar文件。与普通jar的区别是每个bundle对应的jar包中有一个META-INF目录,里面有一个MANIFEST.MF文件(现在大部分通过Maven引入的jar包中都有这个文件),该文件就是“元数据”。可以简单的理解bundle=普通jar+MANIFEST.MF(元数据描述文件),所以MANIFEST.MF文件就是boundle的核心。
MANIFEST.MF文件可以定义哪些包(package)对外可见(export导出),这个bundle在OSGI容器中被加载后,其它bundle通过import导入需要的包(package),使用这些包中的类。
这里有一个export和import的概念,bundle之间的API相互依赖都可以通过export和import相关的包(package)来完成。在一个bundle中只有export导出的api才能被其他bundle使用,即使是定义为public的api如果没有被export导出,对于其它bundle来说是不可见的。这这个层面上讲,bundle扩展了java的访问修饰符:public、默认、private、protected。
简单的理解模块层,就是在jar包的基础上加元数据,也就是配置MANIFEST.MF文件,一个简单的MANIFEST.MF配置文件如下:
Manifest-Version: 1.0 Archiver-Version: Plexus Archiver Created-By: Apache Maven Built-By: gantianxing Build-Jdk: 1.8.0_65 Bundle-Activator: com.sky.osgi.MtActivator Bundle-ManifestVersion: 2 Bundle-SymbolicName: osgibundle222 Import-Package: com.sky.osgi.server
后面再抽时间单独对MANIFEST.MF文件的配置方法单独进行总结。
生命周期层:顾名思义,其主要作用是控制如何管理bundle的生命周期,比如bundle的在容器里的安装、更新、启动、停止、卸载,以及如何管理应用程序。这些API都是在生命周期层定义。在这一层,OSGI规范中定义了很多接口来实现对bundle的管理,后面再抽时间进行总结。
服务层:这层的概念有点类似SOA服务治理,与SOA服务治理一样 OSGI的服务层包含:服务注册中心、服务提供方、服务使用方(客户端)。与SOA服务不同的是,OSGI的服务层的注册中心、服务提供方、服务使用方都在一个jvm实例内部,而SOA的服务是分布式的。这也就是所谓的:OSGI是JVM内部的SOA服务治理框架。
摘自《OSGI实战》
OSGI的工作流程如上图,可见其工作方式与普通RPC框架是类似的(比如Dubbo),这里只是在一个jvm实例中完成:首先服务提供者向注册中心发布服务,客户端要使用某个服务时首先到注册中心查找,如果找到对应的服务,就直接调用该服务(有点类似服务直连)。
另外OSGI服务的开发模式也跟普通的RPC服务类似,是一种基于接口的开发模式,实现与接口分离。在发布服务时,只需把接口类暴露出去(export),服务使用方导入这些接口类再通过注册中心查找即可。
注意这里使用服务与普通export的区别,使用服务:服务提供方只是往外暴露(export)了接口类,具体的实现类对客户端(另一个bundle)来说是不可见的;普通的export是导出整个具体的实现类,客户端导入后可以直接使用。简单理解就是,前者只是export接口隐藏实现,后者是直接export实现。
相对于直接export实现类来说,使用服务发布的方式有很多好处:服务端是一个bundle 具体的实现被封装到这个bundle中,客户端是其它bundle,当服务端有内容需要更新时,客户端是无感知的。就类似于普通的RPC框架里,服务提供方法有代码更新需要重新上线,而对服务使用方(客户端)来说是不需要同步上线的。这应该就是OSGI能实现热更新的根本原因:
如果上图bundle1-3是服务使用方,bundle4-6是服务提供方(当然也可以即使服务提供方,也是其它服务的使用方,最终可能是一个网状结构),比如:当服务提供方bundle4需要更新重新加载时,此时这个服务只是短时间不可用,其它bundle可以正常工作,只是bundle1在调用bundle4的服务时,发现服务不可用,这时可以进行异常处理或者进行轮询等待即可。
关于OSGI的三个概念层,本次总结只是简单的从理论概念上进行了描述,具体模块层元数据怎么配置?生命周期层如果管理?服务层如何注册和发现服务?对于这三个问题,后面再单独抽时间总结下。
相关推荐
OSGi是一种基于Java的模块化系统,它定义了一个标准的框架,用于创建、部署和管理模块化应用程序。OSGi的核心概念是服务,这些服务可以动态地发布、查找和依赖其他服务。这提供了高度的灵活性和可重用性,使得开发者...
OSGi是一种Java模块化系统,它允许开发者创建可重用和可组合的模块,以构建更灵活、可维护的大型应用。这个特定的版本 "2.1.93" 暗示了该项目可能已经经过了多次迭代和优化,以适应不断变化的开发需求。 【描述】中...
OSGi(Open Services Gateway Initiative)是一个由OSGi联盟(OSGi Alliance)维护和发展的开放性规范,它定义了如何在Java平台的基础上实现模块化编程和服务动态化。OSGi规范使得Java程序可以被设计成一套小型的、...
综上所述,OSGi模块层的设计考虑和实施,不仅有助于解决Java模块化存在的问题,还为Java平台带来了模块化的高级控制,使得开发者能够构建出更模块化、更灵活、更可维护的Java应用。这对于推动Java模块化开发技术的...
Java应用架构设计:模块化模式与OSGi 英文版 中文版介绍: 全球资深Java技术专家的力作,系统、全面地讲解如何将模块化设计思想引入开发中,涵盖18个有助于实现模块化软件架构的模式 中文目录: 第一部分 模块化...
OSGi核心技术文档详细介绍了OSGi的三个模块层次:服务层、模块层和生命周期层。 服务层是OSGi最上层的抽象,负责定义和实现所有服务的生命周期。在OSGi中,服务是指一组具有明确目的的代码和数据的集合,例如日志...
### OSGi in Action: 创建模块化的Java应用 #### 一、OSGi揭示:模块化的重要性与挑战 在《OSGi in Action》这本书的第一章“OSGi Revealed”中,作者深入探讨了Java平台虽然取得了巨大的成功,但在构建模块化系统...
3. **OSGi框架**:OSGi是一种Java模块化系统,它允许开发者将应用分解为多个独立的服务或组件,这些组件可以在运行时动态安装、卸载和升级,提高了系统的可维护性和可扩展性。Apache Felix和Equinox是两个流行的OSGi...
OSGi(Open Service Gateway Initiative)服务平台是为了解决Java平台缺乏模块化支持而由OSGi联盟定义的一个行业标准。它不仅解决了模块化问题,还引入了一个新的面向服务的编程模型,有人称其为“虚拟机内的SOA”。...
随着时间的发展,OSGi已经成为Java模块化的一个标准,被广泛应用于企业级应用的开发。其核心特点包括: 1. **动态模块加载**:OSGi支持动态安装、启动、停止和卸载模块。 2. **版本控制**:每个模块都可以指定自己...
Java应用架构设计:模块化模式与OSGi 英文版 中文版介绍: 全球资深Java技术专家的力作,系统、全面地讲解如何将模块化设计思想引入开发中,涵盖18个有助于实现模块化软件架构的模式 中文目录: 第一部分 模块化的...
本书详细介绍了模块化编程的重要性,以及OSGi如何强化Java的模块化能力。同时,本书也解答了为何传统上的企业级Java应用和OSGi结合得并不理想,以及企业OSGi如何解决这一问题,从而提出了一种新的编程模型。 书中...
OSGi定义了模块化编程的概念,它将程序分为若干个Bundle(通常是jar包),这些Bundle可以独立地被安装、启动、升级和卸载。OSGi中的模块化是通过为jar包添加元数据(metadata)来定义的,其中最为关键的是MANIFEST....
《企业OSGi实战》是一本面向开发者的...本书强调模块化编程的好处,帮助开发者构建更加灵活、可维护的企业级Java应用。由于OSGi技术涉及众多复杂概念,本书的实践方法尤其适合希望提升对OSGi应用开发理解和掌握的读者。
OSGi(Open Service Gateway Initiative)是一种Java平台上的模块化系统和动态模块化能力的实现,它为开发复杂的应用程序提供了一种灵活的框架。OSGi允许将应用程序划分为小的、独立的模块,这些模块被称为bundles。...
OSGi(Open Services Gateway Initiative)是一种Java模块化系统,它允许开发者将大型应用分解为可独立更新和管理的小型服务单元。Spring框架是Java开发中最常用的应用框架,它提供了一整套服务,包括依赖注入、AOP...
它最初被设计用于服务网关设备,但逐渐成为Java平台上通用的模块化标准。 - **目标与愿景**:本书旨在提供一个从入门到精通的学习路径,覆盖从基本概念到高级主题,并探讨OSGI的当前状况及未来发展方向。 #### 二、...
再者,OSGi(Open Services Gateway Initiative)是一种Java模块化系统,旨在解决大型Java应用的复杂性问题。它通过定义服务的生命周期管理和模块化来实现组件的动态组合和分离。在OSGi环境中,每个模块称为一个...
综上所述,OSGi技术为Java开发者提供了一个强大的工具集,用于构建高度模块化和可扩展的应用程序。随着技术的不断进步,OSGi将在企业级应用开发中扮演越来越重要的角色,特别是在那些需要频繁更新和扩展的服务场景中...