dubbo的远程调用过程是怎么样的?
dubbo远程过程调用经过了那些处理?
发起远程调用的时候究竟传了什么数据给provider?
要解决这些问题,欢迎一起探讨走进dubbo源码栏目。
在service reference中说了consumer端发起调用的时候使用的是远程服务的本地代理,发起调用的堆栈是
(上面调用堆栈中的filter链先不介绍了,留在后面service reply中介绍,因为consumer和provider的filter链构造过程是类似的)
前面说过consumer在引用服务的时候最终会生成一个proxy,该proxy是实现了对应的服务接口(比如:com.test.service.TestDubboService),而且包含一个InvokerInvocationHandler属性,在proxy的服务接口方法中调用InvokerInvocationHandler.invoke
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String methodName = method.getName();
Class<?>[] parameterTypes = method.getParameterTypes();
// 判断是否是Object的方法,如果是则直接执行本地调用,不发起远程调用
if (method.getDeclaringClass() == Object.class) {
return method.invoke(invoker, args);
}
// toString、hashCode、equals执行本地调用
if ("toString".equals(methodName) && parameterTypes.length == 0) {
return invoker.toString();
}
if ("hashCode".equals(methodName) && parameterTypes.length == 0) {
return invoker.hashCode();
}
if ("equals".equals(methodName) && parameterTypes.length == 1) {
return invoker.equals(args[0]);
}
// RpcInvocation是一个很重要的类,是真正在consumer和provider之间通过网络传输的实体,里面包含了服务调用需要的必要信息
RpcInvocation invocation = ne