基于OSGi实现分布式服务框架历程(三)

上篇说到,经过分析后决定选用JNDI来实现服务的远程注册、查找和路由,在这篇blog中就来详细分析下基于JNDI怎么和OSGi结合来实现服务的远程注册、查找和路由。

1、远程注册

目前OSGi DS注册时是直接在本地注册服务实例的,要支持远程注册的话首先需要修改DS注册服务部分的代码,在ds的描述中需要增加一个配置项,以支持将服务注册到远程服务中心,例如:

<service>
<provide interface="cn.org.osgi.opendoc.bulletin.service.WebCommand"/>
<server>jnp://10.100.100.100:1099,jnp://10.100.100.101:3099</server>
</service>
在注册时直接采用InitialContext进行注册,不过这里要采取个不同的策略,就是通常jndi注册时绑定的都是实际对象的实例,但要注意,其实在分布式的服务框架体系中,服务是分布式部署的,服务中心仅仅是个注册、路由的地方而已,那么这种情况下只需要把服务的相关元信息注册到服务中心即可,所以这个时候我们会提供一个服务元信息对象,然后把这个元信息对象绑定到jndi上去,这里涉及到的一个问题是jndi的名称怎么取,这个名称要便于查找服务,同时还得保证唯一性。

可以看出,在这个实现方案中,最重要的就是这个服务元信息对象了,这个元信息对象中应该包含和OSGi服务模型同样的所有的信息,同时还需要包括服务的状态信息,由于包含了状态信息,叫元信息对象的话有点不正确,要么干脆就叫Service或ServiceInfo得了。

2、远程调用

远程调用准确来讲应该分为引用远程服务和调用远程服务两个环节,因为对于lazy init的服务而言首先是远程查找服务,但并不发生调用,所以在这里也分为两步来描述下。

引用远程服务

引用远程服务这块的话JNDI目前的实现肯定是很难满足需求的,按照OSGi的服务模型,在引用服务是只提供了服务的接口名,顶多就是增加了一些服务的特定属性来限定服务的范围,而JNDI在查找绑定的对象时是直接指定名称查找的,一对一的方式,但在OSGi的服务模型中获取到的服务有可能会是多个的,来看看怎么样修改实现这个需求。

首先仍然是修改DS描述,以支持引用远程服务,例如:

<reference name="CommonDaoService" interface="cn.org.osgi.module.hibernate.service.CommonDaoService" bind="setCommonDaoService" unbind="unsetCommonDaoService"policy="dynamic" server="jnp://10.100.100.100:1099"/>

在查找远程服务中心的服务时,通过jndi将需要查找的服务的接口、属性等过滤条件传递给服务器端,这个应该可以通过扩展JNDI的lookup来实现,JNDI服务中心接到请求后根据过滤条件从注册的服务中查找到符合条件的服务元信息对象,并返回服务元信息对象集合至调用端,之后由生命周期管理对象决定后续的动作,关于生命周期管理对象在后一个篇章中来详细的分析。

调用远程服务

当远程服务被调用时,此时应该提供的一个配置是是否可跳过服务中心直接向另一端的服务发起调用(某些情况下可能会有这样的需求),另外就是同步调用和异步调用的配置的支持。

当调用时,可以走某种通讯机制对请求的服务的接口、方法以及参数传递至服务中心或相应的服务提供端,当服务提供端处理完毕后继续走这个通讯机制把处理的结果返回至调用端。

经过上面的分析后,可以看出,基于JNDI实现服务的注册、查找不会是难点,在后面一个篇章中开始来分析生命周期的管理的问题,就会比较的复杂了,进入分布式环境后,生命周期的管理就比之前OSGi DS的生命周期管理复杂了很多。

时间: 2024-08-27 15:18:18

基于OSGi实现分布式服务框架历程(三)的相关文章

基于OSGi实现分布式服务框架历程(二)

在这篇历程中来完成对于JINI的Spike,目标仍然是判断基于JINI实现服务的路由.查找需求的满足度. JINI是由Sun研究院制定的,其目标就是为了实现分布式的服务,所以在很多地方可以看到它和分布式服务框架是有不少重叠之处的,来先看看它对于需求的满足度,最后再来分析做个总结. 1.怎么实现远程的将服务注册到服务中心? 在jini中暂时没有找到远程注册服务到服务中心的方法. jini的服务需要和服务中心部署在同一台机器上,这个倒是可以通过服务管理中心直接将sar格式的服务部署上去,支持服务的动

基于OSGi实现分布式服务框架历程(一)

写完之前的那篇基于OSGi实现服务框架的分析后,决定动手来实现一个基于OSGi的分布式服务框架,而其feature呢,就会遵照之前写的服务框架的要素来实现,根据之前的分析,将这个实现过程分为了三个大的步骤来完成:Spike阶段.实现阶段和测试阶段,Spike阶段用于完成几个关键问题的技术的研究和选型:实现阶段用于完成基于OSGi的分布式服务框架:测试阶段用于判断实现的分布式框架对于应用场景的符合程度.性能的情况. 首先进入Spike阶段,在Spike阶段需要完成服务注册.创建以及服务的proxy

基于OSGi实现分布式服务框架历程(四)

在这个篇幅中将来分析下这个分布式服务框架的服务的生命周期的管理的问题,在分布式服务框架中,支持服务的动态部署.卸载.升级是很关键的,至于服务的生命周期是否需要做到像OSGi那样的动态通知,在这个篇幅中会进行分析,并最终形成这个分布式服务框架的生命周期模型以及到目前为止的服务架构模型. 先来分析下服务的生命周期是否需要做到像OSGi DS的动态通知,这里以服务组件安装为例稍微的说下OSGi DS服务的生命周期模型,在OSGi DS中,当有新的Service Component安装时,首先会检查其是

基于Spring-DM实现分布式服务框架(DSF)(一)

经过上篇分析分布式服务框架的blog后,正式对之前的基于OSGi实现分布式服务框架的系列改名(顺便把分布式服务框架改为使用DSF缩写),因为已经决定基于Spring-DM来实现,为什么呢,而且为什么一定要是Spring-DM,而不直接说Spring呢? 今天是Spring-DM 1.0 release的大好日子,,不容易呀,做了这么久,具体怎么样还没来得及细看,不过之前有用过1.0 m2,已经觉得很不错了,相信1.0 release更不会失望. 在我眼里看来,Spring是个很大的东西,其实DS

基于Spring-DM实现分布式服务框架(DSF)(二)

在上篇分析完了在V 0.7需要干的活后,开始细化其中的实现细节,由于技术细节和之前想的有点不同,在细化的同时也稍做了调整,系统的架构仍然保持不变,在这篇blog中来看看实现每项任务的技术细节,之后就可以进入编码实现阶段了. 1.服务模型 采用OSGi的服务模型,在Spring中使用此服务模型时和Spring-DM中的osgi:service.osgi:reference基本一致,示例如下: 发布服务(将bulletinListAction以jndi的方式发布为dsf服务): <dsf:servi

联想企业网盘基于Docker构建分布式部署框架实践

本文讲的是联想企业网盘基于Docker构建分布式部署框架实践[编者的话]本文首先介绍了企业级分布式系统部署所面临的挑战,并且结合联想云存储自有框架研发经验分享了一些解决问题的思想和具体做法.最后还与Kubernetes项目进行了简单对比. 众所周知,企业网盘在这两年呈现爆发式增长,越来越多的企业选择企业网盘,来解决企业在业务过程中面临的数据集中存储.共享.分发.协同办公以及移动化等痛点需求.同时将企业网盘整合到各个业务系统中,大幅提高企业的数据流转效率和安全! 而联想企业网盘增长尤为迅速,仅联想

Dubbo分布式服务框架入门(附工程)

版权声明:本文为博主原创文章,转载注明出处http://blog.csdn.net/u013142781 目录(?)[+] 要想了解Dubbo是什么,我们不防先了解它有什么用.  使用场景:比如我想开发一个网上商城项目,这个网上商城呢,比较复杂,分为pc端web管理后台,微信端销售公众号,那么我们分成四个项目,pc端网站,微信端网站,还有一个后台服务项目,接口服务项目. 对数据库的操作的相关接口放到接口服务项目,这些接口的实现放在后台服务项目,pc端网站和微信端网站都依赖接口服务项目,调用后台数

基于mysql的分布式服务治理

问题描述 基于mysql的分布式服务治理 公司之前的分布式协调服务用的是zookeeper,现在准备用mysql替换zookeeper,做一个轻量的服务框架,就是把注册的服务和节点信息持久化在数据库中,需要的时候再从数据库中查询出来.基本的新增和查询功能都好实现,问题是如何监控已注册服务的状态变化?求有经验的大神指教 解决方案 我觉得这种需求zk比db更擅长. 如果非要用db的话,可以单独启动一个服务,去做监控的事情.

跨语言-能同时支撑多语言互为provider,consumer的分布式服务框架,开源的有吗?

问题描述 能同时支撑多语言互为provider,consumer的分布式服务框架,开源的有吗? 能同时支撑多语言互为provider,consumer的分布式服务框架,开源的有吗? 开源的分布式服务框架(dubbo,HSF等)都不支持跨语言(或许有其他,但是我不知道). 如果没有开源的,我的思路是基于同一种协议(hession,thrift,protobuff,avro等)把各种语言支撑的框架集成到一起(例如 php python c++ 的)形成一个支持多语言互为provider,consum