我是靠谱客的博主 阔达爆米花,最近开发中收集的这篇文章主要介绍常见的远程调用技术,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

 

最后

以上就是阔达爆米花为你收集整理的常见的远程调用技术的全部内容,希望文章能够帮你解决常见的远程调用技术所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部