1.Hessian简介
Hessian是一个轻量级的远程http工具,采用binaray Rpc协议,适合发送二进制数据,同时具有防火墙穿透能力,hessian一般通过web应用来提供服务。一句话说就是Hessian是一个基于http的二进制rpc轻量级工具。
Hessian官网是:http://hessian.caucho.com/
2.Hessian的使用
一般来说,对于RPC远程调用都类似于RMI这种形式。Hessian也是这种,需要服务端和消费端通过接口相关联,服务端实现接口,当然数据在网络传输之后要进行还原就需要序列号。基于以上描述,我们做个简单的demo学习一下Hessian。
公用接口:
public interface SayHello {
HelloEntity hello(String name);
}
传输的实体:
public class HelloEntity implements Serializable {
private String tian;
public HelloEntity(String tian) {
this.tian = tian;
}
public String getTian() {
return tian;
}
public void setTian(String tian) {
this.tian = tian;
}
@Override
public String toString() {
return "HelloEntity{" +
"tian='" + tian + '\'' +
'}';
}
}
服务端接口实现:
@Component
public class SayHelloService implements SayHello {
@Override
public HelloEntity hello(String name) {
return new HelloEntity("你好!"+name);
}
}
在服务端我们将实现注入到spring容器中,在处理请求的时候再从容器中获取实现进行调用。
服务端接口对外暴露:
@Configuration
public class MyService {
@Resource
private SayHelloService sayHelloService;
@Bean("/hello.htm")
public HessianServiceExporter exportHelloHessian() {
HessianServiceExporter exporter = new HessianServiceExporter();
exporter.setService(sayHelloService);
exporter.setServiceInterface(SayHello.class);
return exporter;
}
}
客户端调用:
public class TestHessian {
public staticT getHessianClientBean(Classclazz,String url) throws Exception{
// 客户端连接工厂,这里只是做了最简单的实例化,还可以设置超时时间,密码等安全参数
HessianProxyFactory factory = new HessianProxyFactory();
return (T)factory.create(clazz,url);
}
public static void main(String[] args) {
// 服务器暴露出的地址
String url = "http://localhost:8081/hello.htm";
// 客户端接口,需与服务端对象一样
try {
SayHello helloHessian =TestHessian.getHessianClientBean(SayHello.class,url);
HelloEntity msg = helloHessian.hello("你好");
System.out.println(msg);
} catch (Exception e) {
e.printStackTrace();
}
}
}
调用结果:
至此demo是学完了,那么问题是这里的HessianServiceExporter 以及背后的HandlerMapping是如何执行的,这块就不研究了。有一种写法是这样的。
查看SimpleUrlHandlerMappings的实现,发现mapping在注册请求url的时候会将处理器注册进去,如果是string类型的,那么会从spring上下文中获取该名称的bean,然后进行注册。所以这块的HessianServiceExporter 其实就相当于更上层次的处理器。相当于在上层进行了请求的定制化处理。我们看一下HessianServiceExporter 的类关系。
@FunctionalInterface
public interface HttpRequestHandler {
void handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws ServletException, IOException;
}
HttpRequestHandler 是SpringMvc请求的拦截器,每个请求都会根据url拿到这个handler,然后执行各种的handleRequest方法,所以这个handleRequest就是扩展的核心。所以我们可以通过实现这个httpRequestHandler,然后将其注册到mappers关系中,就可以自由的实现我们的一些固定模式的接口开发。
晚安~