深入研究史上最简单rpc框架

934 阅读3分钟

说明

这篇文章,主要是讲解和研究dubbo作者梁飞的这篇文章。

RPC框架几行代码就够了 www.iteye.com/blog/javata…

主要步骤

服务器启动——》注册服务——》等待客户端连接。

然后,客户端启动——》获取远程服务——》创建代理类。

接着,客户端调用远程服务(基于代理类)——》代理类-handler类的invoke()方法。

客户端,继续在invoke()方法里,写数据(主要是方法名字,方法参数,方法参数的类型,这些数据唯一定位是哪个方法)到服务器。

服务器接受客户端连接,从客户端读数据,调用本地服务方法——》得到响应数据——》写数据到客户端。

客户端,在invoke()方法里,从服务器读数据。然后,跳出invoke()方法,回到主业务流程,最终得到调用远程服务方法的返回数据。


核心有两个
1.服务器和客户端,互相读写数据
2.读写数据的具体实现,就是基于socket

核心流程

动态代理的核心流程是,调用方法——》代理-handler类的invoke()方法。//客户端

反射的核心流程是,反射-invoke()方法——》调用实现类的方法。//服务器端

客户端-获取实现类

执行之后,获取的是实现类的实例对象


两个问题
1.为什么可以获取到?如何获取到的?
2.为什么是Proxy-实现类?

主要是通过这里获取到的

Proxy.newProxyInstance();

上面方法的三个参数说明

public static Object newProxyInstance(ClassLoader loader, //接口的类加载器
                                          Class<?>[] interfaces, //接口
                                          InvocationHandler h) //回调方法

所以,第一个问题,为什么可以获取到?如何获取到的?答案就是从这里获取的。

第二个问题,为什么是代理-实现类?因为是通过代理类Proxy来创建实例的。


为什么可以通过接口,来创建实现类的实例对象?

传入的数据是接口,为什么输出是实现类的实例?为什么Proxy可以根据接口,来创建实现类的实例呢?

截图里可以看到,idea获取到的是Proxy-实现类。为什么是输入是接口,输出是实现类?

jdk-代理

只能是接口,不能是实现类。

Proxy-handler

回调就是handler,handler就是回调。

为什么会被回调?回调的本质是什么?

回调的本质是转发请求,即本来是调用方法,但是调用方法之后,就会被转发到代理-handler里的invoke()方法,即
1.先调用方法
2.然后,进入到handler里的invoke()方法

代理和反射的区别?

我们常说,注入数据是基于反射,aop是基于动态代理。但其实差不多,因为动态代理的实现也使用了反射。

而且,反射和动态代理,这些类所在的包,都是在反射包里。

视频教程

自己录的视频教程,看流程是怎么走的。

www.bilibili.com/video/av885…

源码

github.com/diedai/rpc-…

服务器-注册多个服务?

如何注册多个服务?

如何知道是哪个服务?

客户端调用的时候,服务器如何知道是调用哪个服务?

参考

blog.csdn.net/qq_32296307…