网站建设服务好的商家,js特效网站模板下载,网站负责人幕布照片,wordpress 文章只显示摘要1 Dubbo服务消费端远程调用过程概述
#xff08;1#xff09;当消费方调用远程服务的方法时#xff0c;会被InvokerInvocationHandler拦截#xff0c;执行其invoke()方法#xff0c;创建RpcInvocation对象#xff1b;
#xff08;2#xff09;接着会选择远程调用的负…1 Dubbo服务消费端远程调用过程概述
1当消费方调用远程服务的方法时会被InvokerInvocationHandler拦截执行其invoke()方法创建RpcInvocation对象
2接着会选择远程调用的负载均衡策略
3最后执行DubboInvoker的doInvoke()方法发起远程调用。 2 消费端远程调用执行入口
服务消费端启动时会为需要调用的远程服务类创建代理类通过ReferenceConfig的get()方法其中代理类的方法拦截器为InvokerInvocationHandler。代码如下所示。 public T T getProxy(InvokerT invoker, Class?[] interfaces) {try {return (T) Proxy.getProxy(interfaces).newInstance(new InvokerInvocationHandler(invoker));} catch (Throwable fromJavassist) {// try fall back to JDK proxy factorytry {T proxy jdkProxyFactory.getProxy(invoker, interfaces);logger.error(PROXY_FAILED, , , Failed to generate proxy by Javassist failed. Fallback to use JDK proxy success. Interfaces: Arrays.toString(interfaces), fromJavassist);return proxy;} catch (Throwable fromJdk) {logger.error(PROXY_FAILED, , , Failed to generate proxy by Javassist failed. Fallback to use JDK proxy is also failed. Interfaces: Arrays.toString(interfaces) Javassist Error., fromJavassist);logger.error(PROXY_FAILED, , , Failed to generate proxy by Javassist failed. Fallback to use JDK proxy is also failed. Interfaces: Arrays.toString(interfaces) JDK Error., fromJdk);throw fromJavassist;}}}
所以当消费方调用远程服务的方法时会被InvokerInvocationHandler拦截执行其invoke()方法。其中method为调用的方法args为参数。此处创建的RpcInvocation对象会一直传递下去直到发起远程调用。invoke()方法代码如下所示。 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if (method.getDeclaringClass() Object.class) {return method.invoke(invoker, args);}String methodName method.getName();Class?[] parameterTypes method.getParameterTypes();if (parameterTypes.length 0) {if (toString.equals(methodName)) {return invoker.toString();} else if ($destroy.equals(methodName)) {invoker.destroy();return null;} else if (hashCode.equals(methodName)) {return invoker.hashCode();}} else if (parameterTypes.length 1 equals.equals(methodName)) {return invoker.equals(args[0]);}RpcInvocation rpcInvocation new RpcInvocation(serviceModel, method.getName(), invoker.getInterface().getName(), protocolServiceKey, method.getParameterTypes(), args);if (serviceModel instanceof ConsumerModel) {rpcInvocation.put(Constants.CONSUMER_MODEL, serviceModel);rpcInvocation.put(Constants.METHOD_MODEL, ((ConsumerModel) serviceModel).getMethodModel(method));}return InvocationUtil.invoke(invoker, rpcInvocation);}