分布式系统开发工具包 —— 基于Hessian的HTTP RPC调用技术

caucho

Hessian官网:http://hessian.caucho.com/

hessian是二进制web service协议。

Hessian介绍

创建Hessian服务包括四个步骤:

  1. 创建Java接口,用于提供公开服务
  2. 使用HessianProxyFactory创建客户端
  3. 创建服务实现类
  4. 在servlet引擎中配置服务

HelloWorld服务

 public interface BasicAPI {
   public String hello();
 }

服务实现

public class BasicService extends HessianServlet implements BasicAPI {
  private String _greeting = "Hello, world";

  public void setGreeting(String greeting)
  {
    _greeting = greeting;
  }

  public String hello()
  {
    return _greeting;
  }
}

客户端实现

String url = "http://hessian.caucho.com/test/test";

HessianProxyFactory factory = new HessianProxyFactory();
BasicAPI basic = (BasicAPI) factory.create(BasicAPI.class, url);

System.out.println("hello(): " + basic.hello());

部署标准web.xml

<web-app>
  <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>example.BasicService</param-value>
    </init-param>
    <init-param>
      <param-name>home-api</param-name>
      <param-value>example.Basic</param-value>
    </init-param>
  </servlet>

  <servlet-mapping>
    <url-pattern>/hello</url-pattern>
    <servlet-name>hello</servlet-name>
  </servlet-mapping>
</web-app>

Hessian序列化

Hessian类可以用来做序列化与反序列化

序列化

Object obj = ...;

OutputStream os = new FileOutputStream("test.xml");
Hessian2Output out = new Hessian2Output(os);

out.writeObject(obj);
os.close();

反序列化

InputStream is = new FileInputStream("test.xml");
Hessian2Input in = new Hessian2Input(is);

Object obj = in.readObject(null);
is.close();

如果要序列化比基础类型或String类型更加复杂的java对象,务必确保对象实现了java.io.Serializable接口。

Hessian处理大量数据

分布式应用需要发送大量二进制数据时,使用InputStream会更加有效率,因为它避免了分配大量byte数组。方法
参数中只有最后一个参数可能是InputStream,因为数据是在调用过程中读的。

下面是一个上传文件的API的例子

package example;

public interface Upload {
  public void upload(String filename, InputStream data);
}

如果返回结果是InputStream,客户端必须在finally块中调用InputStream.close()方法,因为Hessian不会关闭
底层HTTP流,直到所有数据被读取并且input stream被关闭。

文件下载API:
package example;

public interface Download {
  public InputStream download(String filename, InputStream data);
}

文件下载实现:
InputStream is = fileProxy.download("test.xml");

try {
  ... // read data here
} finally {
  is.close();
}
上一篇: 微服务与Spring Cloud
下一篇: 杏花村 - 餐饮点餐系统
目录