各个通讯协议对比:
通讯效率测试结果:
RMI > Httpinvoker >=Hessian >> Burlap >> Web service
1.RMI 是 Java 首选远程调用协议,非常高效稳定,特别是在数据结构复杂,数据量大的情况下,与其他通讯协议的差距尤为明显。但不能跨语言。(JDK内置)
2.HttpInvoker 使用 java 的序列化技术传输对象,与 RMI在本质上是一致的(不能跨语言)。从效率上看,两者也相差无几, HttpInvoker 与 RMI 的传输时间基本持平。
3.Hessian 在传输少量对象时,比 RMI 还要快速高效,但传输数据结构复杂的对象或大量数据对象时,较 RMI 要慢 20% 左右。但这只是在数据量特别大,数据结构很复杂的情况下才能体现出来,中等或少量数据时, Hessian并不比RMI慢。 Hessian 的好处是精简高效,可以跨语言使用,而且协议规范公开,我们可以针对任意语言开发对其协议的实现。另外, Hessian与WEB服务器结合非常好,借助WEB服务器的成熟功能,在处理大量用户并发访问时会有很大优势,在资源分配,线程排队,异常处理等方面都可以由成熟的WEB服务器保证。而 RMI 本身并不提供多线程的服务器。而且,RMI 需要开防火墙端口, Hessian 不用。 (传输二进制数据,将对象转换成二进制数据,跨语言)
4.Burlap采用 xml 格式传输。仅在传输 1条数据时速度尚可,通常情况下,它的毫时是 RMI 的 3 倍。
5.Web Service 的效率低下是众所周知的,平均来看, Web Service 的通讯毫时是RMI 的 10 倍。(传输XML)
阿里巴巴 框架 ,Dubbo 框架, 基于Hessian 封装的 !
Hessian与Spring的集成(服务端)
- Hessian的jar包下载
- web.xml配置
<servlet> <servlet-name>hessian</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>hessian</servlet-name> <url-pattern>/remote/*</url-pattern> </servlet-mapping>
- 注意看我们的HessianServiceExporter对应的bean的name是“/HelloNewsService”,在SpringMVC的配置文件中,当一个bean的name是以“/”开始的时候Spring会自动对它进行BeanNameUrlHandlerMapping。所以这里相当于是我们把“/HelloNewsService”映射到了HessianServiceExporter,根据上面的配置我们要请求这个远程服务的时候应该请求“/remote/HelloNewsService”。虽然说在Spring的配置文件中我们把bean的名称设为以“/”开始时Spring会自动对它进行一个beanName映射,但有一次不知道是哪里影响了,我这样使用的时候Spring没有对它进行自动映射,所以为了保险起见,这里我们最好自己指定一个BeanNameUrlHandlerMapping,代码如下所示:
-
复制hessian-servlet.xml到WEB-INF下 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <!-- Remoting --> <!-- <bean name="/HelloNewsService" class="org.springframework.remoting.caucho.HessianServiceExporter"> 这里是实现类的名称 <property name="service" value="com.hessianServer.HelloServiceImpl"/> 这里是接口 <property name="serviceInterface" value="com.hessianServer.HelloService" /> </bean> --> </beans>
<!-- Hessian -->
<bean id="helloService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
<!-- serviceUrl 远程服务地址 -->
<property name="serviceUrl" value="http://localhost:8080/hessianServer/<span style="font-family: Simsun;font-size:14px;">remote/</span><span style="font-family: Simsun;font-size:14px;"></span><span style="font-family: Simsun;font-size:14px;">HelloNewsService</span>"/>
<!-- serviceInterface 服务接口 -->
<property name="serviceInterface" value="<span class="com">com.hessianServer.<span style="font-family: Simsun;font-size:14px;">HelloNewsService</span><span style="font-family: Arial, Helvetica, sans-serif;"></bean></span>
客户端直接调用 helloService方法即可