OSGi模块化框架是一个很早就出现的插件框架。Eclipse最早以它而闻名,但最近几年它并不太受欢迎,尽管OSGi已经发布了版本1到5。目前最常用的是基于Equinox的OSGi实现,这也是Eclipse的核心。弹簧动态模块也基于Equinox。OSGi框架为java系统提供了一个通用的容器,这个系统中的包可以在不停止系统的情况下安装和卸载。OSGi是目前Java中唯一的模块化动态规范。OSGi联盟研究模块化已经很多年了,所以OSGi规范对于模块的物理隔离、模块的交互和多版本有一个完善的机制,它也已经被几乎所有的应用服务器厂商或开源社区所认可,但是到目前为止还没有被JAVA包含在语言级别中(有待观察)。OSGi的突出特点包括:
模块可以在不停止服务的情况下动态加载、更新和卸载
实现系统的模块化和版本化,允许多个版本的bundule同时服务
服务模型允许模块/插件相互依赖但松散耦合,使得共享服务更加容易
OSGi在JVM上运行,其体系结构图如下图所示:
下图对此进行了更详细的解释:
OSGi Service服务——服务是在它实现的一个或多个接口和属性映射下公开的对象实例。简而言之,服务模型允许每个包共享一组服务,其他包可以调用这些接口的服务。OSGi束就是这么称呼的。服务可用于:
将功能从一个包导出到其他包
从其他包中导入功能
为来自其他包的事件注册侦听器
向其他OSGi捆绑包公开外部设备,如UPnP设备甚至硬件。参见《加拿大日报》
将运行在OSGI中的java代码暴露给外部网络,例如通过UPnP或protocols。
捆绑配置,使用配置管理器
实际上,接口和实现通常是分开的。接口放在一个包中。实现(服务)放在另一个捆绑包中,类似下图,捆绑包a和b是服务,它们的接口放在捆绑包C中:
或者提供一个其中定义了扩展接口的jar包,然后规定新的扩展捆绑包必须实现jar包中定义的接口。实现图如下(OsgiCommand接口在扩展点jar包中定义,新捆绑包必须包含):
捆绑服务之间的交换模式和注册模式:
通过bundleContext.registerService注册服务,然后通过bundleContext获取服务。getServiceReference(不推荐)
使用监听器listenersServiceListener和ServiceTracker提供对捆绑包和服务的动态监控,ServiceTracker可以动态监控未来的捆绑包和服务(通常推荐使用OSGi版本2提供的ServiceTracker)
用声明式服务(OSGiDS,或者Spring Dynamic Module(DM))(OSGi 4版)的方法,推荐!)
通过ServiceTracker查询或侦听服务注册和注销的第二个示例代码:
package com . IBM . OSG . example . mygetservice;
import org . OSGi . framework . Bundleactivator;
import org . OSGi . framework . bundlecontext;
import org . OSGi . util . tracker . ServiCe tracker;
import com . IBM . OSG . example . mt service . MyTestServiCe;
公共类MyBundleActivator
实现BundleActivator,可运行
{
private布尔值done = false
私有服务跟踪器测试服务跟踪器;
//捆绑激活器启动方法
公共void start(Bundelecontext上下文)
{
/*这里我们初始化并打开我们的服务跟踪器。
它将跟踪在下注册的任何服务
" com . IBM . OSG . example . mt service . MyTestServiCe "
界面。
*/
testServiceTracker =
新的服务跟踪器(上下文,
" com . IBM . OSG . example . mt service . MyTestServiCe ",
null);
testservicetracker . open();
//这里我们开始一个线程,它将继续
//使用我们的服务,直到
//捆绑停止。
线程t =新线程(this);
t . SetName(" my getservice thread ");
t . start();
}
/*捆绑激活器停止方法-我们到此为止
线程并关闭
ServiceTracker*/
公共无效停止(BundleContext上下文)
{
done = true
testservicetracker . close();
}
//这里有一个使用服务的方法
//我们正在追踪。首先我们得到
//服务
//从跟踪器,然后我们调用它的printMessage
//方法。
public void useService(字符串消息){
我的测试服务测试服务=(我的测试服务)
testservicetracker . getservice();
if( testService!= null)
{
//如果服务可用,请使用它。
testService.printMessage(消息);
}
else{
//如果服务不可用,则执行可接受的操作。
//在这里,我们只需打印消息以进行标准化并指明服务
//不可用。
System.out.println("没有可用的MyTestService消息);
}
}
//只是继续使用测试服务
//直到设置了done标志。
public void run(){
int I = 0;
done = false
while(!完成){
useService("来自测试的消息"+i++);
尝试{
thread . sleep(1000);
}
catch(断续异常)
}
}
}
}
OSGi简单起步从Eclipse创建OSGi包非常简单
Slideshare: OSGi理论与实战
OSGi动态加载删除bundle使用侦听器
ServiceListener和ServiceTracker提供对捆绑包和服务的动态监控,ServiceTracker可以动态监控未来的捆绑包和服务(ServiceTracker由OSGi第2版提供,一般推荐)。在这里我推荐一个建筑学习交流小组。交流学习组号:948368769将分享一些资深架构师录制的视频:Spring、MyBatis、Netty源代码分析、高并发、高性能原理、分布式和微服务架构、JVM性能优化、分布式架构等等,成为架构师必备的知识体系。你也可以获得免费的学习资源,目前受益匪浅
用声明式服务(OSGiDS,或者Spring Dynamic Module(DM))(OSGi 4版)的方法,推荐!)
具体实施:
有了DS,
有了Spring DM,
分布式OSGi(Distributed OSGi)OSGi集装箱可以装几千箱,但是如何处理几十万箱呢?怎么能像EJB3一样分布式、可移植?有一个OSGi的子项目(分布式OSGi。
上图是一个演示,两个分布式的OSGi容器,都部署了Greeter接口包,基于分布式的OSGi实现,可以实现分布式调用OSGi服务。OSGi(分布式OSGi也可以与RESTful服务集成(JAX-RS/JSR-339)。如何管理分布式OSGi中的几十万个捆绑包是一个问题,如何启动和停止,启动顺序是什么?可管理性是个问题,ACE项目试图解决。
DOSGi的原理(分发提供商为OSGi服务创建Endpoint,这样就可以在OSGi集装箱外访问这些服务,另一端创建代理;此外,还有一位听众聆听OSGi服务的创建、开始和停止等。):
分布式OSGi与ZooKeeperZooKeeper是Hadoop的一个子项目,Hadoop是一个可靠的大规模分布式系统的协调系统。其功能包括配置维护、名称服务、分布式同步、群组服务等。ZooKeeper的目标是封装复杂易错的关键服务,为用户提供易用的界面和高性能稳定功能的系统。
分布式OSGi(分布式OSGi)在发现中使用动物园管理员。所谓的发现模块用于发现和监听分布式远程可用端点。由zookeeper分配的发现的体系结构图:
参考:DOSGi使用ZooKeeper服务器的安装和演示
1.《bundle OSGi模块化框架详解》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《bundle OSGi模块化框架详解》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/tiyu/817590.html