知识卡片

OSGi三层架构对微内核三设计点的具体落地

结构图卡

内容

OSGi(Open Services Gateway initiative)诞生于1999年,最初由Sun、IBM、爱立信等公司组成的联盟制定,目标是为嵌入式设备(机顶盒、服务网关、手机、汽车)建立开放服务标准,后来因为动态化、热插拔、高复用性等优点被引入PC应用开发,尤其是Eclipse从3.0版本起弃用自己实现的插件框架、改用OSGi后,OSGi成了插件化标准的首选——需要注意OSGi本身只是一套规范标准,不是可运行框架,Eclipse用的具体实现叫Equinox,同类实现还有Apache Felix、Spring DM。OSGi的逻辑架构正好对应[[微内核架构的三个设计关键点:插件管理、连接与通信]]的三个设计点。模块层实现插件管理功能:OSGi里插件被称为Bundle,每个Bundle是一个Java JAR文件,内含一个MANIFEST.MF元数据文件,记录Bundle的名称、描述、开发商、classpath以及需要导入/导出的包等信息,OSGi核心系统会把这些信息加载进系统供后续使用。生命周期层实现插件连接功能:提供运行时的模块管理和对底层OSGi框架的访问能力,精确定义了Bundle生命周期的各项操作(安装、更新、启动、停止、卸载),每个Bundle必须实现一个BundleActivator接口,在start()和stop()方法里定义自己启动和停止时该做什么。服务层实现插件通信功能:OSGi提供服务注册中心,各插件把自己能提供的服务注册进去,其他插件要用某个服务时直接去服务注册中心检索即可——比如一个Bundle在start()里用context.registerService()注册服务,无须在stop()里手动注销(Bundle停止时会自动注销它注册过的服务);另一个Bundle作为客户端,先用context.getServiceReference()从注册表拿到”服务引用”,再用这个引用去访问实际的服务实例。需要特别注意的是,这里的”服务注册”和模块层的”插件注册”不是一回事——插件注册解决的是核心系统怎么知道有哪些插件、如何加载它们,服务注册解决的是插件之间怎么互相发现和调用对方提供的能力,前者对应插件管理、后者对应插件通信。

结构图

flowchart TB
  A["OSGi三层架构"]
  A --> B["模块层(Module)<br/>=插件管理<br/>Bundle(JAR)+MANIFEST.MF元数据"]
  A --> C["生命周期层(Lifecycle)<br/>=插件连接<br/>BundleActivator定义安装/启动/停止/卸载"]
  A --> D["服务层(Service)<br/>=插件通信<br/>服务注册中心:registerService注册<br/>getServiceReference检索"]
  B -.->|"对应"| E["插件管理"]
  C -.->|"对应"| F["插件连接"]
  D -.->|"对应"| G["插件通信"]

参考来源

- 位置:《从零开始学架构》第37讲《微内核架构详解》"OSGi架构简析"(源文件:_epub-src/OEBPS/text00003.html) - 结论依据:原文说明"模块层实现插件管理功能……每个 Bundle 里面都包含一个元数据文件 MANIFEST.MF""生命周期层实现插件连接功能……精确地定义了 Bundle 生命周期的操作(安装、更新、启动、停止、卸载)""服务层实现插件通信功能……如果某个服务想用其他服务,则直接在服务注册中心搜索可用服务中心就可以了""这里的服务注册不是插件管理功能中的插件注册,实际上是插件间通信的机制",直接支撑本卡片结论与结构图。 - 原始内容:模块层实现插件管理功能……生命周期层实现插件连接功能……服务层实现插件通信的功能……这里的服务注册不是插件管理功能中的插件注册,实际上是插件间通信的机制。