hessian是一個輕量級的remoting on http工具,使用簡單的方法提供了RMI的功能,相比WebService,Hessian更簡單、快捷。
採用的是二進制RPC協議,由於採用了二進制協議,因此它很適合於發送二進制數據,Hessian主要做面向對象的消息通訊。
Hessian的初衷就是支持動態類型,格式緊湊,跨語言Hessian是使用本身的序列化機制實現的編組和反編組,其支持的數據類型是有限制的,不支持複雜的對象,能夠穿透防火牆。
RMI是一組用戶開發分佈式應用程序的API,使用的是java序列化機制實現調用及返回值的編組與反編組。它使用Java語言接口定義了遠程對象,它集合了Java序列化和Java遠程方法協議(Java Remote Method Protocol)。他能夠被看作是RPC的Java版本,由於傳統的RPC並不能很好的應用於分佈式對象系統。而Java RMI則支持存儲於不一樣地址空間的程序級對象之間彼此進行通訊,實現遠程對象之間的無縫遠程調用。可是它也有缺點,RMI只能經過RMI協議來進行訪問,沒法經過HTTP協議訪問,沒法穿透防火牆。
還有一種遠程調用方法就是HttpInvoker:它也是將參數和返回值經過Java的序列化機制進行編組和反編組,它具備RMI支持的可序列化對象的優勢。試使用Http協議傳輸二進制流的,同時又具備Hessian、Burlap(傳輸xml文本)的優勢。java
寫一個Hessian須要注意的問題:web
一、Java服務器端必須具有如下幾點:spring
Serializable
接口Map
進行傳遞二、客戶端必須具有如下幾點:api
Hessian.jar
包HessianProxyFactory
調用遠程接口一、在服務端的接口:服務器
package com.test.hession; public interface IHello { String sayHello(); }
二、在服務端的實現類:app
package com.test.hession.service; import com.caucho.hessian.server.HessianServlet; import com.test.hession.IHello; public class IHelloImpl extends HessianServlet implements IHello { public String sayHello() { return "Hello,I from HessianService"; } }
三、在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>com.test.hession.service.impl.IHelloImpl</param-value> </init-param> <init-param> <param-name>home-api</param-name> <param-value>com.test.hession.service.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>
四、在客戶端的類:工具
package com.test.hession.client; import java.net.MalformedURLException; import com.caucho.hessian.client.HessianProxyFactory; import com.test.hession.IHello; public class ClientTest { public static String url = "http://127.0.0.1:8080/HessianService/Hello"; public static void main(String[] args){ HessianProxyFactory factory = new HessianProxyFactory(); try { IHello iHello = (IHello) factory.create(IHello.class, url); System.out.println(iHello.sayHello()); } catch (MalformedURLException e) { e.printStackTrace(); } } }
五、先將服務器端的類link到客戶端,或者是將服務器端打包放到客戶端,並運行ClientTest
,結果以下:url
Hello,I from HessianService
在實際應用中,咱們不是隻是簡單地只使用hessian來進行通訊的,若是方法多得話,還不如直接寫在客戶端來調用,然而當hessian與spring結合後,大大減小了這些操做,將dao層的操做所有放在hessian服務端,將業務邏輯所有放在hessian客戶端,這樣的話咱們的hessian客戶端和服務端徹底分離,所以咱們的業務邏輯和dao層就真正的達到了分離,就能夠放在不一樣的服務器上,固然hessian通訊的做用不只僅只有這些。
接口和實現和上邊的同樣,只是在web.xml
中配置比較麻煩。spa
增長remoting-servlet.xml
配置文件用來配置bean,並將bean導出爲hessian服務:
<?xml version = "1.0" encoding = "UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> <!-- 定義普通的bean實例 --> <bean id="Hello" class="com.test.hession.service.impl" /> <!-- 使用HessianServiceExporter 將普通bean導出成Hessian服務 --> <bean name="/remoting" class="org.springframework.remoting.caucho.HessianServiceExporter"> <!-- 須要導出的目標bean --> <property name="service" ref="Hello" /> <!-- Hessian服務的接口 --> <property name="serviceInterface" value="com.kcpt.hessian.service.IHello" /> </bean> </beans>
web.xml
文件的配置<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> <!--添加監聽器 --> </listener> <!-- 指定spring的配置文件在哪裏,在這個配置文件中導出了Hessian服務 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/remoting-servlet.xml</param-value> </context-param> <!-- Hessian經過Servlet提供遠程服務,須要將某個匹配的模式映射到hessian服務中,spring的dispatcherServlet能完成此功能, DispatcherServlet可將匹配模式的請求轉發到Hessian服務,web.xml只是定義了「請求轉發器」,該轉發器將匹配/remoting/*的請求截獲,轉發給context的bean處理。 而HessianServiceExporter提供bean服務。 --> <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>
<?xml version = "1.0" encoding = "UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> <bean id="myServiceClient" class="org.springframework.remoting.caucho.HessianProxyFactoryBean"> <property name="serviceUrl"> <value>http://127.0.0.1:8080/HessianService/remoting2</value> </property> <property name="serviceInterface"> <value>com.test.hession.service.IHello</value> </property> </bean> </beans>
package com.test.App; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.test.hession.service.IHello; public class App { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("Application.xml"); //這裏只是你聲明的bean的xml文件所在的路徑 IHello b = (IHello) context.getBean("myServiceClient"); System.out.println(b.sayHello()); } }
來獲取到IHello
這個接口,從而就可以調用這個接口裏的方法進行操做
做者:世界百科 連接:http://www.jianshu.com/p/5e8a7148dd68 來源:簡書 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。