dubbo的远程调用过程是怎么样的?
dubbo远程过程调用经过了那些处理?
发起远程调用的时候究竟传了什么数据给provider?
要解决这些问题,欢迎一起探讨走进dubbo源码栏目。
在service reference中说了consumer端发起调用的时候使用的是远程服务的本地代理,发起调用的堆栈是
前面说过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 = new RpcInvocation(method, args); Result r = null; try { r = invoker.invoke(invocation); Object o = r.recreate(); return o; } catch (Throwable e) { // ... 省略中间代码 } } public class RpcInvocation implements Invocation, Serializable { private static final long serialVersionUID = -4355285085441097045L; // 调用的方法全限定名 private String methodName; // 方法的参数类型 private Class<?>[] parameterTypes; // 入参 private Object[] arguments; // 附件,可以传递一些其他信息 private Map<String, String> attachments; // invoker private transient Invoker<?> invoker; // ... 省略中间代码 }