`
ecsoftcn
  • 浏览: 23506 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于远程调用(XFire/HttpInvoker/Hessian etc.)及远程服务管理的一些随想(中)

阅读更多

 

尽管服务池解决了一些问题,在某种程度上降低了复杂度,但仍存在如下一些问题:

*         服务的运行期动态注册 <o:p></o:p>

*         服务的自动注入( IoC <o:p></o:p>

*         透明化服务 ID 的传递 <o:p></o:p>

<o:p> </o:p>

在服务池( ServicePool )概念的基础上进行扩展,我们得出了如下的系统模型:

 

 

 

在核心位置上是一个服务中心资源库( ServiceRepository ),存储了系统中用到的所有的远程服务。服务采取动态注册的机制,由对外提供的服务注册器( ServiceRegister )提供服务注册功能。外部系统可以实现该接口向资源中心注册服务。提供了一个启动时运行的注册器,可以把静态配置在系统中的服务都注册进来。 <o:p></o:p>

<o:p> </o:p>

       服务的生成、管理等均由服务中心自己维护,委托服务代理生成器( ServiceProxyGenerator )完成服务的创建。可以针对现有的远程调用方式,如 XFire,HttpInvoker,Hessian 等创建服务代理,也可以针对自己定义的远程调用方式创建服务代理,由 CustomServiceProxyGenerator 完成该功能。 <o:p></o:p>

       一个服务模型包括 5 个因素: <o:p></o:p>

*         服务接口 serviceClass<o:p></o:p>

*         服务 ID serviceId<o:p></o:p>

*         服务类型 serviceType<o:p></o:p>

*         服务地址 serviceUrl<o:p></o:p>

*         附加属性 props<o:p></o:p>

查找一个服务需要两个因素,一个是服务接口,另一个是服务 ID 。这两个因素共同决定了一个服务,既服务中心内部的“服务 ID ”。通过这种方式,可以允许存在多个 ID 相同但接口不同的服务,也可以存在多个接口相同但 ID 不同的服务。 <o:p></o:p>

<o:p> </o:p>

服务 ID 的获取是系统中一个关键的功能,这部分对程序员来说应该是透明的,由系统自己维护。相应的提供了一个服务 ID 提供者 (ServiceIdProvider) 接口,由实现该接口的子类完成服务 ID 获取功能(这是比较关键的地方,需要特殊考虑)。 <o:p></o:p>

<o:p> </o:p>

对于程序员来说,使用服务中心里的服务再也不能比这样再简单了!看看配置:

xml 代码

 

  1. < bean id = "helloHttpInvokerService" parent = "abstractServiceProxyFactory" >    
  2.     < property name = "serviceInterface" >    
  3.         < value > com.tonysoft.common.service.repository.example.HelloHttpInvoker  value >    
  4.      property >    
  5.   bean >    

再看如何使用这个 bean  

  1. private HelloHttpInvoker       helloHttpInvokerService ;    
  2. public void testHttpInvoker() {    
  3.         assertNotNull( "helloHttpInvokerService can't be null !" , helloHttpInvokerService );    
  4.         assertEquals ( "Hello , HttpInvoker !" , helloHttpInvokerService .sayHello());    
  5. }    
  6.     /**   
  7.      * @param helloHttpInvokerService   
  8.      *             the helloHttpInvokerService to set   
  9.      */    
  10.   
  11.     public void setHelloHttpInvokerService(HelloHttpInvoker helloHttpInvokerService) {    
  12.         this . helloHttpInvokerService = helloHttpInvokerService;    
  13.     }    

 

就是这样的简单! Spring 会把这个 bean 自动注入到程序中,可以象使用其他任何 bean 一样使用它!程序员完全不用关心该服务由谁提供、采用什么技术,他只要知道系统中存在这样一个服务就 OK 了。该技术彻底向程序员屏蔽了底层技术的实现细节,以统一的方式访问任何形式的远程服务。至于服务是如何生成、如何配置的将在后面叙述。 <o:p></o:p>

<o:p> </o:p>

服务( Service Bean )是如何实现自动注入( IoC )的呢? <o:p></o:p>

注意到上面配置的 bean 都继承了“ abstractServiceProxyFactory ”,它是一个工厂 bean ,负责根据给定的接口类型,到服务中心( ServiceRepository )查找服务,并生成服务代理。我们来看一下它的核心代码:

java 代码

 

 

  1. /**   
  2.   * 服务代理工厂。   
  3.   *   
  4.   * 

     

     
  5.   * 该工厂对程序员屏蔽了服务实现的技术细节,对于 XFire 、 Hessian 、 HttpInvoker 等常用远程服务形式进行封装。   
  6.   *   
  7.   * 

     

     
  8.   * 程序员只需要提供一个服务接口(契约),该工厂会从服务中心  ServiceRepository  中查找符合该接口的远程服务实例。   
  9.   *   
  10.   * 

     

     
  11.   * 查找的规则是由服务 ID 提供者所提供的服务 ID 和服务接口名字共同组成的服务关键字匹配。   
  12.   *   
  13.   * @author Tony   
  14.   */    
  15. public class ServiceProxyFactory implements FactoryBean {    
  16.   
  17.     /** 服务中心 */    
  18.     private ServiceRepository serviceRepository ;    
  19.   
  20.     /** 服务 ID 提供者 */    
  21.     private ServiceIdProvider serviceIdProvider ;    
  22.     /** 服务接口 */    
  23.     private Class             serviceInterface ;    
  24.     /**  
  25.      * @see org.springframework.beans.factory.FactoryBean#getObject()   
  26.      */    
  27.     public Object getObject() throws Exception {    
  28.         return ProxyFactory.getProxy(getObjectType(), new ServiceProxyInterceptor());    
  29. //        return serviceRepository.getService(serviceInterface, serviceIdProvider.getCurrentServiceId());    
  30.     }    
  31.     /**  
  32.      * @see org.springframework.beans.factory.FactoryBean#getObjectType()   
  33.      */    
  34.     public Class getObjectType() {    
  35.         return serviceInterface ;    
  36.     }    
  37.     /*   
  38.      * @see org.springframework.beans.factory.FactoryBean#isSingleton()   
  39.      */    
  40.     public boolean isSingleton() {    
  41.         return true ;    
  42.     }    
  43.     /*   
  44.      * 远程服务代理拦截器。   
  45.      */    
  46.     private class ServiceProxyInterceptor implements MethodInterceptor {    
  47.         /*   
  48.          * @see org.aopalliance.intercept.MethodInterceptor#invoke(org.aopalliance.intercept.MethodInvocation)   
  49.          */    
  50.         public Object invoke(MethodInvocation invocation) throws Throwable {    
  51.             Method method = invocation.getMethod();    
  52.             Object[] args = invocation.getArguments();    
  53.             Object client = getClient();    
  54.             return method.invoke(client, args);    
  55.         }    
  56.         private Object getClient() {    
  57.             try {    
  58.                  return serviceRepository .getService( serviceInterface , serviceIdProvider .getCurrentServiceId());    
  59.             } catch (ServiceException e) {    
  60.                 // TODO    
  61.                 e.printStackTrace();    
  62.                 return null ;    
  63.             }    
  64.         }    
  65.     }    
  66.     // ---- 容器自动注入 ----    
  67.     ······   

 

真正的魅力就在这个地方。根据服务接口类型和服务 ID ,从服务中心获取特定的服务。服务接口是配置好的, 而服务 ID 则在运行时才能确定,根据不同的应用、不同的策略提供不同的 ServiceIdProvider 。其中用到了 Spring FactoryBean 和拦截器,至于为什么要在这里使用拦截器,可以参考 Spring 框架的源码。 <o:p></o:p>

<o:p> </o:p>

 

关于远程调用(XFire/HttpInvoker/Hessian etc.)及远程服务管理的一些随想(上)

关于远程调用(XFire/HttpInvoker/Hessian etc.)及远程服务管理的一些随想(下)

分享到:
评论
6 楼 stamen 2007-03-28  
不错,学习中。。。。
5 楼 shaucle 2007-03-19  
ws俺不是很清楚

但好像越看越像uddi+spring...
4 楼 mingisme 2007-03-19  
ecsoftcn 写道
mingisme 写道
LZ你用的VP Suite是企业版吗?能否给我一个license?
wang.ming@shixintech.com


我用的是社区版,图片是用工具截下来的:)
截图工具是“FastStone Capture”,非常好用。


谢谢了。社区版的导出图片背景图里有community edition等字样,不爽。另外整理word和pdf等功能也限制了。有个enterprise版就爽了。
3 楼 ecsoftcn 2007-03-19  
mingisme 写道
LZ你用的VP Suite是企业版吗?能否给我一个license?
wang.ming@shixintech.com


我用的是社区版,图片是用工具截下来的:)
截图工具是“FastStone Capture”,非常好用。
2 楼 justcode 2007-03-18  
确实是好文,J2EE的远程调用一直困扰着一些程序员,看了这篇文章后感觉不再那么可怕了.
1 楼 mingisme 2007-03-18  
LZ你用的VP Suite是企业版吗?能否给我一个license?
wang.ming@shixintech.com

相关推荐

    Hessian 、 HttpInvoker 、 XFire 、 Axis

    通过定义一个`RemoteServicePool`接口,我们可以将具体的远程调用技术(如Hessian、HttpInvoker、XFire)的细节隐藏起来,开发者只需要通过接口方法`getService(String serviceId)`来获取服务,而无需关心服务的实现...

    远程调用服务框架

    Spring通过RmiProxyFactoryBean支持RMI服务的透明调用,客户端无需关心底层的网络通信细节,只需要像调用本地方法一样调用远程服务。 3. **Hessian**:Hessian是一种轻量级的二进制RPC协议,由Caucho公司开发。它...

    xfire-1.2.6.rar xfire-1.2.6.rar xfire-1.2.6.rar

    在1.2.6版本中,它提供了稳定、高效的服务,为游戏开发者提供了一种便捷的方式来构建和管理游戏网络架构。此压缩包文件包含了多个关键组件,让我们一一解析。 首先,`xfire-all-1.2.6.jar`是核心库文件,它集成了...

    xfire客户端jar包

    在描述中提到的"Demo样板",通常是一个预配置的示例程序,用于演示如何使用xfire客户端来连接和调用Web服务。然而,由于每个Web服务都有其特定的WSDL(Web服务描述语言)文件,定义了服务的接口和操作,因此这个Demo...

    xfire实现的实例和远程调用的客户端代码

    XFire提供了一个动态代理机制,使得我们可以像调用本地方法一样调用远程Web服务。客户端首先会创建一个服务代理,然后通过这个代理调用服务器端的方法。 ```java MyWebService service = (MyWebService) ...

    xfire 5分钟开发一个完整实例.doc

    ### 使用XFire在MyEclipse中快速开发WebService实例 #### 概述 本文将通过一个具体实例介绍如何在MyEclipse环境下使用XFire框架来快速搭建WebService应用。本例涉及的关键技术包括Eclipse IDE、Tomcat服务器、Java...

    xfire web service调用代码

    在IT行业中,Web服务是一种广泛使用的技术,它允许不同应用程序之间进行交互和数据交换。XFire(现称为CXF)是Java平台上的一个开源框架,专门用于构建和消费Web服务。本篇将深入探讨XFire Web服务的调用代码及其...

    Xfire调用webservice无法传递参数问题

    Xfire是Java中的一个轻量级Web服务框架,它简化了Web服务的开发和部署,支持WSDL(Web Services Description Language)自动生成,使得服务消费者可以方便地找到并调用服务。 标题“Xfire调用WebService无法传递...

    xFire发布Web Service,并调用远程服务

    在本主题中,我们将深入探讨如何使用xFire来发布Web服务以及如何调用远程服务。 首先,让我们了解xFire的核心功能。xFire是一个基于Java的框架,它提供了对SOAP(Simple Object Access Protocol)协议的强大支持,...

    实现webServices接口调用demo

    本教程将深入讲解如何使用XFire在Java环境中实现Web服务接口的调用,包括内部和外部访问。 一、Web服务简介 Web服务是通过SOAP(Simple Object Access Protocol)协议,使用HTTP作为传输层,XML作为数据交换格式的...

    XFire_lib.jar

    《XFire_lib.jar在Spring整合中的关键作用及应用》 在现代软件开发中,Spring框架因其强大的依赖注入、AOP(面向切面编程)以及IoC(控制反转)特性,被广泛应用于Java企业级应用中。然而,为了实现更丰富的功能,...

    Spring+Hibernate+Xfire实现远程分布式调用

    这些技术都是Java开发中的重要工具,Spring作为全面的框架提供了服务管理和依赖注入,Hibernate则是流行的ORM(对象关系映射)解决方案,而Xfire是用于构建SOAP Web服务的库。 首先,Spring框架在分布式系统中的...

    Java使用XFire调用WebService接口

    5. **集成Spring框架**:XFire与Spring的良好集成使得开发者可以利用Spring的依赖注入和配置管理能力,轻松地在应用中引入Web服务。 6. **异常处理**:在调用Web服务时,可能会遇到网络问题或服务端错误,XFire会将...

    java使用XFire调用webService接口

    在本文中,我们将学习如何使用 XFire 框架在 Java 中调用 webService 接口。XFIRE 是一个基于 Java 的开源框架,用于简化 Web 服务的开发和集成。下面,我们将通过一个简单的例子,展示如何使用 XFire 调用 ...

    spring远程调用和xfire aegis 源代码上传

    标题 "spring远程调用和xfire aegis 源代码上传" 涉及到的是在Java开发中使用Spring框架进行远程过程调用(RPC)以及整合XFire和Aegis库来实现服务间的通信。这一主题是分布式系统设计中的一个重要组成部分,特别是...

    XFire返回自定义实体类实例

    在IT行业中,Web服务是一种广泛使用的技术,它允许不同的应用程序之间进行通信和数据交换。XFire是Java平台上的一个开源Web服务框架,它为开发者提供了简单、高效的方式来创建和消费Web服务。本教程将深入探讨如何...

    xfire开发指南.......

    - **嵌入式服务**: 将XFire服务嵌入到桌面应用或移动应用中。 - **JSR 181**: 利用JSR 181注解简化开发流程。 - **其他高级特性**: 如服务安全性、性能优化等。 #### 六、结语 - **贡献者**: 晁岳攀(smallnest@...

    Xfire的client.zip_Xfire客户端代码_webservice

    在本案例中,"Xfire的client.zip"是一个包含了Xfire客户端代码的压缩包,主要用于调用Web服务。 Xfire客户端代码是实现与Xfire服务器通信的代码库,它可能包含了多种语言的实现,如Java、C#或Python等。这些代码...

    Java使用XFire调用WebService接口.docx编程资料

    &lt;servlet-class&gt;org.codehaus.xfire.transport.servlet.XFireConfigurableServlet&lt;/servlet-class&gt; &lt;load-on-startup&gt;0&lt;/load-on-startup&gt; &lt;/servlet&gt; &lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt; ...

    XFire 和spring完整集成实例

    import org.codehaus.xfire.client.XFireProxyFactory; import org.codehaus.xfire.service.Service; import org.codehaus.xfire.service.binding.ObjectServiceFactory; import com.xfire.core.entity.UserInfo; ...

Global site tag (gtag.js) - Google Analytics