常见的远程调用技术

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值