在很久之前, 我们一起领略了 RMI 提供远程服务的过程
https://blog.csdn.net/bestcxx/article/details/79488165
本篇我们继续深入下去,了解 Hessian 提供远程服务的过程
相比 RMI 而言,Hessian 是跨语言的
RMI 是 Java 语言自己提供的远程调用过程解决方法,它要求服务的提供者和调用者都必须是 Java 语言,而由于 Hessian 对外而言类似于一个 http 服务,所以可以跨语言访问。延伸来说,由于 RMI 需要注册端口和一个随机分配的数据通信端口,导致其会遇到防火墙问题,而 Hessian 借助于 http 服务,可以避免这个问题。
Hessian 基于二进制消息通信
和 RMI 一样,Hessian 也是通过二进制消息进行通信的。
序列化的问题
Hessian 的序列化机制不同于 Java 的序列化机制,Hessian 的序列化机制相对而言更加快捷,但是可靠性不如java,因为 Hessian 的序列化机制是私有的,所以造成其序列化信息并没有携带全部的信息,这导致在处理复杂对象的时候有时会出现问题。
Spring 4 结合 Hessian 4
Maven 依赖引入 Hessian 包-服务端和客户端
<dependency> <groupId>com.caucho</groupId> <artifactId>hessian</artifactId> <version>4.0.38</version> </dependency>
服务端的特殊配置
类似于 RMI 服务的发布,Hessian 服务的发布也需要先将本地的服务声明为 Hessian 服务
/** * 注册为远程服务 * @return */ @Bean public HessianServiceExporter hessianExportedApiService(){ HessianServiceExporter exporter=new HessianServiceExporter(); exporter.setService(getApiService()); exporter.setServiceInterface(ApiService.class); return exporter; } /** * 注册为Spring Bean * @return */ @Bean public ApiService getApiService(){ return new ApiServiceImpl(); }
除此之外,还需要设置一个 url 映射,当 web 访问请求符合映射时,将会转由 Hessian 服务来进行处理
/** * 设置URL映射 */ @Bean public HandlerMapping hessianMapping(){ SimpleUrlHandlerMapping shm=new SimpleUrlHandlerMapping(); Properties properties=new Properties(); properties.put("/api.service", "hessianExportedApiService"); shm.setMappings(properties); return shm; }
最后服务端是一个web工程,所以附带web.xml 的内容
<servlet-mapping> <servlet-name>springservlet</servlet-name> <url-pattern>/</url-pattern> <!-- <url-pattern>*.service</url-pattern> --> </servlet-mapping>
客户端的调用
客户端的调用过程相对服务端简单了许多
/**
* 为远程服务设置代理
* @return
*/
@Bean
public HessianProxyFactoryBean apiService(){
HessianProxyFactoryBean proxy=new HessianProxyFactoryBean();
proxy.setServiceUrl("http://localhost:8086/hessian-provider/api.service");
proxy.setServiceInterface(ApiService.class);
return proxy;
}
github 完整例子
https://github.com/Bestcxy/RPC/tree/master/hessian
hessian-api 定义接口
hessian-provider 提供服务
hessian-consumer 调用Hessian 服务调用结果
启动两个web 项目,访问 http://localhost:8085/hessian-consumer/
{"result":"success","name":"服务端:用户输入了姓名=jecket","model":{"userName":"jecket","age":20}}