插件化开发-1-初识OSGI

26次阅读

共计 2873 个字符,预计需要花费 8 分钟才能阅读完成。

初识 OSGI

背景

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

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

选型

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

OSGI 简介

OSGI 是 <u>O</u>pen <u>S</u>ervice <u>G</u>ateway <u>I</u>nitiative(开发服务网关协议)。

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

    OSGi Alliance 是一个由 Sun Microsystems、IBM、爱立信等于 1999 年 3 月成立的开放的标准化组织,最初名为 Connected Alliance。

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

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

osgi.org 官方描述:

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, 因此带上安装再熟悉一下哈。。。

  • 访问:https://www.eclipse.org/downloads/ 下载客户端

选择企业版之后,下一步

点击 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 环境工作就已经完成了,下一节会开发一个基于实战应用的示例。


奔跑的人生 | 博客园 | segmentfault | spring4all | csdn | 掘金 | OSChina | 简书 | 头条 | 知乎 | 51CTO

正文完
 0