DOSGI-CXF和zookeeper的整合

来源:互联网 发布:最强手机象棋软件 编辑:程序博客网 时间:2024/05/21 07:55

上一篇文章中描述了在osgi的环境中如何发布webserivce,如何在spring-dm中注入webservice服务对象,或者普通的调用方式,这里我们主要讲下如何将webserivce服务发布到zookeeper上,主要是这方面的资料非常之少,只有官方的零星资料,无法让你做个直观的理解,这里总结下让大家可以了解下。
相比之前的方案,无论是使用spring-dm还是使用普通的webserivce对象发现方式都有个缺点,需要关心webserivce发布地址等参数,这个有时候会让人很烦,如果我们将普通的osgi服务发布成webservice服务后,还需要在客户端去配置下。这里我们介绍个方法不需要再配置这种参数,那就是将这种服务发布到zookeeper上,至于zookeeper是做什么用的,网上资料很多,我这里就以偏概全说下:是用来统一管理分布式服务的,我这里使用的osgi框架是felix,我就以felix做例子将。操作步骤如下:

第一步、将几个关键的jar包加入到我们的环境下,例如:cxf-dosgi-ri-discovery-local-1.6.0、cxf-dosgi-ri-discovery-distributed-zookeeper-server-config-1.6.0、cxf-dosgi-ri-discovery-distributed-zookeeper-server-1.6.0、cxf-dosgi-ri-discovery-distributed-1.6.0、zookeeper-3.3.2、org.apache.felix.fileinstall-3.4.2.jar;如果你使用的是DOSGI-CXF的单包模式,则不需要关心这些。

第二步、下载解压,启动zookeeper服务器,如何操作网上资料一大片,这里不再多说,保证端口在2181就就可以了。

第三步、将zookeeper配置文件org.apache.cxf.dosgi.discovery.zookeeper.cfg放在felix的安装目录下(注意felix的安装目录是可以在启动时传入参数配置的),这个文件的内容如下:

zookeeper.host = 127.0.0.1zookeeper.port = 2181zookeeper.timeout = 3000

第四步、发布服务,这个和上一步中发布服务的方式是一样的,发布后可以查看服务信息,可以使用zooinspector来观测发布的服务信息。
先下载这软件,下载地址:https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip,
然后解压后,通过cmd进入build目录,然后执行命令:java -jar zookeeper-dev-ZooInspector.jar,则会看到如下图的信息(注意这里的图片只是个例子,和当前代码不是很符合),如图:
这里是截图
也可以使用zookeeper的客户端的get命令来查看,命令如:
get /osgi/service_registry/g2/cxf/test/service/ICxfTestService/0.0.0.0#3456##cxf-test-service。
总之格式特点就是:/osgi/service_registry/发布的服务的接口的全名/地址#端口##服务上下文。

第五步、调用也需要那加个jar包,另外也需要配置zookeeper的配置文件如第三步中,另外在spring的配置文件中,配置如下:

  <osgi:reference id="dinnerServiceRef"    interface="org.apache.cxf.dosgi.samples.springdm.DinnerService"/>  <bean class="org.apache.cxf.dosgi.samples.springdm.client.DinnerServiceConsumer"        init-method="start">    <property name="dinnerService" ref="dinnerServiceRef"/>  </bean></beans>

在这里,并不需要关心webservice的发布地址、端口等参数,这些东西dosgi-cxf已经自动帮我们做了,其实原理也很简单,dosgi-cxf和zookeeper进行交互获取到zookeeper上发布的webservice信息,然后根据这个信息动态生成webservice代理对象,然后通过spring-dm注入到调用对象中。而且这种方式有个非常大的好处是,如果我们要把我们的一些提供服务的组件切分出去,单独搞个系统,然后在这个系统上将服务发布为webservice,而这个时候调用端(客户端)的组件是不需要做修改的,只需要全局范围内配置个zookeeper就行了,这才符合组件化的思路,试想下如果没有这个机制,难道我们要修改每个调用端的配置,将这个webservice的地址都配置进去吗?而且今后webservice地址变了呢?我们需要一个个去找哪些地方调用了,然后再改一遍配置,想想都觉得现在很幸福。这里的代码和上一篇代码中的一致,这里没有贴。

参考文档:
http://cxf.apache.org/dosgi-architecture.html
http://www.cnblogs.com/Mainz/p/3548396.html

0 0
原创粉丝点击