淺談Hessian遠程調用及其使用

1.1       概述

Hessian是一個輕量級的remoting onhttp工具是由 caucho 提供的一種開源的遠程通信協議。相比WebServiceHessian更簡單、快捷、同時支持跨語言通信。Hessian採用的是二進制RPC協議,基於 HTTP 傳輸。java

Hessian是經過Servlet提供遠程服務。首先須要將匹配某個模式的請求映射到Hessian服務。SpringDispatcherServlet能夠完成該功能,DispatcherServlet可將匹配模式的請求轉發到Hessian服務。Hessian的服務端提供一個servlet基類, 用來處理髮送的請求,而Hessian的這個遠程過程調用,徹底使用動態代理來實現的,採用面向接口編程。 所以,Hessian服務建議經過接口暴露。web

1.2       項目應用場景

在項目中因爲核心包只能使用的jdk1.4的,致使部分java特性,或者部分功能依賴高版本jdk才能實現,好比pdf回填、dbf導入、wordpdf等功能都須要依賴較高版本jdk。此時就須要在另外一個服務器上對這類功能進行實現,而後經過hessian代理方式提供接口供程序調用。還有就是項目中須要和其餘開發商進行數據交互時經過支撐平臺客戶端向其餘模塊或者其餘開發商提供服務時,也可使用hessian,支撐平臺定義相關接口以及接口的實現,而後建立一個支撐平臺客戶端打包成jar文件,其餘模塊引入此jar包就能調用支撐平臺的方法了,這樣只須要暴露接口給其餘模塊,達到對核心代碼的保護。spring

1.3       Hessian使用示例

1.3.1           服務端首先建立一個接口。

public interface HessianService {編程

   /**測試字符串返回*/api

    public String getName();服務器

    /**測試對象返回*/app

    public People getPeople();工具

}測試

1.3.2           服務端HessianService實現以下:

public class HessianSeiviceImpl implements HessianService {url

    String name="hello world";

   public String getName() {

      return name;

   }

   public People getPeople() {

      People people = new People("張三",25,"廣州市天河區");

      return people;

   }

}

 

1.3.3           web.xml中添加配置,以下:

<servlet>

  <servlet-name>hessianService</servlet-name>

  <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>

  <init-param>

      <param-name>home-class</param-name>

      <param-value>com.excellence.hessian.service.HessianServiceImpl

      </param-value>

  </init-param>

  <init-param>    

   <param-name>home-api</param-name>    <param-value>com.excellence.hessian.service.HessianService</param-value>

  </init-param>

</servlet>

<servlet-mapping>

  <servlet-name>hessianService</servlet-name>

  <url-pattern>/hessianService</url-pattern>

</servlet-mapping>

 

1.3.4          編寫客戶端遠程調用

public class HessianClient {

   public static void main(String[] args) {

        String url = "http://localhost:8080/hessianDemo/hessianService"

         HessianProxyFactory factory = new HessianProxyFactory(); 

         HessianService hessianService = null;

         try {

             hessianService =

(HessianService) factory.create(HessianService.class, url);

             People people = hessianService.getPeople(); 

             System.out.println("獲取字符串: " + hessianService.getName()); 

             System.out.println("獲取對象: " + people.getName());

         } catch (Exception e) {

             e.printStackTrace();

         } 

   }

}

輸入結果:獲取字符串: hello world

獲取對象: 張三

 

1.3.5          Spring來整合Hessian

1.3.5.1       WEB-INF下新建remote-servlet.xml

<beans>

   <bean id="_HessianService" class="com.excellence.hessian.service.HessianSeiviceImpl" />

  <bean name="/hessianService" class="org.springframework.remoting.caucho.HessianServiceExporter">

      <property name="service" ref="_HessianService" />

      <property name="serviceInterface" value="com.excellence.hessian.service.HessianService" />

   </bean>

 </beans>

1.3.5.2             Web.xml中添加以下配置

<servlet>

   <servlet-name>remote</servlet-name>

   <servlet-class>

      org.springframework.web.servlet.DispatcherServlet

   </servlet-class>

   <load-on-startup>1</load-on-startup>

</servlet>

 <servlet-mapping>

   <servlet-name>remote</servlet-name>

      <url-pattern>/remote/*</url-pattern>

</servlet-mapping>

web.xml中使用SpringDispatcherServlet../remote/*的請求路徑進行攔截;Spring會根據servlet-name標籤訂義的標識,自動在WEB-INF下尋找到remote-servlet.xml

Spirng整合後,不影響以前定義的HessianService服務接口,以及實現類。但整合後,服務接口和實現類只須要在remote -servlet.xml中添加相關配置,就能夠獲取到接口對象了,而不用到web.xml進行更改。

1.3.5.3             Hessian客戶端遠程調用

此時客戶端遠程調用一樣能夠和前面一致。url以下:

"http://localhost:8080/hessianDemo/hessianService

也能夠經過spring來實例化接口進行調用。步驟以下:

編寫SpingBean配置文件remote-client.xml

<beans>

    <bean id="hessianServiceClient" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">

        <property name="serviceUrl" value="http://localhost:8080/hessianDemo/hessianService"/>

        <property name="serviceInterface" value="com.excellence.hessian.service.HessianService"/>

    </bean>

 </beans>

 

編寫Sping測試客戶端

public static void main(String[] args) {

       ApplicationContext context = new ClassPathXmlApplicationContext("remote-client.xml");

       HessianService hessianService = null;

         try {

             hessianService = (HessianService) context.getBean("hessianServiceClient");

             People people = hessianService.getPeople(); 

             System.out.println("Hello: " + hessianService.getName()); 

             System.out.println("peopleName: " + people.getName());

         } catch (Exception e) {

             e.printStackTrace();

         } 

   }

輸出結果:Hello: hello world

peopleName: 張三

 

1.4       數據解析過程

對於服務器端較爲複雜的數據,服務器端將數據按照必定的格式序列化數據,客戶端經過服務器提供的客戶端jar反序列化數據,獲取所需的數據。以下圖所示:

 

說明:服務端指hessian服務提供方,Client指服務端提供給應用程序調用的工具程序,應用程序指服務調用方。

1.1       概述

Hessian是一個輕量級的remoting onhttp工具是由 caucho 提供的一種開源的遠程通信協議。相比WebServiceHessian更簡單、快捷、同時支持跨語言通信。Hessian採用的是二進制RPC協議,基於 HTTP 傳輸。

Hessian是經過Servlet提供遠程服務。首先須要將匹配某個模式的請求映射到Hessian服務。SpringDispatcherServlet能夠完成該功能,DispatcherServlet可將匹配模式的請求轉發到Hessian服務。Hessian的服務端提供一個servlet基類, 用來處理髮送的請求,而Hessian的這個遠程過程調用,徹底使用動態代理來實現的,採用面向接口編程。 所以,Hessian服務建議經過接口暴露。

1.2       項目應用場景

在項目中因爲核心包只能使用的jdk1.4的,致使部分java特性,或者部分功能依賴高版本jdk才能實現,好比pdf回填、dbf導入、wordpdf等功能都須要依賴較高版本jdk。此時就須要在另外一個服務器上對這類功能進行實現,而後經過hessian代理方式提供接口供程序調用。還有就是項目中須要和其餘開發商進行數據交互時經過支撐平臺客戶端向其餘模塊或者其餘開發商提供服務時,也可使用hessian,支撐平臺定義相關接口以及接口的實現,而後建立一個支撐平臺客戶端打包成jar文件,其餘模塊引入此jar包就能調用支撐平臺的方法了,這樣只須要暴露接口給其餘模塊,達到對核心代碼的保護。

1.3       Hessian使用示例

1.3.1           服務端首先建立一個接口。

public interface HessianService {

   /**測試字符串返回*/

    public String getName();

    /**測試對象返回*/

    public People getPeople();

}

1.3.2           服務端HessianService實現以下:

public class HessianSeiviceImpl implements HessianService {

    String name="hello world";

   public String getName() {

      return name;

   }

   public People getPeople() {

      People people = new People("張三",25,"廣州市天河區");

      return people;

   }

}

 

1.3.3           web.xml中添加配置,以下:

<servlet>

  <servlet-name>hessianService</servlet-name>

  <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>

  <init-param>

      <param-name>home-class</param-name>

      <param-value>com.excellence.hessian.service.HessianServiceImpl

      </param-value>

  </init-param>

  <init-param>    

   <param-name>home-api</param-name>    <param-value>com.excellence.hessian.service.HessianService</param-value>

  </init-param>

</servlet>

<servlet-mapping>

  <servlet-name>hessianService</servlet-name>

  <url-pattern>/hessianService</url-pattern>

</servlet-mapping>

 

1.3.4          編寫客戶端遠程調用

public class HessianClient {

   public static void main(String[] args) {

        String url = "http://localhost:8080/hessianDemo/hessianService"

         HessianProxyFactory factory = new HessianProxyFactory(); 

         HessianService hessianService = null;

         try {

             hessianService =

(HessianService) factory.create(HessianService.class, url);

             People people = hessianService.getPeople(); 

             System.out.println("獲取字符串: " + hessianService.getName()); 

             System.out.println("獲取對象: " + people.getName());

         } catch (Exception e) {

             e.printStackTrace();

         } 

   }

}

輸入結果:獲取字符串: hello world

獲取對象: 張三

 

1.3.5          Spring來整合Hessian

1.3.5.1       WEB-INF下新建remote-servlet.xml

<beans>

   <bean id="_HessianService" class="com.excellence.hessian.service.HessianSeiviceImpl" />

  <bean name="/hessianService" class="org.springframework.remoting.caucho.HessianServiceExporter">

      <property name="service" ref="_HessianService" />

      <property name="serviceInterface" value="com.excellence.hessian.service.HessianService" />

   </bean>

 </beans>

1.3.5.2             Web.xml中添加以下配置

<servlet>

   <servlet-name>remote</servlet-name>

   <servlet-class>

      org.springframework.web.servlet.DispatcherServlet

   </servlet-class>

   <load-on-startup>1</load-on-startup>

</servlet>

 <servlet-mapping>

   <servlet-name>remote</servlet-name>

      <url-pattern>/remote/*</url-pattern>

</servlet-mapping>

web.xml中使用SpringDispatcherServlet../remote/*的請求路徑進行攔截;Spring會根據servlet-name標籤訂義的標識,自動在WEB-INF下尋找到remote-servlet.xml

Spirng整合後,不影響以前定義的HessianService服務接口,以及實現類。但整合後,服務接口和實現類只須要在remote -servlet.xml中添加相關配置,就能夠獲取到接口對象了,而不用到web.xml進行更改。

1.3.5.3             Hessian客戶端遠程調用

此時客戶端遠程調用一樣能夠和前面一致。url以下:

"http://localhost:8080/hessianDemo/hessianService

也能夠經過spring來實例化接口進行調用。步驟以下:

編寫SpingBean配置文件remote-client.xml

<beans>

    <bean id="hessianServiceClient" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">

        <property name="serviceUrl" value="http://localhost:8080/hessianDemo/hessianService"/>

        <property name="serviceInterface" value="com.excellence.hessian.service.HessianService"/>

    </bean>

 </beans>

 

編寫Sping測試客戶端

public static void main(String[] args) {

       ApplicationContext context = new ClassPathXmlApplicationContext("remote-client.xml");

       HessianService hessianService = null;

         try {

             hessianService = (HessianService) context.getBean("hessianServiceClient");

             People people = hessianService.getPeople(); 

             System.out.println("Hello: " + hessianService.getName()); 

             System.out.println("peopleName: " + people.getName());

         } catch (Exception e) {

             e.printStackTrace();

         } 

   }

輸出結果:Hello: hello world

peopleName: 張三

 

1.4       數據解析過程

對於服務器端較爲複雜的數據,服務器端將數據按照必定的格式序列化數據,客戶端經過服務器提供的客戶端jar反序列化數據,獲取所需的數據。以下圖所示:

 

說明:服務端指hessian服務提供方,Client指服務端提供給應用程序調用的工具程序,應用程序指服務調用方。

相關文章
相關標籤/搜索