原文:http://kfliyangfan.iteye.com/category/121452
一、什么是Hessian
Hessian 是一个基于 binary-RPC 实现的远程通讯 library。使用二进制传输数据。Hessian通常通过Web应用来提供服务,通过接口暴露。Servlet和Spring的DispatcherServlet都可以把请求转发给Hessian服务。由以下两种方式提供,分别为:com.caucho.hessian.server.HessianServlet、org.springframework.web.servlet.DispatcherServlet。
关于hessian的7个问题:
1、是基于什么协议实现的?
基于Binary-RPC协议实现。
2、怎么发起请求?
需通过Hessian本身提供的API来发起请求。
3、怎么 将请求转化为符合协议的格式的?
Hessian通过其自定义的串行化机制将请求信息进行序列化,产生二进制流。
4、使用什么 传输协议传输?
Hessian基于Http协议进行传输。
5、响应端基于什么机制来接收请求?
响应端根据Hessian提供的API来接收请求。
6、怎么将流还原为传输格式的?
Hessian根据其私有的串行化机制来将请求信息进行反序列化,传递给使用者时已是相应的请求信息对象了。
7、处理完毕后怎么回应?
处理完毕后直接返回,hessian将结果对象进行序列化,传输至调用端。
二、hessian的优缺点
优点:
简单易用,面向接口,通过接口暴露服务,jar包只有200、300k,不需要配置防火墙
效率高,复杂对象序列化速度仅次于RMI,简单对象序列化优于RMI,二进制传输
多语言支持:wiki、Java、Flash/Flex、Python、C++、.NET C#、PHP、Ruby、Objective-C
可与spring集成,配置简单,HessianServiceExporte
缺点:
缺乏安全机制,传输没有加密处理
异常机制不完善,总是报一些错误,错误原因也是千奇百怪,提示信息不足
事务处理欠缺
版本问题,spring 2.5.6对照3.1.3版,spring 3对照4.0及以上版本,需要使用spring MVC部分内容
- invoke(Object proxy, Method method, Object []args){
- String methodName = method.getName();// 取得方法名
- Object value = args[0]; // 取得传入参数
- conn = sendRequest(mangleName, args) ; // 通过该方法和服务器端取得连接
- httpConn = (HttpURLConnection) conn;
- code = httpConn.getResponseCode(); // 发出请求
- // 等待服务器端返回相应…………
- InputStream is = conn.getInputStream();
- AbstractHessianInput in = _factory.getHessianInput(is); //转化为hessian自己的输入输出API
- Object value = in.readObject(method.getReturnType()); // 取得返回值
- }
- URLConnection sendRequest(String methodName, Object []args){
- URLConnection conn = _factory.openConnection(_url); // 创建 URLConnection
- OutputStream os = conn.getOutputStream();
- AbstractHessianOutput out = _factory.getHessianOutput(os); // 封装为 hessian 自己的输入输出 API
- out.call(methodName, args);
- return conn;
- }
- (HessianExporter) invoke(request.getInputStream(), response.getOutputStream());
- (Hessian2SkeletonInvoker) this.skeletonInvoker.invoke(inputStream, outputStream);
- //将输入输出封转化为转化为 Hessian 特有的 Hessian2Input 和 Hessian2Output
- Hessian2Input in = new Hessian2Input(isToUse);
- in.setSerializerFactory(this.serializerFactory);
- AbstractHessianOutput out = null;
- int major = in.read();
- out = new Hessian2Output(osToUse);
- out.setSerializerFactory(this.serializerFactory);
- (HessianSkeleton) this.skeleton.invoke(in, out);
- //读取方法名
- String methodName = in.readMethod();
- Method method = getMethod(methodName);
- //读取方法参数
- Class []args = method.getParameterTypes();
- Object []values = new Object[args.length];
- //执行相应方法并取得结果
- result = method.invoke(service, values);
- //结果写入到输出流
- out.writeObject(result);