Remote Method Invocation(RMI): 也就是远程方法调用。允许Java程序调用网络中另一台机器的Java方法,
仿佛那个方法就在本地机器上一样。
Hessian:一个轻量级的Java远程访问的解决方案。Hessian很像WebService,只不过它不使用SOAP协议,而是使
用它自己的binary协议。Hessian的server端提供一个Servlet基类,client端获得一个Service接口(也就
是stub)之后调用上面的方法,stub将方法调用marshal之后,通过HTTP传到server,server借助
reflection调用Service方法。
EJB:经典的、重量级的远程访问技术。通过Remote接口提供自己的业务服务,使用JNDI定位远程服务。
Burlap: 是利用XML RPC协议的远程访问技术,也是一种轻量级的实现。利用Burlap WebService协议不需要大型的框架,也不用学习其它协议。
AIX-RPC:表示XML的远程调用。从J2EE1.4开始引进,也是J2EE1.4 WebService的核心技术.
以下主要介绍如何在应用中配置使用Hessian和XFire:
通过Hessian实现远程接口调用
Hessian是一个轻量级的远程调用方式,相比WebService,Hessian更简单、快捷。它的封装已经很好,需要额外做的事情不多。
选择Hessian的理由有以下几点:
使用 简单,Spring提供了很好的封装,通过Hessian访问远程方法,就像访问本地方法一样
已有很多成功应用,轻量级、效率高。
Hessian使用自身序列化算法,比java序列化快很多。
Hessian的问题
Hessian序列化对List、Map支持不好,接口的定义过程中需要注意,不使用这两个东西。一定要用的地方,可以用对象数组去代替。
Hessian使用配置服务端
web.xml中通过spring提供服务
<servlet>
<servlet-name>service</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>service</servlet-name>
<url-pattern>/service/*</url-pattern>
</servlet-mapping>
|
增加service-servlet.xml
HessianServiceExporter可将一个普通bean导出成远程服务
<bean name="/xxxAdapter" class="org.springframework.remoting.caucho.HessianServiceExporter">
<property name="serviceInterface" value="com.alibaba.xxx.xxx.XxxAdapter"/>
<property name="service" ref="xxxAdapterImpl"/>
<property name="serializerFactory" ref="beanSerializerFactory"/>
</bean>
|
增加简单的安全校验
<bean name="/xxxAdapter" class="com.alibaba.toolkit.remotesupport.hessian.SecurityHessianServiceExporter">
<property name="serviceInterface" value="com.alibaba.xxx.xxx.XxxAdapter"/>
<property name="service" ref="xxxAdapterImpl"/>
<property name="serializerFactory" ref="beanSerializerFactory"/>
<property name="securityToken" ref="securityToken"/>
</bean>
|
其中,XxAdapter和XxAdapterImpl分别是demo的接口和实现类,传输的测试对象,因为用hessian的序列化,不需要实现Serializable接口,另外,不能使用List,Map等属性。
启动tomcat,用浏览器访问http://localhost:8080/service/xxAdapter,将看到Hessian的提示信息,由于Hessian只支持POST方式访问,提示信息是Hessian后台丢出的异常。
•3.1.4 客户端
为Hessian增加调用超时的设置
<bean id="xxxAdapter" class="com.alibaba.toolkit.remotesupport.hessian.TimeOutHessianProxyFactoryBean" lazy-init="true">
<property name="serviceInterface" value="com.alibaba.xxx.xxx.XxxAdapter"/>
<property name="readTimeout" value="${readtimeout}"/>
<property name="connectTimeout" value="${connecttimeout}"/>
<property name="serviceUrl">
<value>${remotehost}/interface/xxxAdapter</value>
</property>
</bean>
|
增加简单的安全校验
<bean id="xxxAdapter" class="com.alibaba.toolkit.remotesupport.hessian.SecurityTimeOutHessianProxyFactoryBean" lazy-init="true">
<property name="serviceInterface" value="com.alibaba.xxx.xxx.XxxAdapter"/>
<property name="readTimeout" value="${readtimeout}"/>
<property name="connectTimeout" value="${connecttimeout}"/>
<property name="serviceUrl">
<value>${remotehost}/interface/xxxAdapter</value>
</property>
<property name="securityToken" ref="securityToken"/>
</bean>
|
Hessian比较适合内部调用,远程的webservice调用参考XFire
XFire
基本功能
支持主要的WS标准: SOAP, WSDL, WS-I Basic Profile, WS-Addressing, WS-Security, 等.
支持:POJOs, XMLBeans, JAXB 1.1, JAXB 2.0, Castor
支持多种传输协议 - HTTP, JMS, XMPP, In-JVM, etc.
支持Spring
支持JBI
更多细节参考(http://xfire.codehaus.org)
Xfire使用配置服务端
web.xml
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<!--可指定文件名称-->
<param-value>xfire-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
|
增加xfire-servlet.xml
<beans default-autowire="byName">
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="urlMap">
<map>
<entry key="/EchoService">
<ref bean="echo"/>
</entry>
</map>
</property>
</bean>
<bean id="echo" class="org.codehaus.xfire.spring.remoting.XFireExporter">
<property name="serviceFactory">
<ref bean="xfire.serviceFactory"/>
</property>
<property name="xfire">
<ref bean="xfire"/>
</property>
<property name="serviceBean">
<ref bean="echoBean"/>
</property>
<property name="serviceClass">
<value>remotesupport.demo.Echo</value>
</property>
<!--安全校验-->
<property name="inHandlers" ref="authenticationHandler"/>
</bean>
<bean id="authenticationHandler" class="remotesupport.demo.AuthenticationHandler"/>
</beans>
|
通过webx引入echoBean
services.xml
...
<service name="BeanFactoryService" class="com.alibaba.service.spring.DefaultBeanFactoryService">
<property name="bean.descriptors">
<value>/WEB-INF/bean/demo.xml</value>
</property>
</service>
...
|
Demo.xml
<beans default-autowire="byName">
<bean id="echoBean" class="remotesupport.demo.EchoImpl"/>
</beans>
|
客户端
<beans default-autowire="byName">
<bean id="echo" class="org.codehaus.xfire.spring.remoting.XFireClientFactoryBean">
<property name="serviceClass">
<value>remotesupport.demo.Echo</value>
</property>
<property name="wsdlDocumentUrl">
<value>http://localhost:8080/remote-demo/services/Echo?WSDL</value>
</property>
<property name="properties">
<map>
<!--超时-->
<entry key="http.timeout">
<value>1000</value>
</entry>
</map>
</property>
<!--安全校验--->
<property name="outHandlers" ref="authHandler"/>
</bean>
<bean id="authHandler" class="remotesupport.demo.ClientAuthenticationHandler"/>
</beans>
|
Xfire的优点
屏蔽了xml解析。通过xfie的eclipse插件根据wsdl来生成客户端调用代码,默认可以生成以 JAXB和XmlBeans两种解析方式的调用代码。
Xfire eclipse插件:http://dist.codehaus.org/xfire/update/
和Spring集成的很好
速度优势,具体查看XFire官方文档
远程调用的问题
单纯的远程调用存在一些问题。
无法保证事物
描述
一个事物处理中,远程调用成功、本地的后续操作失败,怎么让远程的rollback。这种应用通常需要很高的可靠性,比如对资金的操作等。
已知解决办法
在业务层面实现两阶段提交。举例:增加一种中间状态,事物中设置为中间状态,当事物结束后,通过额外的一次调用来提交最后的状态;为了处理最后的提交没到达的问题,在远程需要增加会查的功能-根据特定的ID询问发起方该如何处理过期的中间状态。
该方式需要业务作较大的改进。
另外XA也是一种方式,但有严重的性能问题。
分享到:
相关推荐
远程调用技术是分布式系统中不可或缺的一部分,它允许不同计算机之间的程序进行通信和协作,实现数据交换和服务共享。代码追踪在此领域中起着至关重要的作用,帮助开发者理解、调试和优化远程调用的过程。以下是对...
本主题聚焦于"基于Spring Boot的两个项目之间的远程调用",这是一个常见的需求,特别是在分布式系统中。远程调用允许不同服务之间相互通信,实现数据共享和功能协同。 1. **什么是远程调用** 远程调用(Remote ...
3. **远程调用技术**: 在VBScript中实现远程调用,可能涉及到ActiveX组件、Web服务(如SOAP)、HTTP请求或COM对象等。例如,可以通过XMLHttpRequest对象发送HTTP请求到服务器上的Web服务接口,或者利用WMI...
本文探讨的是一种基于动态代理的Java远程调用框架,旨在解决传统远程调用技术如RMI(Remote Method Invocation)所面临的挑战。 RMI是Java平台上的基础远程调用技术,自JDK 1.1开始引入。它允许对象方法在不同的JVM...
在IT领域,远程调用对象(Remote Procedure Call, RPC)是一种常见的通信机制,它允许一个程序在不关心网络细节的情况下,调用运行在另一台计算机上的程序或服务。本示例将聚焦于VB(Visual Basic)环境下的RPC实现...
在IT行业中,Spring框架是Java开发中的一个核心组件,它提供了丰富的功能,...不过,需要注意的是,HTTP远程调用可能会引入额外的网络延迟,因此在性能敏感的场景下,可能需要考虑其他的远程调用技术,如RMI或gRPC。
远程调用是分布式系统中的关键技术,它允许不同的计算资源(如服务器、进程或服务)之间进行通信和数据交换,仿佛它们是在同一台机器上运行。这一技术在大型网络应用、微服务架构以及云计算环境中尤为常见。现在,...
《Hessian远程调用技术详解》 在分布式系统中,远程调用是常见的通信方式,它使得服务可以跨越网络边界,实现组件之间的交互。Hessian,由Caucho公司开发,是一种高效的二进制RPC(Remote Procedure Call)协议,常...
3. **服务消费者(ServiceConsumer)**:从服务注册中心获取服务接口的引用,实现远程调用。 4. **代理类(Proxy Class)**:动态生成的类,实现了服务接口,内部调用RPC框架的调用逻辑。 5. **调用处理(Invocation...
远程调用原理是分布式系统中的关键技术,它使得应用程序可以跨越网络边界,调用远程服务器上的方法,就像调用本地函数一样。这种技术极大地扩展了软件的可伸缩性和可用性,尤其是在大型企业级应用和云计算环境中。在...
在IT行业中,远程调用是一种常见的技术,它允许应用程序通过网络接口访问远程系统的服务,而无需关心服务的具体实现。JBoot是一款基于Java的快速开发框架,它提供了对RPC(Remote Procedure Call)的支持,使得...
Java远程调用批处理文件是将Java编程与批处理脚本结合的一种技术,它允许Java程序执行在远程服务器上的批处理任务,而无需人工干预。这通常涉及到网络通信和进程间交互,使得分布式系统能够更加灵活地管理和调度任务...
在IT行业中,远程调用Linux命令是常见的操作,特别是在分布式系统和自动化运维中。这篇名为“远程调用Linux命令的demo”的文章可能介绍了一种或多种实现方式,让我们通过标签和文件名来推测可能涉及的知识点。 首先...
在Flex和Java之间进行远程调用,最常见的技术之一是使用AMF(Action Message Format)。AMF是一种二进制数据格式,能够高效地序列化和反序列化ActionScript对象,使得 Flex与Java之间的数据交换更为快速和高效。...
远程CALL调用是一种在计算机程序设计中用于实现进程间通信(IPC)的技术,尤其是在游戏外挂开发中较为常见。在Windows环境下,MFC(Microsoft Foundation Classes)库提供了一种便捷的方式来实现这一功能。MFC是C++...
3. **远程调用的技术现状与挑战** 面对大量服务间的交互,同步调用可能导致性能瓶颈和可靠性问题,因此推荐尽可能使用异步和消息驱动的模式。然而,即使在异步模式下,服务消费者和服务提供者在逻辑上仍可能存在...
在IT行业中,远程调用是一种常见的技术,使得客户端可以跨网络调用远程服务器上的方法,就像调用本地方法一样方便。Hessian是Apache项目下的一个轻量级的RPC(Remote Procedure Call,远程过程调用)框架,它提供了...
远程调用用友EAI接口是企业信息化集成中常见的技术操作,主要目的是实现不同系统间的交互和数据交换。本文将详细介绍如何通过实例进行远程调用用友EAI接口。 首先,确保可以正确访问EAI接口地址。在本例中,接口的...
本示例聚焦于一个具体的场景:使用C#客户端远程调用基于Spring框架的Java Web服务。以下将详细阐述涉及的技术点。 首先,Spring框架是Java领域的一个核心组件,尤其在企业级应用开发中广泛使用。它提供了一个全面的...
在分布式服务架构中,远程调用是至关重要的技术,它允许...总的来说,选择远程调用技术取决于具体需求,如性能、语言兼容性、安全性、复杂性等。深入理解这些技术的工作原理,对于构建高效、可靠的分布式系统至关重要。