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方法就能調用服務端的方法了,超級簡單!超級方便!固然這比較適合爲子系統提供服務。

相關文章
相關標籤/搜索