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
 
 
posted @ 2024-06-27 15:14  使用D  阅读(6)  评论(0编辑  收藏  举报