1. 程式人生 > >hessian 遠端介面呼叫原理

hessian 遠端介面呼叫原理

原址:http://pretyliang-163-com.iteye.com/blog/1741147

簡介 

相比WebService,Hessian更簡單、快捷。採用的是二進位制RPC協議(Binary),因為採用的是二進位制協議,所以它很適合於傳送二進位制資料。Hessian通常通過Web應用來提供服務,因此非常類似於WebService。只是它不使用SOAP協議。 
Hessian通過Servlet提供遠端服務。需要將匹配某個模式的請求對映到Hessian服務。Spring的DispatcherServlet可以完成該功能,DispatcherServlet可將匹配模式的請求轉發到Hessian服務。Hessian的server端提供一個servlet基類, 用來處理髮送的請求,而Hessian的這個遠端過程呼叫,完全使用動態代理來實現的,,推薦採用面向介面程式設計,因此,Hessian服務建議通過介面暴露。 

Hessian處理過程示意圖: 
客戶端——>序列化寫到輸出流——>遠端方法(伺服器端)——>序列化寫到輸出流 ——>客戶端讀取輸入流——>輸出結果 
環境搭建 
Hessian的下載和安裝請按如下步驟進行: 
(1)登http://www.caucho.com/hessian/下載Hessian。 
(2)把Hessian相應的Jar包放到Web應用下,所有的jar檔案都應該放在WEB-INF/lib下,該檔案也不例外。 
兩種方式 
純Hessian 
這種方式主要是適用於工程中沒有適用像spring框架的情況下,好處是配置方便,但是當內容多的情況下,配置的內容很多。 
下面我就把我在做例項的一些相關步驟描述如下: 

1:把Hessian相應jar包放入至工程中。 
2:由於Hessian是採用面向介面程式設計的,所以編寫一個介面,因為客戶端僅僅需要介面,而無須真實的實現類。 
package jzh.demo; 
public interface IHello { 
String sayHello(); 

3:編寫一個類實現這個介面。 
package jzh.demo.impl; 
import jzh.demo.IHello; 
import com.caucho.hessian.server.HessianServlet; 
public class Hello extends HessianServlet implements IHello { 

public String sayHello() { 
return "Hello world"; 


4:web.xml的詳細配置 
<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>jzh.demo.imple.Hello</param-value> 
</init-param> 
<init-param> 
<param-name>home-api</param-name> 
<param-value>jzh.demo.IHello</param-value> 
</init-param> 
<load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
<servlet-name>Hello</servlet-name> 
<url-pattern>/Hello</url-pattern> 
</servlet-mapping> 

5:客戶端遠端呼叫伺服器端提供的介面,利用的就是Hessian的HessianProxyFactory,來實現遠端代理。 
1) 把伺服器端的生成的jar包,放入工程中。 
2) 相應的片段程式如下: 
String url = "http://220.114.108.185:8080/Hessian/Hello"; 
HessianProxyFactory factory = new HessianProxyFactory(); 
try { 
IHello hello =(IHello)factory.create(IHello.class,url); 
System.out.println(hello.sayHello()); 
} catch (MalformedURLException e) { 
e.printStackTrace(); 

6:功能完成。 
Hessian與Spring整合 
相比上一種方式,這個方式就有點麻煩了。Hessian通過Servlet提供遠端服務。需要將匹配某個模式的請求對映到Hessian服務。Spring的DispatcherServlet可以完成該功能,DispatcherServlet可將匹配模式的請求轉發到Hessian服務,web.xml只是定義了“請求轉發器”,該轉發器將匹配/remoting/*的請求截獲,轉發給context的bean處理。而HessianServiceExporter提供bean服務。 
所以Hessian與Spring整合主要就是一下兩個工作: 
1:通過DispatcherServlet來攔截URL請求。 
2:HessianServiceExporter提供bean服務,Spring使用HessianServiceExporter,將一個常規bean匯出成Hessian服務。 
下面我就把我在做例項的一些相關步驟描述如下: 
1:和上面的一樣。 
2:和上面的一樣。 
3:和上面的一樣。 
4:web.xml的詳細配置 
<servlet> 
           <servlet-name>remoting</servlet-name> 
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
           <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
           <servlet-name>remoting</servlet-name> 
           <url-pattern>/remoting/*</url-pattern> 
</servlet-mapping> 
5:配置remoting-servlet.xml檔案 
<!--  定義普通bean例項--> 
    <bean id="hello" class="jzh.demospring.impl.Hello"/> 
    <!--  使用HessianServiceExporter 將普通bean匯出成Hessian服務--> 
    <bean name="/HessianRemoting" class="org.springframework.remoting.caucho.HessianServiceExporter"> 
           <!--  需要匯出的目標bean--> 
           <property name="service" ref="hello"/> 
           <!--  Hessian服務的介面--> 
           <property name="serviceInterface" value="jzh.demospring.IHello"/> 
</bean> 
6:客戶端定義一個remoting-client.xml檔案 
<bean id="myServiceClient" class="org.springframework.remoting.caucho.HessianProxyFactoryBean"> 
<property name="serviceUrl"> 
<value>http://220.114.99.62:8080/HessianSpring/remoteing/HessianRemoting</value> 
</property> 
<property name="serviceInterface"> 
<value>jzh.demospring.IHello</value> 
</property> 
</bean> 
7:客戶端呼叫。 
try 
{                                                               
ApplicationContext context = new ClassPathXmlApplicationContext("remote-client.xml"); 

IHello hello =(IHello)context.getBean("myServiceClient"); 

System.out.println(hello.sayHello()); 

catch (Exception e) 

e.printStackTrace(); 

注意事項 
1:啟動tomcat的時候,出現如下問題:java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet。,而在工程中是可以找到相應的jar檔案,這究竟是什麼問題。 
解決方法:可能是在工程的WEB-INF/lib下面沒有載入相應的jar檔案 
2:org.springframework.remoting.RemoteAccessException: Cannot access Hessian service at [http://61.152.162.173/remote/remoteService]; 
解決方法:出現這個異常一般是因為服務端操作出現異常引起的 





1、方法在遠端執行,將操作結果傳回給客戶端。優點:伺服器負荷小,傳輸資料量小,客戶端無需知道伺服器端定義的服務介面。缺點:需要對資料進行拼裝解析等複雜操作。 
2、方法載入到客戶端執行。優點:可以和快取配合,每次執行只傳輸一次,可靠性高,有些方法沒有返回值,只是進行例如print的列印語句能在客戶端執行。缺點:傳輸資料大,客戶端需要知道服務介面。