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

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

(1).客户端:

a.发送远程调用请求:

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

b.接收远程调用响应:

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

(1).服务端:

a.接收远程调用请求:

远程调用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方法就能调用服务端的方法了,超级简单!超级方便!当然这比较适合为子系统提供服务。

转载于:https://my.oschina.net/githubhty/blog/704245

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值