dubbo-AbstractInvoker
AbstractInvoker抽象类,有三个继承类分别为DubboInvoker、RestInvoker、TripleInvoker,这种三种分别对应的是三个不同协议,分为dubbo、rest以及dubbo3推荐的triple协议。
AbstractInvoker抽象类中核心的方法有invoke方法,内部核心代码如下:
public Result invoke(Invocation inv) throws RpcException { if (isDestroyed()) { logger.warn( PROTOCOL_FAILED_REQUEST, "", "", "Invoker for service " + this + " on consumer " + NetUtils.getLocalHost() + " is destroyed, " + ", dubbo version is " + Version.getVersion() + ", this invoker should not be used any longer"); } RpcInvocation invocation = (RpcInvocation) inv; // rpc调用前准备,包括: //1、设置当前当前inovke对象 //2、设置attachment参数,包括客户端通过attachment传递的参数 //3、设置调用方式:同步、异步、回调 //4、如果是异步调用方式,设置自增invocationId //5、获取序列号id prepareInvocation(invocation); // 执行rpc调用并返回异步结果 //1、内部调用了三个具体继承类DubboInvoker、RestInvoker、TripleInvoker中重写的invoke方法,以DubboInvoker为例说明invoke执行过程:org.apache.dubbo.rpc.protocol.dubbo.DubboInvoker#doInvoke //2、从参数中获取要调用的methodName //3、从url中获取path、version、timeout、payload(请求及响应数据包大小限制)、是否需要返回值(isOnlyWay:是否是单向的) //4、获取provider列表,并从列表中获取一个provider,将provider的address设置到serviceContext中 //5、重点:ExchangeClient需要用到类执行请求,会根据<dubbo:protocol name="dubbo" port="20880"/>这个配置查找对应的协议,如果是dubbo协议,则使用DubboProtocol这个类,用于获取referenceClientMap结果,<host:port,Exchanger>对应的Map<String, List<ReferenceCountExchangeClient>。referenceClientMap这map的填充方式参考org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol#getSharedClient这个方法,实际是根据请求的url以及需要的可connectNum数量(可以理解为获取几个provider) //6、如果是单向(不需要返回结果),直接使用currentClient.send方法发送请求 //7、如果是双向的(即有返回结果要求),则根据url获取对应的ExecutorService,在执行CompletableFuture<AppResponse> appResponseFuture = currentClient.request(request, timeout, executor).thenApply(AppResponse.class::cast)代码,即调用带有返回结果的线程。 //8、在返回结果代码AsyncRpcResult result = new AsyncRpcResult(appResponseFuture, inv);result.setExecutor(executor);返回值中带有executor对象,方便在后续waitForResultIfSync方法中结果是否需要等待 AsyncRpcResult asyncResult = doInvokeAndReturn(invocation); // 如果是同步请求,在这里等待同步请求的结果 //1、判断调用方式(同步、异步、回调),如果是同步调用方式,进行后续处理 //2、使用AsyncRpcResult对象获取同步调用的结果,具体方式为通过CompletableFuture<AppResponse>方式判断结果是否返回:org.apache.dubbo.rpc.AsyncRpcResult#get(long, java.util.concurrent.TimeUnit) //3、后续增加了各种exception的抛出:org.apache.dubbo.rpc.protocol.AbstractInvoker#waitForResultIfSync waitForResultIfSync(asyncResult, invocation); return asyncResult; }
dubbo请求参数示例:
dubbo://169.254.183.186:20880/org.apache.dubbo.samples.async.api.AsyncService?application=async-consumer&async=true&background=false&category=providers,configurators,routers&check=false&codec=dubbo&deprecated=false&dubbo=2.0.2&dynamic=true&executor-management-mode=isolation&file-cache=true&generic=false&heartbeat=60000&interface=org.apache.dubbo.samples.async.api.AsyncService&methods=sayHello&pid=28004&prefer.serialization=fastjson2,hessian2&release=3.2.6&service-name-mapping=true&side=consumer&sticky=false&timeout=10000&token=c91b8bfa-981f-460a-82e1-d4ec6ff033e7&unloadClusterRelated=false
收藏文章数量从多到少与“把书读薄”是一个道理