1. 程式人生 > >dubbo原始碼分析24 -- 呼叫核心 Invoke

dubbo原始碼分析24 -- 呼叫核心 Invoke

任何框架或元件,總會有核心領域模型,比如:Spring 的 Bean,Struts 的 Action,Napoli 的 Queue 。對於 Dubbo 來說它的核心就是 Service(服務介面),而 Service 不管是 provider 暴露服務,還是 consumer 引用服務。它都是一個非常重要的概念,我們來看一下 Dubbo 的核心領域模型:

  • Protocol 是服務域,它是 Invoker 暴露和引用的主功能入口,它負責 Invoker 的生命週期管理。
  • Invoker 是實體域,它是 Dubbo 的核心模型,其它模型都向它靠擾,或轉換成它,它代表一個可執行體,可向它發起 invoke 呼叫,它有可能是一個本地的實現,也可能是一個遠端的實現,也可能一個叢集實現。
  • Invocation 是會話域,它持有呼叫過程中的變數,比如方法名,引數等。

1、dubbo 服務暴露

服務提供者暴露一個服務的詳細過程。

dubbo_rpc_export.jpg

上圖是服務提供者暴露服務的主過程:

首先 ServiceConfig 類拿到對外提供服務的實際類 ref(如:HelloWorldImpl),然後通過 ProxyFactory 類的 getInvoker 方法使用 ref 生成一個 AbstractProxyInvoker 例項,到這一步就完成具體服務到 Invoker 的轉化。接下來就是 Invoker 轉換到 Exporter 的過程。

Dubbo 處理服務暴露的關鍵就在 Invoker 轉換到 Exporter 的過程,上圖中的紅色部分。下面我們以 Dubbo 和 RMI 這兩種典型協議的實現來進行說明:

Dubbo 的實現

Dubbo 協議的 Invoker 轉為 Exporter 發生在 DubboProtocol 類的 export 方法,它主要是開啟 socket 偵聽服務,並接收客戶端發來的各種請求,通訊細節由 Dubbo 自己實現。

RMI 的實現

RMI 協議的 Invoker 轉為 Exporter 發生在 RmiProtocol類的 export 方法,它通過 Spring 或 Dubbo 或 JDK 來實現 RMI 服務,通訊細節這一塊由 JDK 底層來實現,這就省了不少工作量。

2、dubbo 服務暴露

服務消費者消費一個服務的詳細過程。

dubbo_rpc_refer.jpg

上圖是服務消費的主過程:

首先 ReferenceConfig 類的 init 方法呼叫 Protocol 的 refer 方法生成 Invoker 例項(如上圖中的紅色部分),這是服務消費的關鍵。接下來把 Invoker 轉換為客戶端需要的介面(如:HelloWorld)。

關於每種協議如 RMI/Dubbo/Web service 等它們在呼叫 refer 方法生成 Invoker 例項的細節和上一章節所描述的類似。

3、滿眼都是 Invoker

由於 Invoker 是 Dubbo 領域模型中非常重要的一個概念,很多設計思路都是向它靠攏。這就使得 Invoker 滲透在整個實現程式碼裡,對於剛開始接觸 Dubbo 的人,確實容易給搞混了。 下面我們用一個精簡的圖來說明最重要的兩種 Invoker:服務提供 Invoker 和服務消費 Invoker:

dubbo_rpc_invoke.jpg

為了更好的解釋上面這張圖,我們結合服務消費和提供者的程式碼示例來進行說明:

服務消費者程式碼:

public class DemoClientAction {

    private DemoService demoService;

    public void setDemoService(DemoService demoService) {
        this.demoService = demoService;
    }

    public void start() {
        String hello = demoService.sayHello("world" + i);
    }
}

上面程式碼中的 DemoService 就是上圖中服務消費端的 proxy,使用者程式碼通過這個 proxy 呼叫其對應的 Invoker,而該 Invoker 實現了真正的遠端服務呼叫。

服務提供者程式碼:

public class DemoServiceImpl implements DemoService {

    public String sayHello(String name) throws RemoteException {
        return "Hello " + name;
    }
}

上面這個類會被封裝成為一個 AbstractProxyInvoker 例項,並新生成一個 Exporter 例項。這樣當網路通訊層收到一個請求後,會找到對應的 Exporter 例項,並呼叫它所對應的 AbstractProxyInvoker 例項,從而真正呼叫了服務提供者的程式碼。Dubbo 裡還有一些其他的 Invoker 類,但上面兩種是最重要的。

參考文章:

相關推薦

dubbo原始碼分析24 -- 呼叫核心 Invoke

任何框架或元件,總會有核心領域模型,比如:Spring 的 Bean,Struts 的 Action,Napoli 的 Queue 。對於 Dubbo 來說它的核心就是 Service(服務介面),而 Service 不管是 provider 暴露服務,還是 consumer

dubbo原始碼分析-服務呼叫流程-筆記

消費端呼叫過程流程圖 消費端的呼叫過程 消費端介面例項: 服務端接收訊息處理過程 NettyHandler. messageReceived 接收訊息的時候,通過NettyHandler.messageReceived作為入口 @Override public vo

Dubbo 原始碼分析 - 服務呼叫過程

注: 本系列文章已捐贈給 Dubbo 社群,你也可以在 Dubbo 官方文件中閱讀本系列文章。 1. 簡介 在前面的文章中,我們分析了 Dubbo SPI、服務匯出與引入、以及叢集容錯方面的程式碼。經過前文的鋪墊,本篇文章我們終於可以分析服務呼叫過程了。Dubbo 服務呼叫過程比較複雜,包含眾多步驟。比如

Dubbo原始碼分析:RPC協議實現-客戶端併發呼叫控制

概述 Dubbo支援在服務或者方法粒度,通過actives引數,控制客戶端對提供者服務的所有方法或者某個方法進行併發訪問控制,即在同一時刻,客戶端只允許active個請求併發呼叫服務的某個方法,超過的請求需要等待,如果在timeout時間內還是無法執行呼叫,則異常退出。 用法

Dubbo原始碼分析:RPC協議實現-RPC過程與核心介面設計

RPC的基本過程 提供者Provider:提供服務的介面定義和介面的具體實現,然後通過URL的方式告訴消費者,某個URL對應某個service實現,一般是將服務的資訊註冊到一個註冊中心,如zookeeper或者Redis等; 消費者Consumer:獲取提供者的介面定義

dubbo原始碼分析-RPC遠端呼叫模組與Remoting通訊模組協作細節

閱讀需要技能: 1.設計模式:理解代理模式。JDK動態代理類的使用。 2.設計模式:理解裝飾模式。 3.Netty網路通訊程式設計,server,handler,channel 4.瞭解Dubbo基本原理,Dubbo模組各層分包關係

dubbo原始碼分析-客戶端DubboInvoker呼叫服務端體會Netty的非阻塞IO使用

本文會介紹Dubbo客戶端DubboInvoker呼叫服務端時候非同步同步呼叫,藉此理解Netty的阻塞非阻塞用法 先來看官網的描述: 上面的描述對應實現在DubboInvoker類。 DubboInvoker doInvoke(fin

RPC框架(八)dubbo原始碼分析--dubbo呼叫過程分析

一、概述 消費端呼叫遠端服務介面時,使用上和呼叫普通的java介面是沒有任何區別,但是服務消費者和提供者是跨JVM和主機的,客戶端如何封裝請求讓服務端理解請求並且解析服務端返回的介面呼叫結果,服務端如何解析客戶端的請求並且向客戶端返回呼叫結果,這些框

Dubbo原始碼分析之四:服務的呼叫

在呼叫服務之前,先得獲得服務的引用。 ReferenceBean 就是服務的引用。它實現了一個FactoryBean介面,在我們需要一個服務時,FactoryBean介面的getObject() 方法會被呼叫。 public Object getObje

Dubbo原始碼分析Dubbo自己實現的IOC

  在建立自適應例項時,都會呼叫ExtensionLoader的injectExtension方法: @SuppressWarnings("unchecked") private T createAdaptiveExtension() { try {

Dubbo 原始碼分析 - 服務匯出全過程解析

1.服務匯出過程 本篇文章,我們來研究一下 Dubbo 匯出服務的過程。Dubbo 服務匯出過程始於 Spring 容器釋出重新整理事件,Dubbo 在接收到事件後,會立即執行服務匯出邏輯。整個邏輯大致可分為三個部分,第一是前置工作,主要用於檢查引數,組裝 URL。第二是匯出服務,包含匯出服務到本地 (JV

Dubbo原始碼分析(六)Dubbo通訊的編碼解碼機制

Dubbo原始碼分析(一)Dubbo的擴充套件點機制 Dubbo原始碼分析(二)Dubbo服務釋出Export Dubbo原始碼分析(三)Dubbo的服務引用Refer Dubbo原始碼分析(四)Dubbo呼叫鏈-消費端(叢集容錯機制) Dubbo原始碼分析(五)Dubbo呼叫鏈-服務端

Dubbo 原始碼分析系列之三 —— 架構原理

1 核心功能 首先要了解Dubbo提供的三大核心功能: Remoting:遠端通訊 提供對多種NIO框架抽象封裝,包括“同步轉非同步”和“請求-響應”模式的資訊交換方式。 Cluster: 服務框架 提供基於介面方法的透明遠端過程呼叫,包括多協議支援,以及

Dubbo 原始碼分析 - 自適應北京PK10原始碼出售拓展原理

1.原理我在上一篇文章北京PK10原始碼出售 QQ2952777280【話仙原始碼論壇】hxforum.com 分析了 Dubbo 的 SPI 機制,Dubbo SPI 是 Dubbo 框架的核心。Dubbo 中的很多拓展都是通過 SPI 機制進行載入的,比如 Protocol、Cluster、LoadBal

Dubbo 原始碼分析 - 服務引用

1. 簡介 在上一篇文章中,我詳細的分析了服務匯出的原理。本篇文章我們趁熱打鐵,繼續分析服務引用的原理。在 Dubbo 中,我們可以通過兩種方式引用遠端服務。第一種是使用服務直聯的方式引用服務,第二種方式是基於註冊中心進行引用。服務直聯的方式僅適合在除錯或測試服務的場景下使用,不適合在線上環境使用。因此,本

Dubbo 原始碼分析 - 叢集容錯之 Router

1. 簡介 上一篇文章分析了叢集容錯的第一部分 – 服務目錄 Directory。服務目錄在重新整理 Invoker 列表的過程中,會通過 Router 進行服務路由。上一篇文章關於服務路由相關邏輯沒有細緻分析,一筆帶過了,本篇文章將對此進行詳細的分析。首先,先來介紹一下服務目錄是什麼。服務路由包含一條路由

24.以太坊原始碼分析(24)core-state原始碼分析

core/state 包主要為以太坊的state trie提供了一層快取層(cache) database主要提供了trie樹的抽象,提供trie樹的快取和合約程式碼長度的快取。 journal主要提供了操作日誌,以及操作回滾的功能。 state_object是acc

Dubbo 原始碼分析 - 叢集容錯之 LoadBalance

1.簡介 LoadBalance 中文意思為負載均衡,它的職責是將網路請求,或者其他形式的負載“均攤”到不同的機器上。避免叢集中部分伺服器壓力過大,而另一些伺服器比較空閒的情況。通過負載均衡,可以讓每臺伺服器獲取到適合自己處理能力的負載。在為高負載的伺服器分流的同時,還可以避免資源浪費,一舉兩得。負載均衡可

技術帖 | dubbo原始碼分析 -- 遠端通訊 netty

dubbo 底層通訊選擇了 netty 這個 nio 框架做為預設的網路通訊框架並且通過自定義協議進行通訊。dubbo 支援以下網路通訊框架: Netty(預設) Mina Grizz ly Netty是什麼? ①本質:由JBOSS提供的一個java開源框架(一個jar包)

dubbo原始碼分析-消費端啟動初始化過程-筆記

消費端的程式碼解析是從下面這段程式碼開始的 <dubbo:reference id="xxxService" interface="xxx.xxx.Service"/> ReferenceBean(afterPropertiesSet) ->getObject() ->ge