尽管服务池解决了一些问题,在某种程度上降低了复杂度,但仍存在如下一些问题:
服务的运行期动态注册 <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 代码
- < bean id = "helloHttpInvokerService" parent = "abstractServiceProxyFactory" >
- < property name = "serviceInterface" >
- < value > com.tonysoft.common.service.repository.example.HelloHttpInvoker value >
- property >
- bean >
再看如何使用这个 bean :
- private HelloHttpInvoker helloHttpInvokerService ;
- public void testHttpInvoker() {
- assertNotNull( "helloHttpInvokerService can't be null !" , helloHttpInvokerService );
- assertEquals ( "Hello , HttpInvoker !" , helloHttpInvokerService .sayHello());
- }
-
-
-
-
-
- public void setHelloHttpInvokerService(HelloHttpInvoker helloHttpInvokerService) {
- this . helloHttpInvokerService = helloHttpInvokerService;
- }
就是这样的简单! Spring 会把这个 bean 自动注入到程序中,可以象使用其他任何 bean 一样使用它!程序员完全不用关心该服务由谁提供、采用什么技术,他只要知道系统中存在这样一个服务就 OK 了。该技术彻底向程序员屏蔽了底层技术的实现细节,以统一的方式访问任何形式的远程服务。至于服务是如何生成、如何配置的将在后面叙述。 <o:p></o:p>
<o:p> </o:p>
服务( Service Bean )是如何实现自动注入( IoC )的呢? <o:p></o:p>
注意到上面配置的 bean 都继承了“ abstractServiceProxyFactory ”,它是一个工厂 bean ,负责根据给定的接口类型,到服务中心( ServiceRepository )查找服务,并生成服务代理。我们来看一下它的核心代码:
java 代码
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- public class ServiceProxyFactory implements FactoryBean {
-
-
- private ServiceRepository serviceRepository ;
-
-
- private ServiceIdProvider serviceIdProvider ;
-
- private Class serviceInterface ;
-
-
-
- public Object getObject() throws Exception {
- return ProxyFactory.getProxy(getObjectType(), new ServiceProxyInterceptor());
-
- }
-
-
-
- public Class getObjectType() {
- return serviceInterface ;
- }
-
-
-
- public boolean isSingleton() {
- return true ;
- }
-
-
-
- private class ServiceProxyInterceptor implements MethodInterceptor {
-
-
-
- public Object invoke(MethodInvocation invocation) throws Throwable {
- Method method = invocation.getMethod();
- Object[] args = invocation.getArguments();
- Object client = getClient();
- return method.invoke(client, args);
- }
- private Object getClient() {
- try {
- return serviceRepository .getService( serviceInterface , serviceIdProvider .getCurrentServiceId());
- } catch (ServiceException e) {
-
- e.printStackTrace();
- return null ;
- }
- }
- }
-
- ······
真正的魅力就在这个地方。根据服务接口类型和服务 ID ,从服务中心获取特定的服务。服务接口是配置好的, 而服务 ID 则在运行时才能确定,根据不同的应用、不同的策略提供不同的 ServiceIdProvider 。其中用到了 Spring 的 FactoryBean 和拦截器,至于为什么要在这里使用拦截器,可以参考 Spring 框架的源码。 <o:p></o:p>
<o:p> </o:p>
关于远程调用(XFire/HttpInvoker/Hessian etc.)及远程服务管理的一些随想(上)
关于远程调用(XFire/HttpInvoker/Hessian etc.)及远程服务管理的一些随想(下)
分享到:
相关推荐
通过定义一个`RemoteServicePool`接口,我们可以将具体的远程调用技术(如Hessian、HttpInvoker、XFire)的细节隐藏起来,开发者只需要通过接口方法`getService(String serviceId)`来获取服务,而无需关心服务的实现...
Spring通过RmiProxyFactoryBean支持RMI服务的透明调用,客户端无需关心底层的网络通信细节,只需要像调用本地方法一样调用远程服务。 3. **Hessian**:Hessian是一种轻量级的二进制RPC协议,由Caucho公司开发。它...
在1.2.6版本中,它提供了稳定、高效的服务,为游戏开发者提供了一种便捷的方式来构建和管理游戏网络架构。此压缩包文件包含了多个关键组件,让我们一一解析。 首先,`xfire-all-1.2.6.jar`是核心库文件,它集成了...
在描述中提到的"Demo样板",通常是一个预配置的示例程序,用于演示如何使用xfire客户端来连接和调用Web服务。然而,由于每个Web服务都有其特定的WSDL(Web服务描述语言)文件,定义了服务的接口和操作,因此这个Demo...
XFire提供了一个动态代理机制,使得我们可以像调用本地方法一样调用远程Web服务。客户端首先会创建一个服务代理,然后通过这个代理调用服务器端的方法。 ```java MyWebService service = (MyWebService) ...
### 使用XFire在MyEclipse中快速开发WebService实例 #### 概述 本文将通过一个具体实例介绍如何在MyEclipse环境下使用XFire框架来快速搭建WebService应用。本例涉及的关键技术包括Eclipse IDE、Tomcat服务器、Java...
在IT行业中,Web服务是一种广泛使用的技术,它允许不同应用程序之间进行交互和数据交换。XFire(现称为CXF)是Java平台上的一个开源框架,专门用于构建和消费Web服务。本篇将深入探讨XFire Web服务的调用代码及其...
Xfire是Java中的一个轻量级Web服务框架,它简化了Web服务的开发和部署,支持WSDL(Web Services Description Language)自动生成,使得服务消费者可以方便地找到并调用服务。 标题“Xfire调用WebService无法传递...
在本主题中,我们将深入探讨如何使用xFire来发布Web服务以及如何调用远程服务。 首先,让我们了解xFire的核心功能。xFire是一个基于Java的框架,它提供了对SOAP(Simple Object Access Protocol)协议的强大支持,...
本教程将深入讲解如何使用XFire在Java环境中实现Web服务接口的调用,包括内部和外部访问。 一、Web服务简介 Web服务是通过SOAP(Simple Object Access Protocol)协议,使用HTTP作为传输层,XML作为数据交换格式的...
《XFire_lib.jar在Spring整合中的关键作用及应用》 在现代软件开发中,Spring框架因其强大的依赖注入、AOP(面向切面编程)以及IoC(控制反转)特性,被广泛应用于Java企业级应用中。然而,为了实现更丰富的功能,...
这些技术都是Java开发中的重要工具,Spring作为全面的框架提供了服务管理和依赖注入,Hibernate则是流行的ORM(对象关系映射)解决方案,而Xfire是用于构建SOAP Web服务的库。 首先,Spring框架在分布式系统中的...
5. **集成Spring框架**:XFire与Spring的良好集成使得开发者可以利用Spring的依赖注入和配置管理能力,轻松地在应用中引入Web服务。 6. **异常处理**:在调用Web服务时,可能会遇到网络问题或服务端错误,XFire会将...
在本文中,我们将学习如何使用 XFire 框架在 Java 中调用 webService 接口。XFIRE 是一个基于 Java 的开源框架,用于简化 Web 服务的开发和集成。下面,我们将通过一个简单的例子,展示如何使用 XFire 调用 ...
标题 "spring远程调用和xfire aegis 源代码上传" 涉及到的是在Java开发中使用Spring框架进行远程过程调用(RPC)以及整合XFire和Aegis库来实现服务间的通信。这一主题是分布式系统设计中的一个重要组成部分,特别是...
在IT行业中,Web服务是一种广泛使用的技术,它允许不同的应用程序之间进行通信和数据交换。XFire是Java平台上的一个开源Web服务框架,它为开发者提供了简单、高效的方式来创建和消费Web服务。本教程将深入探讨如何...
- **嵌入式服务**: 将XFire服务嵌入到桌面应用或移动应用中。 - **JSR 181**: 利用JSR 181注解简化开发流程。 - **其他高级特性**: 如服务安全性、性能优化等。 #### 六、结语 - **贡献者**: 晁岳攀(smallnest@...
在本案例中,"Xfire的client.zip"是一个包含了Xfire客户端代码的压缩包,主要用于调用Web服务。 Xfire客户端代码是实现与Xfire服务器通信的代码库,它可能包含了多种语言的实现,如Java、C#或Python等。这些代码...
<servlet-class>org.codehaus.xfire.transport.servlet.XFireConfigurableServlet</servlet-class> <load-on-startup>0</load-on-startup> </servlet> <servlet-name>XFireServlet</servlet-name> ...
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; ...