您的位置:首页 > 其它

浅谈Hessian远程调用及其使用

2016-06-30 07:41 267 查看
摘要: hessian进行远程调用及提供远程服务

1.1 概述

Hessian是一个轻量级的remoting onhttp工具,是由 caucho 提供的一种开源的远程通讯协议。相比WebService,Hessian更简单、快捷、同时支持跨语言通讯。Hessian采用的是二进制RPC协议,基于 HTTP 传输。

Hessian是通过Servlet提供远程服务。首先需要将匹配某个模式的请求映射到Hessian服务。Spring的DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务。Hessian的服务端提供一个servlet基类, 用来处理发送的请求,而Hessian的这个远程过程调用,完全使用动态代理来实现的,采用面向接口编程。 因此,Hessian服务建议通过接口暴露。

1.2 项目应用场景

在项目中由于核心包只能使用的jdk是1.4的,导致部分java特性,或者部分功能依赖高版本jdk才能实现,比如pdf回填、dbf导入、word转pdf等功能都需要依赖较高版本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中使用Spring的DispatcherServlet对../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来实例化接口进行调用。步骤如下:

编写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: 张三

1.4 数据解析过程

对于服务器端较为复杂的数据,服务器端将数据按照一定的格式序列化数据,客户端通过服务器提供的客户端jar反序列化数据,获取所需的数据。如下图所示:

说明:服务端指hessian服务提供方,Client指服务端提供给应用程序调用的工具程序,应用程序指服务调用方。

1.1 概述

Hessian是一个轻量级的remoting onhttp工具,是由 caucho 提供的一种开源的远程通讯协议。相比WebService,Hessian更简单、快捷、同时支持跨语言通讯。Hessian采用的是二进制RPC协议,基于 HTTP 传输。

Hessian是通过Servlet提供远程服务。首先需要将匹配某个模式的请求映射到Hessian服务。Spring的DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务。Hessian的服务端提供一个servlet基类, 用来处理发送的请求,而Hessian的这个远程过程调用,完全使用动态代理来实现的,采用面向接口编程。 因此,Hessian服务建议通过接口暴露。

1.2 项目应用场景

在项目中由于核心包只能使用的jdk是1.4的,导致部分java特性,或者部分功能依赖高版本jdk才能实现,比如pdf回填、dbf导入、word转pdf等功能都需要依赖较高版本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中使用Spring的DispatcherServlet对../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来实例化接口进行调用。步骤如下:

编写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: 张三

1.4 数据解析过程

对于服务器端较为复杂的数据,服务器端将数据按照一定的格式序列化数据,客户端通过服务器提供的客户端jar反序列化数据,获取所需的数据。如下图所示:

说明:服务端指hessian服务提供方,Client指服务端提供给应用程序调用的工具程序,应用程序指服务调用方。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hessian 远程服务