http,webservice等web服务实现RPC大都使用文本协议进行数据传输,弊端在于使用文本进行数据传输浪费了部分网络带宽,尤其在传输大量的可通过编码压缩的数据时其性能有很大的可提升空间,通过对RPC传输的数据进行必要的编码能降低服务负载和网络IO开销,提高系统整体性能。
Hession是一个Web服务协议,独立使用不依赖其它大的框架,以二进制形式进行数据传递。支持多客户端。支持Falsh而实现的ActionScript, Burlap实现基于XML的数据序列化传输协议。有如下优点:
- 独立jar,没有其它依赖
- 多客户端支持,统一定义序列化协议
- 二进制序列化协议,数据传输效率高,适合优化基于Http服务的web请求
- 支持基于XML的消息协议
基于以上述表述,这里使用Hessian来定义一个简单的RPC服务调用。
定义RPC服务接口
接口文件需要在RPC服务端和客户端共享,这里以独立项目提供 “hessian-interfaces”,接口文件定义如下
package cn.com.xiaofen.hessian_interfaces; public interface HelloInterface { public String hello(); }
RPC服务端实现
HessianRPC依赖于Web容器而存在,Hessian提供了“com.caucho.hessian.server.HessianServlet
” 支持在Servlet中即用的RPC服务端API,通过继承HessianServlet即可发布RPC服务。以下代码定义一个BasicService Servlet继承HessianServlet并实现了服务端接口HelloInterface 发布一个RPC 服务端对象。
package cn.com.xiaofen.hessiantest.server; import javax.servlet.annotation.WebServlet; import com.caucho.hessian.server.HessianServlet; import cn.com.xiaofen.hessian_interfaces.HelloInterface; @WebServlet("/hello") public class BasicService extends HessianServlet implements HelloInterface { private static final long serialVersionUID = 1L; @Override public String hello() { return "hai i`m from hessian server "; } }上述代码发布一个远程RPC 服务,接口地址为Servlet发布的HTTP地址如"http://localhost:8887/hessian-server/hello" ,Hessian RPC调用通过POST请求来接收来自于客户端的RPC请求。
RPC 客户端实现
Hessian 客户端使用“com.caucho.hessian.client.HessianProxyFactory” 对象创建Hessian RPC 客户端代理对象,其内部封装了Hessian 序列化\反序列化\网络请求的细节,创建代理对象需要指定远程RPC地址以及服务接口对象。客户端通过HessianProxyFactory 创建的代理对象调用RPC 服务得到远程响应。
package cn.com.xiaofen.hessiantest; import java.net.MalformedURLException; import com.caucho.hessian.client.HessianProxyFactory; import cn.com.xiaofen.hessian_interfaces.HelloInterface; public class HessionClient { public static void main(String[] args) throws MalformedURLException { String url="http://localhost:8887/hessian-server/hello"; HessianProxyFactory factory = new HessianProxyFactory(); HelloInterface helloService = (HelloInterface) factory.create(HelloInterface.class, url); System.out.println("message from hessian : " + helloService.hello()); } }
Spring 整合Hessian RPC Client
这里使用比较通用的,只使用Spring的自动装配功能以自动注入Hessian RPC 代理对象,这里依赖于spring-web模块提供的“org.springframework.remoting.caucho.HessianProxyFactoryBean” 来注入代理对象 spring.xml中做如下配置。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="hessianProxyFactory" class="org.springframework.remoting.caucho.HessianProxyFactoryBean"> <property name="serviceUrl" value="http://localhost:8887/hessian-server/test"></property> <property name="serviceInterface" value="cn.com.xiaofen.hessian_interfaces.HelloInterface"></property> </bean> </beans>
下面提供一个在Spring Boot中通过注入的Hessian RPC 代理对象来访问远程服务。
package com.xiaofen.hessian; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import cn.com.xiaofen.hessian_interfaces.HelloInterface; @RestController public class HelloService { @Autowired HelloInterface helloInterface; @RequestMapping("/hession/hello") public String teseHessian() { return helloInterface.hello(); } }
结语
基于Hessian提供的RPC特性可以很容易的实现RPC服务的注册和监控以及服务的负载均衡等高级特定,Hessian本身只提供RPC的低层实现。有兴趣可以看看Dubbo对Hessian的使用。