RPC 框架设计

1、前言

对于 Java 得 RPC 框架来说(比如 dubbo),大量的用了动态代理的知识。如果需要知道框架怎么玩的,那么首先得知道 Jdk 动态代理怎么写的(建议先好好看看 Java 动态代理)。

1)对于 consumer 而言,我们通过接口得到的是一个代理对象,比如:

Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[]{origin},  h);

我们通过这句代码得到一个代理对象,在 h(InvocationHandler)实现的 invoke 方法中

 @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            //  .......
    }

会真正进行 RPC 的调用,通过 url、接口名、方法名、参数类型、参数值等调用 provider 的服务。

2)对于 provider 而言,也是同样的处理方法,实际被调用的也是创建的代理对象,因为框架想在调用实际实现类的方法之前做很多的拦截过滤的操作,所以比较优雅的方式是创建代理对象,先对请求做一系列过滤,最后再调用实现类方法返回。

这两点很重要,谨记!!!
ps:RPC 最简单的结构即 consumer 只要知道 provider 提供的方法,然后根据方法发送请求,provider 根据方法名找到实现类,调用返回即可,哈哈哈。

2、设计

对于一个 RPC 框架而言,最重要的模块并不是网络通信部分(虽然这也很重要,但毕竟现在有大量通信框架,比如 netty),而是 provider 怎么构造拦截器链、怎么注册服务,consumer 怎么拉取服务,怎么调用。

此 RPC 实现来自于 github 连接:https://github.com/stateIs0/Lu-Rpc.git
这项目我其实看了两次,最近看才豁然开朗 RPC 是怎么实现的,后面可以帮助我阅读 dubbo 源码。

一个通用的 RPC 框架要实现这几种功能:服务注册发现、网络通信、负载均衡、plugin(插件模块可以加入熔断器、限流器、监控层等)。此项目主要实现了服务注册(为了简单,直接用本地文件注册,实际上可以扩展到任何注册中心),网络通信(使用了 soft-rpc 框架,虽然看上去有点多此一举,但项目还是保留了很多精华部分,soft-rpc 东西并没有显现太多)、熔断器(手把手实现了一个熔断器)、限流器(手把手)。对于 client、server 调用的类,都是基于 jdk 动态代理。

此 RPC 重点突出了动态代理的实现,熔断、限流等,关于熔断可以参照此说明:熔断器设计(二)。限流的话,作者不只是限流,而且限流后被限制的流量加入一个缓冲区,等到其他线程调用方法结束再才能继续执行。这边限流针对于方法而已,方法绑定n个信号量,获取了才能继续进行。跟漏桶、令牌桶算法不同的是,这边是强制限流,规定死能拿到的数目,只能其他线程释放才能继续进行。

3、总结

你可能感兴趣的:(RPC 框架设计)