轻量级Rpc框架Hessian学习笔记

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关系中,就可以自由的实现我们的一些固定模式的接口开发。

晚安~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值