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

常见的远程调用技术

阅读更多

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也是一种方式,但有严重的性能问题。

 

分享到:
评论

相关推荐

    远程调用技术代码追踪

    远程调用技术是分布式系统中不可或缺的一部分,它允许不同计算机之间的程序进行通信和协作,实现数据交换和服务共享。代码追踪在此领域中起着至关重要的作用,帮助开发者理解、调试和优化远程调用的过程。以下是对...

    基于springboot的两个项目之间的远程调用

    本主题聚焦于"基于Spring Boot的两个项目之间的远程调用",这是一个常见的需求,特别是在分布式系统中。远程调用允许不同服务之间相互通信,实现数据共享和功能协同。 1. **什么是远程调用** 远程调用(Remote ...

    vbs-远程调用vbs-远程调用

    3. **远程调用技术**: 在VBScript中实现远程调用,可能涉及到ActiveX组件、Web服务(如SOAP)、HTTP请求或COM对象等。例如,可以通过XMLHttpRequest对象发送HTTP请求到服务器上的Web服务接口,或者利用WMI...

    基于动态代理的Java远程调用框架的研究1

    本文探讨的是一种基于动态代理的Java远程调用框架,旨在解决传统远程调用技术如RMI(Remote Method Invocation)所面临的挑战。 RMI是Java平台上的基础远程调用技术,自JDK 1.1开始引入。它允许对象方法在不同的JVM...

    一个远程调用对象的例子(VB)

    在IT领域,远程调用对象(Remote Procedure Call, RPC)是一种常见的通信机制,它允许一个程序在不关心网络细节的情况下,调用运行在另一台计算机上的程序或服务。本示例将聚焦于VB(Visual Basic)环境下的RPC实现...

    Spring远程调用使用http方式

    在IT行业中,Spring框架是Java开发中的一个核心组件,它提供了丰富的功能,...不过,需要注意的是,HTTP远程调用可能会引入额外的网络延迟,因此在性能敏感的场景下,可能需要考虑其他的远程调用技术,如RMI或gRPC。

    远程调用

    远程调用是分布式系统中的关键技术,它允许不同的计算资源(如服务器、进程或服务)之间进行通信和数据交换,仿佛它们是在同一台机器上运行。这一技术在大型网络应用、微服务架构以及云计算环境中尤为常见。现在,...

    hession远程调用分享

    《Hessian远程调用技术详解》 在分布式系统中,远程调用是常见的通信方式,它使得服务可以跨越网络边界,实现组件之间的交互。Hessian,由Caucho公司开发,是一种高效的二进制RPC(Remote Procedure Call)协议,常...

    rpc远程调用使用说明&源码

    3. **服务消费者(ServiceConsumer)**:从服务注册中心获取服务接口的引用,实现远程调用。 4. **代理类(Proxy Class)**:动态生成的类,实现了服务接口,内部调用RPC框架的调用逻辑。 5. **调用处理(Invocation...

    远程调用原理

    远程调用原理是分布式系统中的关键技术,它使得应用程序可以跨越网络边界,调用远程服务器上的方法,就像调用本地函数一样。这种技术极大地扩展了软件的可伸缩性和可用性,尤其是在大型企业级应用和云计算环境中。在...

    jboot远程调用笔记和demo,能用!

    在IT行业中,远程调用是一种常见的技术,它允许应用程序通过网络接口访问远程系统的服务,而无需关心服务的具体实现。JBoot是一款基于Java的快速开发框架,它提供了对RPC(Remote Procedure Call)的支持,使得...

    java远程调用批处理文件代码归总

    Java远程调用批处理文件是将Java编程与批处理脚本结合的一种技术,它允许Java程序执行在远程服务器上的批处理任务,而无需人工干预。这通常涉及到网络通信和进程间交互,使得分布式系统能够更加灵活地管理和调度任务...

    远程调用linux命令的demo

    在IT行业中,远程调用Linux命令是常见的操作,特别是在分布式系统和自动化运维中。这篇名为“远程调用Linux命令的demo”的文章可能介绍了一种或多种实现方式,让我们通过标签和文件名来推测可能涉及的知识点。 首先...

    Flex与java交互 远程调用方式

    在Flex和Java之间进行远程调用,最常见的技术之一是使用AMF(Action Message Format)。AMF是一种二进制数据格式,能够高效地序列化和反序列化ActionScript对象,使得 Flex与Java之间的数据交换更为快速和高效。...

    远程CALL调用

    远程CALL调用是一种在计算机程序设计中用于实现进程间通信(IPC)的技术,尤其是在游戏外挂开发中较为常见。在Windows环境下,MFC(Microsoft Foundation Classes)库提供了一种便捷的方式来实现这一功能。MFC是C++...

    支付宝 远程调用规范

    3. **远程调用的技术现状与挑战** 面对大量服务间的交互,同步调用可能导致性能瓶颈和可靠性问题,因此推荐尽可能使用异步和消息驱动的模式。然而,即使在异步模式下,服务消费者和服务提供者在逻辑上仍可能存在...

    hessian实现远程调用

    在IT行业中,远程调用是一种常见的技术,使得客户端可以跨网络调用远程服务器上的方法,就像调用本地方法一样方便。Hessian是Apache项目下的一个轻量级的RPC(Remote Procedure Call,远程过程调用)框架,它提供了...

    Spring 远程调用 -- C# 访问java WEB 服务

    本示例聚焦于一个具体的场景:使用C#客户端远程调用基于Spring框架的Java Web服务。以下将详细阐述涉及的技术点。 首先,Spring框架是Java领域的一个核心组件,尤其在企业级应用开发中广泛使用。它提供了一个全面的...

    远程调用的几种方式.pdf

    在分布式服务架构中,远程调用是至关重要的技术,它允许...总的来说,选择远程调用技术取决于具体需求,如性能、语言兼容性、安全性、复杂性等。深入理解这些技术的工作原理,对于构建高效、可靠的分布式系统至关重要。

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

    同时,配置AOP代理(如JDK动态代理或CGLIB代理)来处理远程调用。 2. **配置Hibernate**:配置Hibernate的session factory,定义实体类与数据库表的映射,并配置数据源。使用SessionFactory创建Session实例,进行...

Global site tag (gtag.js) - Google Analytics