hessian杂篇

来源:互联网 发布:开淘宝店需要什么费用 编辑:程序博客网 时间:2024/05/22 12:49
一、简介
Hessian是caucho公司提供的开源协议,基于HTTP传输,服务端不用开防火墙端口。协议的规范公开,可以用于任意语言。Hessian也是一个轻量级的,自定义描述的二进制RPC协议。Hessian的好处是精简高效,可以跨语言使用,我们可以针对任意语言开发对其协议的实现。目前已有实现的语言有:Java、Flash、Python、C++、.NET C#、D、Erlang、PHP、Ruby。还没有Delphi的实现。
http://blog.csdn.net/turkeyzhou/article/details/5867543

二、 为什么选择Hessian
1. Hessian是一个轻量级的RPC协议,数据以二进制方式存储传输。所以简洁、高效。相比web service的SOAP协议的复杂、数据冗余。Hessian的性能要高出很多。
2. 协议规范公开,很多语言都已实现。

Hessian
Hessian 是由caucho提供的一个基于binary-RPC实现的远程通讯library。
1、是基于什么协议实现的?
基于Binary-RPC协议实现。
2、怎么发起请求?
需通过Hessian本身提供的API来发起请求。
3、怎么 将请求转化为符合协议的格式的?
Hessian通过其自定义的串行化机制将请求信息进行序列化,产生二进制流。
4、使用什么 传输协议传输?
Hessian基于Http协议进行传输。
5、响应端基于什么机制来接收请求?
响应端根据Hessian提供的API来接收请求。
6、怎么将流还原为传输格式的?
Hessian根据其私有的串行化机制来将请求信息进行反序列化,传递给使用者时已是相应的请求信息对象了。
7、处理完毕后怎么回应?
处理完毕后直接返回,hessian将结果对象进行序列化,传输至调用端。

使用Hessian的利弊:
• 优势:使用简单,速度快;跨语言,跨平台;可以用来兼容legacy系统的功能。
• 劣势:安全性的支持不够强,不支持两阶段事务。



Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据

RMI(Remote Method Invocation,远程方法调用)

序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。



相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议(Binary),因为采用的是二进制协议,所以它很适合于发送二进制数据。Hessian通常通过Web应用来提供服务,因此非常类似于WebService。只是它不使用SOAP协议。
Hessian通过Servlet提供远程服务。需要将匹配某个模式的请求映射到Hessian服务。Spring的DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务。Hessian的server端提供一个servlet基类, 用来处理发送的请求,而Hessian的这个远程过程调用,完全使用动态代理来实现的,,推荐采用面向接口编程,因此,Hessian服务建议通过接口暴露。
Hessian处理过程示意图:
客户端——>序列化写到输出流——>远程方法(服务器端)——>序列化写到输出流 ——>客户端读取输入流——>输出结果
环境搭建
Hessian的下载和安装请按如下步骤进行:
(1)登http://www.caucho.com/hessian/下载Hessian。
(2)把Hessian相应的Jar包放到Web应用下,所有的jar文件都应该放在WEB-INF/lib下,该文件也不例外。
两种方式
纯Hessian
这种方式主要是适用于工程中没有适用像spring框架的情况下,好处是配置方便,但是当内容多的情况下,配置的内容很多。
下面我就把我在做实例的一些相关步骤描述如下:
1:把Hessian相应jar包放入至工程中。
2:由于Hessian是采用面向接口编程的,所以编写一个接口,因为客户端仅仅需要接口,而无须真实的实现类。
package jzh.demo;
public interface IHello {
String sayHello();
}
3:编写一个类实现这个接口。
package jzh.demo.impl;
import jzh.demo.IHello;
import com.caucho.hessian.server.HessianServlet;
public class Hello extends HessianServlet implements IHello {
public String sayHello() {
return "Hello world";
}
}
4:web.xml的详细配置
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
<init-param>
<param-name>home-class</param-name>
<param-value>jzh.demo.imple.Hello</param-value>
</init-param>
<init-param>
<param-name>home-api</param-name>
<param-value>jzh.demo.IHello</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/Hello</url-pattern>
</servlet-mapping>

5:客户端远程调用服务器端提供的接口,利用的就是Hessian的HessianProxyFactory,来实现远程代理。
1) 把服务器端的生成的jar包,放入工程中。
2) 相应的片段程序如下:
String url = "http://220.114.108.185:8080/Hessian/Hello";
HessianProxyFactory factory = new HessianProxyFactory();
try {
IHello hello =(IHello)factory.create(IHello.class,url);
System.out.println(hello.sayHello());
} catch (MalformedURLException e) {
e.printStackTrace();
}
6:功能完成。

Hessian与Spring整合
相比上一种方式,这个方式就有点麻烦了。Hessian通过Servlet提供远程服务。需要将匹配某个模式的请求映射到Hessian服务。Spring的DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务,web.xml只是定义了“请求转发器”,该转发器将匹配/remoting/*的请求截获,转发给context的bean处理。而HessianServiceExporter提供bean服务。
所以Hessian与Spring整合主要就是一下两个工作:
1:通过DispatcherServlet来拦截URL请求。
2:HessianServiceExporter提供bean服务,Spring使用HessianServiceExporter,将一个常规bean导出成Hessian服务。
下面我就把我在做实例的一些相关步骤描述如下:
1:和上面的一样。
2:和上面的一样。
3:和上面的一样。
4:web.xml的详细配置
<servlet>
<servlet-name>remoting</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>namespace</param-name>
<param-value>hessian/hessian-server</param-value>
</init-param>
namespace 这个是尼玛坑爹的,看源代码了解namespace默认为 ${servlet-name}-servlet
它要求在WEB-INF下建立一个 ${namespace}.xml的spring配置
(实际上这里配置contextConfigLocation参数,value配置路径也可以)
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>remoting</servlet-name>
<url-pattern>/remoting/*</url-pattern>
</servlet-mapping>
5:配置remoting-servlet.xml文件
<!-- 定义普通bean实例-->
<bean id="hello" class="jzh.demospring.impl.Hello"/>
<!-- 使用HessianServiceExporter 将普通bean导出成Hessian服务-->
<bean name="/HessianRemoting" class="org.springframework.remoting.caucho.HessianServiceExporter">
<!-- 需要导出的目标bean-->
<property name="service" ref="hello"/>
<!-- Hessian服务的接口-->
<property name="serviceInterface" value="jzh.demospring.IHello"/>
</bean>
6:客户端定义一个remote-client.xml文件
<bean id="myServiceClient" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
<property name="serviceUrl">
<value>http://220.114.99.62:8080/HessianSpring/remoteing/HessianRemoting</value>
</property>
<property name="serviceInterface">
<value>jzh.demospring.IHello</value>
</property>
</bean> 
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微店店铺严重违规怎么办 淘宝违规扣2分怎么办 淘宝被扣6分怎么办 淘宝被扣2分怎么办 淘宝被海关扣了怎么办 淘宝被扣36分后怎么办 淘宝售假查封店铺资金怎么办 淘宝店扣48分怎么办 淘宝a内被扣48分怎么办 饿了么店铺满减怎么办 淘宝店扣a48分怎么办 淘宝短信营销无法获取人群怎么办 淘宝货发了退款怎么办 极速退款后卖家不确认收货怎么办 把货退了卖家不退款怎么办? 退款了又收到货怎么办 退货忘了填单号怎么办 手机换号了淘宝怎么办 换了手机支付宝怎么办 手机丢了微信登不上去了怎么办 前面手机丢了微信登不上去怎么办 淘宝密码忘了怎么办呢 融e借逾期一天怎么办 拼多多处罚下架怎么办 永久无法解绑支付宝怎么办 淘宝下单购买人数太多怎么办 新浪微博被拉黑暂时无法评论怎么办 闲鱼交易成功后卖家反悔怎么办 闲鱼买家不申请介入怎么办 支付宝安装不上怎么办 无线摄像机离wifi太远怎么办 安卓系统死机了怎么办 安卓手机开不了机怎么办 手机关机键坏了怎么办 华为手机接听电话声音小怎么办 小米6x游戏闪退怎么办 安卓8.0不兼容怎么办 安卓8.0应用闪退怎么办 安卓8.0不兼容的怎么办 游戏全屏只有一个分辨率选项怎么办 安卓6.0吃运行内存怎么办