OSGI企业应用开发(一)OSGI简介
一、OSGI简介
OSGI全称为Open Service Gateway Initiative(开放服务网关规范),有两个层面的含义,一方面它指OSGi Alliance组织;另一方面指该组织制定的一个基于Java语言的服务(业务)规范——OSGi服务平台(Service Platform)。
一般Java开发人员所说的OSGI是指由OSGi Alliance组织制定的Java模块化规范,该规范的核心部分是一个框架,其中定义了应用程序的生命周期模式和服务注册。基于这个框架定义了大量的OSGi服务:日志、配置管理,HTTP服务(运行Servlet)、XML解析、设备访问、软件包管理、许可管理、用户管理、IO连接、Jini和UPnP等。
读者可以从如下网站中获取更多OSGI信息:
OSGI中文社区:http://www.osgi.com.cn/
OSGI官方网站:https://www.osgi.org/
二、使用OSGI优缺点
使用OSGI构建Java应用优点比较明显,主要体现在以下几个方面:
1、基于OSGI的应用程序可动态更改运行状态和行为。在OSGI框架中,每一个Bundle实际上都是可热插拔的,因此,对一个特定的Bundle进行修改不会影响到容器中的所有应用,运行的大部分应用还是可以照常工作。当你将修改后的Bundle再部署上去的时候,容器从来没有重新启过。这种可动态更改状态的特性在一些及时性很强的系统中比较重要,尤其是在Java Web项目中,无需重启应用服务器就可以做到应用的更新。
2、OSGI是一个微核的系统,所谓微核是指其核心只有为数不多的几个jar包。基于OSGI框架的系统可分可合,其结构的优势性导致具体的Bundle不至于影响到全局,不会因为局部的错误导致全局系统的崩溃。例如Java EE项目中可能会因为某个Bean的定义或注入有问题,而导致整个应用跑不起来,而使用OSGI则不会有这种问题,顶多相关的几个Bundle无法启动。
3、可复用性强,OSGI框架本身可复用性极强,很容易构建真正面向接口的程序架构,每一个Bundle 都是一个独立可复用的单元。
使用OSGI的缺点如下:
1、每个Bundle都由单独的类加载器加载,与一些Java EE项目中使用比较多的框架整合比较困难,如Spring MVC、Struts2等,例如笔者尝试在OSGI应用中整合Spring MVC时,通过DispatcherServlet启动的Bean与OSGI Bundle启动的Bean无法相互依赖,需要做特殊处理,后面文章中会有介绍。
2、目前OSGI框架提供的管理端不够强大,现在的管理端中仅提供了基本的Bundle状态管理、日志查看等功能,像动态修改系统级别的配置(config.ini)、动态修改Bundle的配置(Manifest.mf)、启动级别等功能都尚未提供,而这些在实际的项目或产品中都是非常有必要的。
3、采用OSGI作为规范的模块开发、部署方式自然给现有开发人员提出了新的要求,需要学习新的基于OSGI的开发方式。
三、OSGI具体实现
OSGI是OSGi Alliance组织制定的Java模块化规范,但是该组织并没有给出OSGI容器的实现,具体实现由第三方厂商完成,目前使用较多的OSGI容器有 Apache Felix和Equinox。
Apache Felix是Apache软件基金会的一个顶级项目,官方地址为:http://felix.apache.org/,Felix的使用非常简单,读者可以从官方网站中获取Felix框架,下载地址为:http://felix.apache.org/downloads.cgi。
如下图所示,单击Zip链接即可下载:
下载后解压,目录结构如下所示:
felix-framework-5.6.1
│ DEPENDENCIES
│ LICENSE
│ LICENSE.kxml2
│ NOTICE
│
├─bin
│ felix.jar
│
├─bundle
│ org.apache.felix.bundlerepository-2.0.8.jar
│ org.apache.felix.gogo.command-0.16.0.jar
│ org.apache.felix.gogo.runtime-0.16.2.jar
│ org.apache.felix.gogo.shell-0.10.0.jar
│
├─conf
│ config.properties
│
└─doc
│ ....
读者可以打开Windows控制台,进入felix-framework-5.6.1目录下,通过如下命令启动Felix框架:
java -jar ./bin/felix.jar
接着可以输入lb命令显示所有运行的Bundle,如下图所示:
Apache Felix的更多使用细节,读者可参考Felix官方网站说明。
另外一款OSGI容器Equinox,它是Eclipse开源组织提供的OSGi框架的实现。Eclipse自3.0版本开始,其内核移植到OSGi框架上。通过OSGi框架强大的组件控制,交互和管理能力,再加上Eclipse插件的自有特点,Eclipse开源框架得到了跳跃式的发展。同时,OSGi规范得益于Eclipse IDE环境庞大的使用者,OSGi联盟也进入了快速发展时期。
Equinox的使用这里不做过多介绍,后续文章中将会重点介绍如何使用Equinox容器开发Java EE项目,并与目前使用较多的Spring、Spring MVC、Struts2、Mybaits等框架进行整合。
四、为什么要写本系列文章
之前看过不少OSGI相关的书籍,但是始终觉得把OSGI应用到实际项目中比较困难,目前国内使用OSGI模块化规范构建的Java EE项目相对较少,可能是因为绝大多数Java EE项目都会使用到Spring框架,然后通过Spring整合一些其他的MVC或ORM框架,例如Struts2、Hibernate等,OSGI中整合这些框架本来就比较困难,而且相关的资料可谓是少之又少,甚至很多框架或第三方工具包发布的Release版Jar包根本就不是一个Bundle,要应用的项目中谈何容易。
笔者最近接触到一款使用OSGI模块化规范实现的大型项目,发现OSGI在该项目中运用非常成功,很好的整合了目前主流的开源框架,例如Spring、Ibatis等等,经过一番探索,成功搭建了一个基于OSGI、Spring、Spring MVC、Mybatis的项目,并找到了Bundle版本的Jar包获取途径,所以决定写成博文,希望能够对想使用OSGI开发Java EE项目的朋友有所帮助,文章中有不当的地方、或者有更好的实践方式,希望读者指正,另外转载请注明本文地址。
OSGI企业应用开发(一)OSGI简介的更多相关文章
- OSGI企业应用开发(十三)OSGI Web应用开发(二)
上篇文章介绍了OSGI Web应用的两种开发模式,并把Jetty应用服务器以Bundle的形式整合到Equinox容器中,已这种模式开发Web应用,所有的应用程序资源,例如Servlet.JSP.HT ...
- OSGI企业应用开发(十二)OSGI Web应用开发(一)
前面文章中介绍了如何在OSGI应用中整合Spring和Mybatis框架,本篇文章开始介绍如何使用OSGI技术开发Web应用.对于传统的Java EE应用,应用中涉及到的Web元素无非就是Servle ...
- OSGI企业应用开发(七)细说Blueprint & Gemini Blueprint(二)
上篇文章介绍了标准的Blueprint 规范与 Gemini Blueprint如何自定义Bean配置文件路径,本文接着上篇文章继续介绍Blueprint的使用. 一.Bean的配置 前面提到过,Ge ...
- OSGI企业应用开发(五)使用Blueprint整合Spring框架(二)
上篇文章中,我们开发了一个自定义的Bundle,接着从网络中下载到Spring和Blueprint的Bundle,然后复制到DynamicRuntime项目下. 需要注意的是,这些Bundle并不能在 ...
- OSGI企业应用开发(四)使用Blueprint整合Spring框架(一)
上篇文章中介绍了如何使用独立的Equinox发行包搭建OSGI运行环境,而不是依赖与具体的Eclipse基础开发工具,本文开始介绍如何使用Blueprint將Spring框架整合到OSGI中. 一.开 ...
- OSGI企业应用开发(二)Eclipse中搭建Felix运行环境
上篇文章介绍了什么是OSGI以及使用OSGI构建应用的优点,接着介绍了两款常用的OSGI实现,分别为Apache Felix和Equinox,接下来开始介绍如何在Eclipse中使用Apache Fe ...
- OSGI企业应用开发(十四)整合Spring、Mybatis、Spring MVC
作为一个企业级的Web应用,MVC框架是必不可少的.Spring MVC目前使用也比较广泛,本文就来介绍一下如何在OSGI应用中实现Spring.Mybatis.Spring MVC框架的整合,其中S ...
- OSGI企业应用开发(九)整合Spring和Mybatis框架(二)
上篇文章中,我们完成了在OSGI应用中整合Spring和Mybatis框架的准备工作,本节我们继续Spring和Mybatis框架的整合. 一.解决OSGI整合Spring中的Placeholder问 ...
- OSGI企业应用开发(六)细说Blueprint & Gemini Blueprint(一)
上篇文章介绍了如何使用Blueprint將Spring框架整合到OSGI应用的Bundle中,从上篇文章中我们大概了解了Blueprint与Gemini Blueprint的关系,简单的说,Bluep ...
随机推荐
- DockerFile(保你会版本)(七)
一.什么是dockerfile Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile自定义快速创建属于自己的镜像,Dockerfile是通过很多的参数指令编写的文件,通过do ...
- EFCore.MySql当模型遇到int[]怎么办
我使用的是Pomole.EntityFrameworkCore.MySql 需要将旧项目中的excels表转成实体,其中有一列是json格式的int[] 当遇到第一张表的时候,我使用了这样的方法来读取 ...
- How To Scan QRCode For UWP (4)
QR Code的全称是Quick Response Code,中文翻译为快速响应矩阵图码,有关它的简介可以查看维基百科. 我准备使用ZXing.Net来实现扫描二维码的功能,ZXing.Net在Cod ...
- dbvisulizer 存储过程
--/ CREATE PROCEDURE test () BEGIN DECLARE v CHAR(10) DEFAULT 'Hello';SELECT CONCAT(v, ', ', current ...
- CentOS 6.7 下 PostgreSQL 9.5 的安装与配置
#yum方式安装(不同的系统版本对应的版本也不同) yum install postgresql-server #安装指定版本 yum install https://download.postgre ...
- Mac 下安装.NET Core 与 CLI
.NET Foundation:https://github.com/dotnet/home .NET Core:https://github.com/dotnet/coreclr CLI:https ...
- 查漏补缺之开g的正则
当正则表达式开了挂,就会多一个g的修饰符,用于表示全局匹配.然而这个表达式却不仅仅是多了个g这么简单,它的方法也会发生改变.由于之前不是太了解,今天好好捋一下,且听我细细道来. 正则表达式的方法和属性 ...
- Android 开发工具类 36_ getSimSerial
1 /** * 获取手机的 sim 卡串号 * 需要在清单文件中配置权限: * <uses-permission android:name="android.permission.RE ...
- Element ui级联地址省市区插件
安装 npm install element-china-area-data -S 使用 import { provinceAndCityData, regionData, provinceAndCi ...
- 代理模式——java设计模式
代理模式(Proxy Pattern) GoF中给出的代理模式的定义为: 代理模式给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问. 代理模式的英文叫做Proxy或Surrogate ...