在上篇分析完了在V 0.7需要干的活后,开始细化其中的实现细节,由于技术细节和之前想的有点不同,在细化的同时也稍做了调整,系统的架构仍然保持不变,在这篇blog中来看看实现每项任务的技术细节,之后就可以进入编码实现阶段了。
1、服务模型
采用OSGi的服务模型,在Spring中使用此服务模型时和Spring-DM中的osgi:service、osgi:reference基本一致,示例如下:
发布服务(将bulletinListAction以jndi的方式发布为dsf服务):
<dsf:service id="BulletinListCommandService" version="1.0" ref="bulletinListAction"
interface="cn.org.osgi.xwork.action.IAction">
<dsf:service-properties>
<prop key="command">LIST</prop>
</dsf:service-properties>
<!--以jndi的方式对外发布-->
<dsf:jndi/>
</dsf:service>
引用服务(引用dsf服务):
<dsf:reference id="extensionRegistry" interface="org.eclipse.core.runtime.IExtensionRegistry" version="[1.0,2,0)" cardinality="1..x" retries="3" timeout="5000">
<dsf:service-properties>
<prop key="command">LIST</prop>
</dsf:service-properties>
<!--以jndi的方式调用远程服务-->
<dsf:jndi/>
</dsf:reference>
关于服务模型所支持的所有spring的配置在之后我会公布相应的xsd文件。
2、服务中心
在查询了memcachedb的相关资料后,感觉目前它的java接口好像还不太好用,决定直接采用memcached,自己来实现存储,由于服务模型信息的数据其实非常的小,而且维护改动的频率并不是那么的高,暂时采用文件方式直接存储,服务中心在注册时将文件存储在共享的空间中,之后将文件解析为服务模型对象,放入memcached,当有更新、删除动作时同样做相应的处理,文件存储以及memcached交互都是比较容易的事,将文件解析为服务模型对象采用xstream完成。
服务中心基于Spring-DM、Webwork-OSGi简单实现。
3、发布服务
使用方法已经在上面示例了,具体实现步骤则为:
提供扩展的spring xml namespace的支持;
编写DSFJNDIExporter class,基于Spring的JNDITemplate实现将spring bean注册到JNDI的过程(要求为在本地启动jndi server,默认采用jboss jnp)。
4、调用服务
这个部分之前分析错误,之前忽略了服务应用端是不知道目标服务的地址的,需要通过分布式缓存查询才可得知,因此不是直接采用Spring的JNDIObjectFactoryBean就可以实现的,需要编写自己的DSFObjectFactoryBean,具体实现步骤为:
提供扩展的spring xml namespace的支持;
编写DSFObjectFactoryBean class,由这个bean来负责调用分布式缓存,查询目标服务地址,由于目前只有JNDI方式,在获取到目标服务地址后仍然通过Spring的JNDIObjectFactoryBean完成剩余工作。
经过上面四步技术实现细节的分析,可以来编码完成V 0.7的实现了。