[插件化开发] 1. 初识OSGI

2022-10-14,,,,

初识 osgi

背景

当前product是以solution的方式进行售卖,但是随着公司业务规模的快速夸张,随之而来的是新客户的产品开发,老客户的产品维护,升级以及修改bug,团队的效能明显下降,为了解决此类问题,必须站在公司战略的统一高度来重构系统。

荣幸的是,本人在此时加入团队并负责系统架构的升级与重构工作。因为公司在全世界都有客户,而且客户又来自于各行各业,带来的问题就是如何抽离公共业务的同时,又能不影响客户的定制化需求开发?产品团队专注于系统的核心逻辑开发,而一些定制化需求交付给global team 去开发?

选型

技术没有银弹,目前没有完全确定要使用osgi的方式来实现,因为本人之前使用spring cloud & spring cloud alibaba各实现了一种demo, 当然也可以实现我们的服务化,高可用以及动态扩展。但是在解决插件定制化这块,相对来说还是不太熟悉,然后osgi进入眼帘了。

osgi 简介

osgi 是 open service gateway initiative(开发服务网关协议)。

  • 指维护osgi规范的官方联盟

    osgi alliance是一个由sun microsystems、ibm、爱立信等于1999年3月成立的开放的标准化组织,最初名为connected alliance。

  • 官方联盟维护的基于java语言的服务规范

    该规范和核心部分是一个框架,其中定义了应用程序的生命周期模式和服务注册。基于这个框架定义了大量的osgi服务:日志、配置管理、偏好,http(运行servlet)、xml分析、设备访问、管理、许可管理、星级、用户管理、io连接、连线管理、jini和upnp。

官方描述:

the dynamic module system for java

通俗讲:使用osgi实现的程序(bundle)就是一个插件,可以动态的安装,卸载,启动,停止等等而不需要启动容器。

目前使用最广的两款osgi 框架:

  • apache felix

    apache felix是apache旗下的一个osgi框架,项目本身非常成熟,已经被用到了很多其他的项目中,例如apache servicemix。它本身提供的服务也是最全的,几乎涵盖了全部的osgi 4.2的标准。除此之外还提供了一些非标准的功能,例如ipojo。框架本身非常紧凑,你只需要3个包加一个shell就可以运行了,无论是开发还是debug都非常简便。除了felix,还有两个项目是和osgi相关的。一个是apache felix karaf,它本身是felix的一个子项目,但他其实是封装了felix提供更高一层的runtime,例如提供了jaas。另一个是apache aries,目前还处于起步阶段,它作为felix的补充,提供osgi企业级规范,包括jpa、jdbc、jta、jndi等等。

  • equinox

    equinox是eclipse旗下的osgi框架,本身也被eclipse采用,是eclipse注明的pde开发环境的底层。equinox本身也是相当的全面的框架,提供的功能不比felix少多少。但是它功能的分类就稍显混乱,文档和sample也组织的不是很好。事实上相当equinox还是被当做开发eclipse plugin的应用较多,如果你要开发一个web程序,你就会感到它本身的功能和文档不够全面。equinox最大的优势在于它和eclipse结合紧密,只要你安装了pde,你就已经有了equinox,可以方便的在eclipse里设置你开发的bundle,启动、部署等操作也异常简单,而且有专门的debug界面,你还能要求什么呢?

    如果你想基于eclipse开发,equinox无疑是好选择。但对于新手而言,有时候会搞混eclipse plugin与osgi的关系。

talk is cheap, show me the code.

环境安装

eclipse 版本

因本人好几年没使用eclipse, 因此带上安装再熟悉一下哈。。。

  • 访问: 下载客户端

选择企业版之后,下一步

点击install,等待安装完成。

创建项目
  • file => new => project

  • 选择plug-in development => plug-in project

  • 填写项目属性(osgi framework 选择 standard)

  • 点击next(关注activator,这个会处理osgi的start() 和 stop()时调用,相当于我们的main函数)

  • 点击next(选择hello osgi)

  • 点击 finish

配置环境
  • 选择 run => run configurations

  • 选择osgi framework,右键点击new configration

  • 选择bundles(因为默认创建会选择全部target platform,在eclipse ide 2019‑09版本下,直接启动会报错。所以取消所有的选项,只勾选以下就个必须的bundle就足够。)

  • 点击validate bundles 验证我们的配置项是否正确。

    如果显示如上消息,恭喜你,可以点击run启动osgi console 啦!!!

osgi console 启动

idea 版本

idea也带有osgi 开发工具包,let's do it.

配置framework

这里我选择的是eclipse equinox 4.13,download传送门 ,点击下载[equinox-sdk-4.13.zip],下载完成之后开始配置。

  • idea(version: ultimate 2019.2) => file => settings (搜索osgi,如下图)

  • 点击 + 添加,选中上一步下载的sdk解压目录

  • 添加成功后,选择osgi 标签,选择osgi framework 为我们配置的equinox.

    import bnd/bndtools projects automatically 指的是将普通的jar包 打包 为osgi 可用的jar.

创建项目
  • 点击file => new => project, 选择java标签下的osgi

  • 选择use library,点击create

    找到org.eclipse.osgi_3.15.0.v20190830-1434.jar,选中,效果如下,点击下一步。

  • 填写项目属性

    点击finish。

    如上图所示,idea 创建的不会帮助我们生成activator以及manifest.mf文件。

osgi console 启动
  • 点击run => edit configurations

  • 点击 + ,选择osgi bundles,添加核心bundles

  • 运行(ss 为查看osgi运行状态命令)

eclipse与idea开发osgi,主要是manifast文件的生成过程存在比较大的差异。

至此,我们使用两种开发工具配置osgi环境工作就已经完成了,下一节会开发一个基于实战应用的示例。

《[插件化开发] 1. 初识OSGI.doc》

下载本文的Word格式文档,以方便收藏与打印。