Hessian——轻量级的二进制协议远程调用实现方案

       最近要作一个工做流的系统来支持子系统的上传,审批,复审,会签等操做,而通常传统的项目间交流主要是经过http调用另外的服务器的地址,返回一个json或是字符串,这种方式效率低,而且极其消耗资源,上家公司做为一个电商网站,有两个项目和一个中间件,每一个项目之间信息处理全是经过http实现,因为优化不到位(应该是根本没有优化),常常会出现runtimeout的异常,而将runtime的时间设置太长也会影响用户体验,因为有些数据常常须要跨项目(数据库不一样)查询或更新,致使异常常常出现。那时觉得项目间就应该经过http传输,直到遇到Hessian,才知道能够这样利用第三方的http实现方案,这样更加方便和可靠。java

(1).客户端:web

a.发送远程调用请求:数据库

客户端程序—>发送远程调用请求—>Hessian客户端拦截器—>封装远程调用请求—>Hessian代理—>经过HTTP协议发送远程请求代理到服务端。json

b.接收远程调用响应:服务器

远程调用结果—>HTTP响应—>客户端。app

(1).服务端:框架

a.接收远程调用请求:oop

远程调用HTTP请求—>HessianServiceExporter接收请求—>HessianExporter将远程调用对象封装为HessianSkeleton框架—> HessianSkeleton处理远程调用请求。测试

b.返回远程调用响应:优化

HessianSkeleton封装远程调用处理结果—>HTTP响应—>客户端。

Hessian的实现:服务端Hessian须要四个东西就能够提供服务了,一个interface的java;一个实现interface的impl的java;一个实现了Serializable的实体,用来返回须要的东西;一个配置好了的web.xml用来实现暴露出远程接口,写好服务端接口和实现,测试完毕后将接口类和实体类已jar包形式导出;

客户端Hessian须要服务器接口和实体的jat包,服务器端的路径,就能够轻松的将服务器端的服务引用出来,这样就达到了对服务器端的操做。

eg:

接口:public interface BasicAPI {
public void setGreeting(String greeting);
public String hello();
public User getUser();
}

接口实现:

public class BasicService implements BasicAPI {
private String _greeting = "Hello, world";
public void setGreeting(String greeting)
{
_greeting = greeting;
System.out.println("set greeting success:"+_greeting);
}
public String hello()
{
return _greeting;
}
public User getUser() {
return new User("prance", "meshow");
}
}

pojo实体:

public class User implements Serializable{
String userName ="snoopy";
String password ="showme";
public User(String user, String pwd) {
this.userName =user;
this.password= pwd;
}
public String getUserName() {
return userName;
}
public String getPassword() {
return password;
}
}

web.xml配置:

<servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
        <init-param>
        <param-name>service-class</param-name>
        <param-value>demo.BasicService</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

客户端能够是一个main启动方法

import demo.User;
import demo.BasicAPI;
import com.caucho.hessian.client.HessianProxyFactory;

 public static void main(String[] args) {

 //在服务器端的web.xml文件中配置的HessianServlet映射的访问URL地址
        String url = "http://localhost:8081/OCROnline/hello";
        HessianProxyFactory factory = new HessianProxyFactory();
        BasicAPI service = (BasicAPI) factory.create(BasicAPI.class, url);//建立BasicAPI接口的实例对象
        User user = service.getUser();//调用Hessian服务器端的BasicAPI类中的getUser方法来获取一个User对象
        System.out.println(service.getUser().getPassword());
        System.out.println(service.hello());
        System.out.println(service.getUser() .getUserName());}

运行main方法就能调用服务端的方法了,超级简单!超级方便!固然这比较适合为子系统提供服务。

相关文章
相关标签/搜索