知识卡片
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["插件通信"]