Dubbo的RPC呼叫過程

2021-08-06 08:32:53 字數 2689 閱讀 3320

dubbo的rpc呼叫在客戶端觸發,配置檔案中定義:

id="***service" inte***ce="***.***.service"/>

這一行定義會為***.***.service在本地生成乙個遠端**。在dubbo中這個**用com.alibaba.dubbo.common.bytecode.proxy0的例項表示。這個**存在於本地可以像本地bean一樣呼叫該服務,具體通訊過程由**負責。

**例項僅僅包含乙個handler物件(實現invokerinvocationhandler介面),handler中包含rpc呼叫核心介面invoker < t >的實現。

public

inte***ce

invoker

extends

node

其中核心方法invoker(invocation invocation)引數invocation是乙個呼叫過程的抽象,也是dubbo框架的核心介面。

public inte***ce invocation
invocation和invoker相互依存,如果是rpc呼叫,invocation的具體實現就是rpcinvocation,該方法異常時丟擲rpcexception。

**的handler例項中實現invoker< t >的介面的是mockclusterinvoker,它僅僅是乙個invoker的包裝,只是用於dubbo框架的mock功能,它的invoke方法實現:

public result invoke(invocation invocation) throws rpcexception  else

if (value.startswith("force")) else catch (rpcexception e) else

}}return result; }

mockclusterinvoker實現來invoker< t >介面但是沒有實現invoke的邏輯,只是包裝了乙個invoker的真實實現。如下:

public

class

mockclusterinvoker

implements

invoker

}

其中真實的invoker實現包含了集群容錯的功能,可知dubbo的集群容錯是在invoker中實現的。

dubbo預設的容錯實現failoverclusterinvoker即失敗重試。在failoverclusterinvoker的實現中核心方法invoke(invocation invocation)繼承自abstractclusterinvoker< t > 抽象類。abstractclusterinvoker< t >中的invoke(invocation invocation)方法的實現如下:

public result invoke(final invocation invocation) throws rpcexception  else 

rpcutils.attachinvocationidifasync(geturl(), invocation);

return doinvoke(invocation, invokers, loadbalance);

}

list(invocation) 獲取 invoker 的列表list< invoker< t > >,這個列表可以對應到服務 供者的列表。其中,list(invocation)方法的實現**如下:

protected

list

> list(invocation invocation) throws rpcexception

list(invocation)方法中用到關鍵的介面 directory,它是 dubbo 框架中用於封裝服務供者列表的乙個資料結構。

directory 的定義**如下:

public

inte***ce

directory

extends

node

list(invocation invocation)的引數是乙個invocation 物件表示的是一次(遠端)呼叫過程,list 方法返回乙個呼叫者的列表 list< invoker< t > >,directory 介面的例項例項是 registrydirectory類的物件 ,registrydirectory的list(invocation)方法繼承自 abstractdirectory,具體實現如下:

public list> list(invocation invocation) throws rpcexception 

} catch (throwable t) }}

return invokers;

}

每個 consumer 會在本地快取(或者從註冊中心獲取)路由集合 list< router > localrouters,然後判斷集合中的每乙個路由規則是否可以對當前調 用進行過濾,如果路由規則符合當前呼叫,就對呼叫列表 list< invoker< t > >進行 篩選,去除不符合的呼叫者。

router 介面的定義**如下:

public

inte***ce

router

extends

comparable

Dubbo服務呼叫過程

生產者,服務提供者 提供端 消費者,服務呼叫者 呼叫端 provider,服務提供者 container,容器 spring容器,用來初始化服務 服務發布,需要spring容器配合 服務註冊 registry,註冊中心 生產者,暴露服務 註冊到註冊中心 查詢服務 消費者,訪問註冊中心 返回訊息 註冊...

Dubbo呼叫過程監控

monitorfilter 主要對呼叫過程進行監控,public result invoke invoker invoker,invocation invocation throws rpcexception catch rpcexception e finally else 其核心 是 colle...

dubbo原始碼之服務呼叫過程

前面有介紹服務暴露和服務引入兩個流程,而這兩個流程就是為了服務的呼叫。由前面兩篇可以知道我們具體呼叫資訊已經被封裝到invoker 裡面。今天主要是介紹dubbo在呼叫服務的時候,如何獲取到封裝好invoker,對服務進行呼叫。這篇文章和前面三篇一樣,基於dubbo 2.7.1 zookeeper為...