浅谈Hessian远程调用及其使用

3 月,跳不动了?>>> hot3.png

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值