Java學習之Hessian通訊基礎

1、首先先說Hessian是什麼?

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

2、寫一個簡單的hessian通訊

寫一個Hessian須要注意的問題:web

一、Java服務器端必須具有如下幾點:spring

  • 包含Hessian的jar包
  • 設計一個接口,用來給客戶端調用
  • 實現該接口的動能
  • 配置web.xml,配置相應的servlet
  • 對象必須實現Serializable接口
  • 複雜對象可使用Map進行傳遞

二、客戶端必須具有如下幾點:api

  • java客戶端包含Hessian.jar
  • 具備和服務器端結構同樣的接口和實體類,包括命名空間。
  • 利用HessianProxyFactory調用遠程接口

3、簡單hessian實例:

一、在服務端的接口:服務器

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

4、hessian與spring結合

在實際應用中,咱們不是隻是簡單地只使用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文件的配置

spring的監聽器

<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 來源:簡書 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

相關文章
相關標籤/搜索