前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >轻量级Rpc框架Hessian学习笔记

轻量级Rpc框架Hessian学习笔记

作者头像
写一点笔记
发布2022-08-11 17:03:49
1.3K0
发布2022-08-11 17:03:49
举报
文章被收录于专栏:程序员备忘录程序员备忘录

1.Hessian简介

Hessian是一个轻量级的远程http工具,采用binaray Rpc协议,适合发送二进制数据,同时具有防火墙穿透能力,hessian一般通过web应用来提供服务。一句话说就是Hessian是一个基于http的二进制rpc轻量级工具。

Hessian官网是:http://hessian.caucho.com/

2.Hessian的使用

一般来说,对于RPC远程调用都类似于RMI这种形式。Hessian也是这种,需要服务端和消费端通过接口相关联,服务端实现接口,当然数据在网络传输之后要进行还原就需要序列号。基于以上描述,我们做个简单的demo学习一下Hessian。

公用接口:

代码语言:javascript
复制
public interface SayHello {

    HelloEntity hello(String name);
}

传输的实体:

代码语言:javascript
复制
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 + '\'' +
                '}';
    }
}

服务端接口实现:

代码语言:javascript
复制
@Component
public class SayHelloService implements SayHello {
    @Override
    public HelloEntity hello(String name) {
        return new HelloEntity("你好!"+name);
    }
}

在服务端我们将实现注入到spring容器中,在处理请求的时候再从容器中获取实现进行调用。

服务端接口对外暴露:

代码语言:javascript
复制
@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;
    }
}

客户端调用:

代码语言:javascript
复制
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 的类关系。

代码语言:javascript
复制
@FunctionalInterface
public interface HttpRequestHandler {
    void handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws ServletException, IOException;
}

HttpRequestHandler 是SpringMvc请求的拦截器,每个请求都会根据url拿到这个handler,然后执行各种的handleRequest方法,所以这个handleRequest就是扩展的核心。所以我们可以通过实现这个httpRequestHandler,然后将其注册到mappers关系中,就可以自由的实现我们的一些固定模式的接口开发。

晚安~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 写点笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档