说明
这篇文章,主要是讲解和研究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是基于动态代理。但其实差不多,因为动态代理的实现也使用了反射。
而且,反射和动态代理,这些类所在的包,都是在反射包里。
视频教程
自己录的视频教程,看流程是怎么走的。
源码
服务器-注册多个服务?
如何注册多个服务?
如何知道是哪个服务?
客户端调用的时候,服务器如何知道是调用哪个服务?