Hessian是一個輕量級的remoting onhttp工具,是由 caucho 提供的一種開源的遠程通信協議。相比WebService,Hessian更簡單、快捷、同時支持跨語言通信。Hessian採用的是二進制RPC協議,基於 HTTP 傳輸。java
Hessian是經過Servlet提供遠程服務。首先須要將匹配某個模式的請求映射到Hessian服務。Spring的DispatcherServlet能夠完成該功能,DispatcherServlet可將匹配模式的請求轉發到Hessian服務。Hessian的服務端提供一個servlet基類, 用來處理髮送的請求,而Hessian的這個遠程過程調用,徹底使用動態代理來實現的,採用面向接口編程。 所以,Hessian服務建議經過接口暴露。web
在項目中因爲核心包只能使用的jdk是1.4的,致使部分java特性,或者部分功能依賴高版本jdk才能實現,好比pdf回填、dbf導入、word轉pdf等功能都須要依賴較高版本jdk。此時就須要在另外一個服務器上對這類功能進行實現,而後經過hessian代理方式提供接口供程序調用。還有就是項目中須要和其餘開發商進行數據交互時經過支撐平臺客戶端向其餘模塊或者其餘開發商提供服務時,也可使用hessian,支撐平臺定義相關接口以及接口的實現,而後建立一個支撐平臺客戶端打包成jar文件,其餘模塊引入此jar包就能調用支撐平臺的方法了,這樣只須要暴露接口給其餘模塊,達到對核心代碼的保護。spring
public interface HessianService {編程 /**測試字符串返回*/api public String getName();服務器 /**測試對象返回*/app public People getPeople();工具 }測試 |
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; } } |
<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> |
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 獲取對象: 張三 |
<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> |
<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中使用Spring的DispatcherServlet對../remote/*的請求路徑進行攔截;Spring會根據servlet-name標籤訂義的標識,自動在WEB-INF下尋找到remote-servlet.xml。
與Spirng整合後,不影響以前定義的HessianService服務接口,以及實現類。但整合後,服務接口和實現類只須要在remote -servlet.xml中添加相關配置,就能夠獲取到接口對象了,而不用到web.xml進行更改。
此時客戶端遠程調用一樣能夠和前面一致。url以下:
"http://localhost:8080/hessianDemo/hessianService |
也能夠經過spring來實例化接口進行調用。步驟以下:
編寫Sping的Bean配置文件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: 張三 |
對於服務器端較爲複雜的數據,服務器端將數據按照必定的格式序列化數據,客戶端經過服務器提供的客戶端jar反序列化數據,獲取所需的數據。以下圖所示:
說明:服務端指hessian服務提供方,Client指服務端提供給應用程序調用的工具程序,應用程序指服務調用方。
Hessian是一個輕量級的remoting onhttp工具,是由 caucho 提供的一種開源的遠程通信協議。相比WebService,Hessian更簡單、快捷、同時支持跨語言通信。Hessian採用的是二進制RPC協議,基於 HTTP 傳輸。
Hessian是經過Servlet提供遠程服務。首先須要將匹配某個模式的請求映射到Hessian服務。Spring的DispatcherServlet能夠完成該功能,DispatcherServlet可將匹配模式的請求轉發到Hessian服務。Hessian的服務端提供一個servlet基類, 用來處理髮送的請求,而Hessian的這個遠程過程調用,徹底使用動態代理來實現的,採用面向接口編程。 所以,Hessian服務建議經過接口暴露。
在項目中因爲核心包只能使用的jdk是1.4的,致使部分java特性,或者部分功能依賴高版本jdk才能實現,好比pdf回填、dbf導入、word轉pdf等功能都須要依賴較高版本jdk。此時就須要在另外一個服務器上對這類功能進行實現,而後經過hessian代理方式提供接口供程序調用。還有就是項目中須要和其餘開發商進行數據交互時經過支撐平臺客戶端向其餘模塊或者其餘開發商提供服務時,也可使用hessian,支撐平臺定義相關接口以及接口的實現,而後建立一個支撐平臺客戶端打包成jar文件,其餘模塊引入此jar包就能調用支撐平臺的方法了,這樣只須要暴露接口給其餘模塊,達到對核心代碼的保護。
public interface HessianService { /**測試字符串返回*/ public String getName(); /**測試對象返回*/ public People getPeople(); } |
public class HessianSeiviceImpl implements HessianService { String name="hello world"; public String getName() { return name; } public People getPeople() { People people = new People("張三",25,"廣州市天河區"); return people; } } |
<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> |
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 獲取對象: 張三 |
<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> |
<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中使用Spring的DispatcherServlet對../remote/*的請求路徑進行攔截;Spring會根據servlet-name標籤訂義的標識,自動在WEB-INF下尋找到remote-servlet.xml。
與Spirng整合後,不影響以前定義的HessianService服務接口,以及實現類。但整合後,服務接口和實現類只須要在remote -servlet.xml中添加相關配置,就能夠獲取到接口對象了,而不用到web.xml進行更改。
此時客戶端遠程調用一樣能夠和前面一致。url以下:
"http://localhost:8080/hessianDemo/hessianService |
也能夠經過spring來實例化接口進行調用。步驟以下:
編寫Sping的Bean配置文件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: 張三 |
對於服務器端較爲複雜的數據,服務器端將數據按照必定的格式序列化數據,客戶端經過服務器提供的客戶端jar反序列化數據,獲取所需的數據。以下圖所示:
說明:服務端指hessian服務提供方,Client指服務端提供給應用程序調用的工具程序,應用程序指服務調用方。