dubbo的确比较复杂,模块比较多,乍一看挺头疼,关键是缺少思路类的文档,梳理起来相对费劲。
说说主线吧,实现一个rpc主线逻辑其实还蛮简单的:
1. server 端 起一个tcp server,预备将对外提供的服务初始化,接收client端的请求。
2. client 端 发起一个远程调用,通过 约定的协议,server端接收到请求,判断是否提供该服务,是则执行相应 对象.方法,然后把数据返回给客户端。
原理说清楚了,落地就会各种麻烦了,需要通用,透明。不妨抛几个主要问题出来,探讨一下,
1. server 端 提供多个服务的时候,如何将 client 端的请求,通用的方式对应到相应服务实现类上执行?
2. client 端,通常没有实现类,只有接口,那这时,如何通用?透明?的让用户写代码? 如何通用,透明的执行远程调用?
dubbo是这么做的
Server端:
1. Invoker 对象,这是对所有 服务对象的一个抽象,例如 AService,BService 都转化成 Invoker 对象,所有的方法调用,全转化为Invoker.invoke(Invocation inv)方法调用。
Invovation 包含几个关键方法 getMethodName ,getParameterType , getArguments ....等
疑问: invokerA.invoke(invocation) 如何对应到执行代码 AServce.methodA()?
每个Invoker 都持有真正的Service对象,当执行invoke时,知道了方法名,参数列表和参数值,通过反射来调用Service对象的方法
Client 端:
1. 接口是无法执行的,我们必须首先有个接口的实现类,然后调用具体某个方法,然后框架能自动帮我执行例如:建立连接,发送请求,接收响应,返回等操作。
框架怎么搞的呢? jdk Proxy,动态生成一个 接口实现类。