浅谈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指服务端提供给应用程序调用的工具程序,应用程序指服务调用方。

相关文章
相关标签/搜索