初识 OSGI

背景

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

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

选型

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

OSGI 简介

OSGIOpen Service Gateway Initiative(开发服务网关协议)。

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

选择企业版之后,下一步

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

[参考2]: https://blog.csdn.net/qq_34248376/article/details/82585930

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

[插件化开发] 1. 初识OSGI的更多相关文章

  1. Android组件化和插件化开发

    http://www.cnblogs.com/android-blogs/p/5703355.html 什么是组件化和插件化? 组件化开发就是将一个app分成多个模块,每个模块都是一个组件(Modul ...

  2. TinyFrame升级之八:实现简易插件化开发

    本章主要讲解如何为框架新增插件化开发功能. 在.net 4.0中,我们可以在Application开始之前,通过PreApplicationStartMethod方法加载所需要的任何东西.那么今天我们 ...

  3. Android插件化开发

    客户端开发给人的印象往往是小巧,快速奔跑.但随着产品的发展,目前产生了大量的门户型客户端.功能模块持续集成,开发人员迅速增长.不同的开发小组开发不同的功能模块,甚至还有其他客户端集成进入.能做到功能模 ...

  4. Android 使用动态载入框架DL进行插件化开发

    如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456    (来自时之沙的csdn博客) 概述: 随着应用的不断迭代.应用的体积不断增大,项目越来越臃肿,冗余添 ...

  5. Android插件化开发---执行未安装apk中的Service

    欢迎各位增加我的Android开发群[257053751​] 假设你还不知道什么叫插件化开发.那么你应该先读一读之前写的这篇博客:Android插件化开发,初入殿堂 上一篇博客主要从总体角度分析了一下 ...

  6. NET 平台下的插件化开发内核

    .NET 平台下的插件化开发内核(Rabbit Kernel)   每个程序猿都有一个框架梦,曾经在2013年8月15日写过一篇“Koala Framework是什么?我为什么要写这个框架?”的文章, ...

  7. JavaScript插件化开发

    大熊君JavaScript插件化开发 一,开篇分析 Hi,大家好!大熊君又和大家见面了,还记得昨天的那篇文章吗------这个系列的开篇(第一季).主要讲述了以“jQuery的方式如何开发插件”, 那 ...

  8. 插件化开发—动态加载技术加载已安装和未安装的apk

    首先引入一个概念,动态加载技术是什么?为什么要引入动态加载?它有什么好处呢?首先要明白这几个问题,我们先从 应用程序入手,大家都知道在Android App中,一个应用程序dex文件的方法数最大不能超 ...

  9. 【我的Android进阶之旅】Android插件化开发学习资料

    1.目前开源的插件开发框架大致有哪些? 1. 任玉刚 的 dynamic-load-apk Github 地址:https://github.com/singwhatiwanna/dynamic-lo ...

随机推荐

  1. 解开Batch Normalization的神秘面纱

    停更博客好长一段时间了,其实并不是没写了,而是转而做笔记了,但是发现做笔记其实印象无法更深刻,因此决定继续以写博客来记录或者复习巩固所学的知识,与此同时跟大家分享下自己对深度学习或者机器学习相关的知识 ...

  2. 【LeetCode】DFS 总结

    DFS(深度优先搜索) 常用来解决可达性的问题. 两个要点: 栈:用栈来保存当前节点信息,当遍历新节点返回时能够继续遍历当前节点.可以使用递归栈. 标记:和 BFS 一样同样需要对已经遍历过的节点进行 ...

  3. 6.final和static

    一.final final修饰类表示该类为最终类,不可被继承. final修饰方法表示该方法为最终方法,不可被重写. final修饰属性表示该属性不可变,不可变有两种含义.当其修饰基本类型变量时表明其 ...

  4. Net基础篇_学习笔记_第十天_方法(函数)

    方法(函数): 函数就是将一堆代码进行重用的一种机制.//解决冗余代码问题------方法出现了.            面向对象的三大特征:封装.继承.多态 函数的语法:[public] stati ...

  5. 关于Elasticsearch文档的描述以及如何操作文档的详细总结

    文档 什么是文档 在大多数应用中,多数实体或对象可以被序列化为包含键值对的 JSON 对象. 一个 键 可以是一个字段或字段的名称,一个 值 可以是一个字符串,一个数字,一个布尔值, 另一个对象,一些 ...

  6. FaceBook快捷登入

    关于集成FaceBook快捷登入,我上回做了个最简单的版本,所有Web端通用,在这边共享下,有更好的解决方案的,麻烦评论留个地址,有不妥之处请指正. 首先,我们先加载Facebook的Js windo ...

  7. 松软科技课堂:SQL-LEFT-JOIN 关键字

    SQL LEFT JOIN 关键字 LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行. LEFT JOIN 关键 ...

  8. sudo apt-get install 、 pip install和conda install的对比

    sudo apt-get install: apt-get可以用来安装软件.更新源,也可以用来更新自Ubuntu的典型依赖包. (sudo apt-get remove --purge 软件名称 su ...

  9. NLP舞动之中文分词浅析(一)

    一.简介        针对现有中文分词在垂直领域应用时,存在准确率不高的问题,本文对其进行了简要分析,对中文分词面临的分词歧义及未登录词等难点进行了介绍,最后对当前中文分词实现的算法原理(基于词表. ...

  10. Kubernetes Dashboard 终结者:KubeSphere

    原文链接:Kubernetes Dashboard 终结者:KubeSphere 2018 年 7 月份,青云在 Cloud Insight 云计算峰会上推出了一款全新的容器平台--KubeSpher ...