上篇说到,经过分析后决定选用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的生命周期管理复杂了很多。
<<
基于OSGi实现分布式服务框架历程(二)
<<
基于OSGi实现分布式服务框架历程(一)
>>
基于OSGi实现分布式服务框架历程(四)