俯瞰Dubbo全局,閱讀源碼前必須掌握這些!!

2021-01-15 51CTO

作者個人研發的在高並發場景下,提供的簡單、穩定、可擴展的延遲消息隊列框架,具有精準的定時任務和延遲隊列處理功能。自開源半年多以來,已成功為十幾家中小型企業提供了精準定時調度方案,經受住了生產環境的考驗。為使更多童鞋受益,現給出開源框架地址:

https://github.com/sunshinelyz/mykit-delay

既然是要寫深度解析Dubbo源碼的系列專題,我們首先要做的就是搭建一套Dubbo的源碼環境,正所謂「工欲善其事,必先利其器」。但是,為了更好的理解Dubbo,我將本文重點分成三個部分:Dubbo中的核心角色、搭建Dubbo源碼環境、Dubbo核心模塊說明、運行Dubbo的示例程序 四個部分。說幹就幹,上重點。

註:本系列專題,我是基於Dubbo 2.7.8版本進行源碼分析的。

Dubbo中的核心角色

為了更好的說明Dubbo中的核心角色,這裡,我就直接引用一張Dubbo的依賴關係圖。

註:圖片來自Dubbo官網。

從Dubbo的依賴關係圖中,我們可以看出,Dubbo主要由四部分構成:Registry、Provider、Consumer和Monitor 。接下來,我們就分別對這四部分進行簡單的介紹。

Registry,註冊中心。在Dubbo中,註冊中心負責服務的註冊與發現,主要就是針對服務地址的註冊與查找。值得一提的是,在Dubbo中,Provider和Consumer只有在服務啟動的時候與註冊中心進行交互。之後,註冊中心通過長連接的形式來感知Provider的存在,如果Provider宕機或不可用,註冊中心就會立即推送相關的事件來告知Consumer。 Provider,服務的提供者。Provider在啟動的時候,會向註冊中心註冊自己的相關服務,主要是通過將自身的服務地址和相關的配置信息封裝成URL添加到Zookeeper等服務中。 Consumer,服務的消費者。Consumer在啟動的時候,會向註冊中心訂閱其關注的服務。主要是向Zookeeper等服務中獲取Provider註冊的URL,並且在Zookeeper等服務中添加相應的監聽器。獲取到Provider註冊的URL之後,Consumer就會通過負載均衡算法從獲取的多個Provider中選擇一個,並與其建立連接,發起RPC調用。如果Zookeeper等服務中註冊的Provider發生了變更,Consumer就會通過在註冊中心中添加的監聽器來獲取最新的Provider信息。而且Consumer會緩存Provider的信息,如果Consumer與Provider一旦建立起連接,即使註冊中心宕機或不可用,也不會影響Consumer和Provider之間的交互。 Monitor:監控中心。主要用來統計Dubbo服務的調用次數和調用的時間。在Dubbo的核心架構中,監控中心不是必需的,監控中心宕機或不可用不會影響Dubbo的整體服務。 好了,對於Dubbo的核心角色我們就介紹到這兒,更多的信息,小夥伴們可以參見Dubbo的官方文檔。

搭建Dubbo源碼環境

我們可以使用如下命令將github的源碼下載的本地。

git clone https://github.com/apache/dubbo.git 

接下來,將Dubbo的源碼切換到2.7.8

git checkout -b dubbo-2.7.8 dubbo-2.7.8 

使用Maven進行編譯

mvn clean install -Dmaven.test.skip=true  

轉換成IDEA項目,這裡我使用的是IDEA分析Dubbo源碼。

mvn idea:idea 

接下來,我們就可以將Dubbo源碼導入到IDEA了。

說了這麼多,其中還有一種方式就是通過瀏覽器直接下載Dubbo 2.7.8的源碼到本地。

在瀏覽器中打開連結:https://github.com/apache/dubbo/releases/tag/dubbo-2.7.8 下載Dubbo源碼。

這裡下載zip壓縮包和tar.gz壓縮包均可,下載到本地後解壓,將其導入到IDEA中即可。

導入完成後,我們看到的項目結構如下所示。

接下來,我們就對Dubbo源碼中的核心模塊進行簡單的介紹。

Dubbo核心模塊說明

dubbo-common模塊

Dubbo的公共模塊,提供了Dubbo SPI的實現、時間輪的實現、動態編譯等通用的功能。

dubbo-remoting模塊

Dubbo的遠程通信模塊,其中,dubbo-remoting-api是對整個模塊的核心抽象,其他子模塊基於其他開源框架對dubbo-remoting-api進行實現。

dubbo-rpc模塊

Dubbo的RPC模塊,依賴dubbo-remoting模塊。其中,dubbo-remoting-api是整個dubbo-rpc模塊的核心抽象,其他模塊是對dubbo-remoting-api的實現。

dubbo-registry模塊

Dubbo中與註冊中心交互的模塊。其中dubbo-registry-api是整個dubbo-registry的核心抽象,其他模塊是對dubbo-registry-api的具體實現。

dubbo-config模塊

Dubbo中解析對外暴露的配置的模塊。其中,dubbo-config-api 子模塊負責處理以API 方式使用Dubbo時的相關配置,dubbo-config-spring 子模塊負責處理與 Spring 集成使用時的相關配置方式。

dubbo-metadata模塊

Dubbo中的元數據模塊。其中,dubbo-metadata-api是對整個dubbo-metadata的抽象,其他模塊是對dubbo-metadata-api的實現。

dubbo-configcenter模塊

Dubbo的配置中心模塊,其中,提供了多種服務發現的方式並接入了多種服務發現組件。

dubbo-monitor模塊

Dubbo 的監控模塊,主要用於統計服務調用次數、調用時間以及實現調用鏈跟蹤的服務。

dubbo-cluster模塊

Dubbo的集群管理模塊,主要提供負載均衡、容錯、路由等功能。

運行Dubbo示例程序

在Dubbo源碼中,有一個示例程序模塊dubbo-demo,在運行dubbo-demo模塊中的示例前,我們先在本地啟動一個Zookeeper作為註冊中心。

註:小夥伴們可以自行到Apache官網下載Zookeeper。

Dubbo示例程序結構

Dubbo提供的示例程序的總體結構如下所示。

我們來看看dubbo-demo下有哪些模塊。

dubbo-demo-interface:Dubbo示例定義的業務接口。 dubbo-demo-xml:提供了基於Spring XML的使用示例。 dubbo-demo-annotation:提供了基於Spring註解方式的使用示例。 dubbo-demo-api:提供了以API方式使用Dubbo的示例。

其中,dubbo-demo-xml、dubbo-demo-annotation和dubbo-demo-api模塊都是依賴dubbo-demo-interface模塊的。

接下來,我們就對dubbo-demo-interface模塊和dubbo-demo-annotation模塊的核心代碼進行簡單的介紹,並運行相關的示例程序。小夥伴們可自行分析和運行dubbo-demo-xml和dubbo-demo-api中的示例程序並運行相關的代碼。

(1)dubbo-demo-interface:定義了業務接口。

其中,DemoService接口的核心代碼如下所示。

package org.apache.dubbo.demo; import java.util.concurrent.CompletableFuture; public interface DemoService {     //同步調用     String sayHello(String name);     //異步調用     default CompletableFuture<String> sayHelloAsync(String name) {         return CompletableFuture.completedFuture(sayHello(name));     } } 

(2)dubbo-demo-annotation:提供了基於Spring註解的示例程序。

Provider代碼

我們先來看dubbo-demo-annotation-provider模塊,也就是服務的提供者。其DemoServiceImpl的代碼如下所示。

@DubboService public class DemoServiceImpl implements DemoService {     private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class);      @Override     public String sayHello(String name) {         logger.info("Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());         return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress();     }      @Override     public CompletableFuture<String> sayHelloAsync(String name) {         return null;     } } 

Application類的代碼如下所示。

public class Application {     public static void main(String[] args) throws Exception {         AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ProviderConfiguration.class);         context.start();         System.in.read();     }      @Configuration     @EnableDubbo(scanBasePackages = "org.apache.dubbo.demo.provider")     @PropertySource("classpath:/spring/dubbo-provider.properties")     static class ProviderConfiguration {         @Bean         public RegistryConfig registryConfig() {             RegistryConfig registryConfig = new RegistryConfig();             registryConfig.setAddress("zookeeper://127.0.0.1:2181");             return registryConfig;         }     } } 

Consumer代碼

接下來,我們來看看dubbo-demo-annotation-consumer模塊的代碼,也就是服務消費者的示例代碼。其中,DemoServiceComponent類的代碼如下所示。

@Component("demoServiceComponent") public class DemoServiceComponent implements DemoService {     @DubboReference     private DemoService demoService;      @Override     public String sayHello(String name) {         return demoService.sayHello(name);     }     @Override     public CompletableFuture<String> sayHelloAsync(String name) {         return null;     } } 

Application類的代碼如下所示。

public class Application {     public static void main(String[] args) {         AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConsumerConfiguration.class);         context.start();         DemoService service = context.getBean("demoServiceComponent", DemoServiceComponent.class);         String hello = service.sayHello("world");         System.out.println("result :" + hello);     }      @Configuration     @EnableDubbo(scanBasePackages = "org.apache.dubbo.demo.consumer.comp")     @PropertySource("classpath:/spring/dubbo-consumer.properties")     @ComponentScan(value = {"org.apache.dubbo.demo.consumer.comp"})     static class ConsumerConfiguration {      } } 

運行Dubbo示例程序

我們先在本地啟動Zookeeper,然後分別運行dubbo-demo-annotation-provider模塊的Application類和dubbo-demo-annotation-consumer模塊的Application類。

此時在IDEA的控制臺會輸出如下信息。

result :Hello world, response from provider: 192.168.0.5:20880 

Dubbo總結

到這裡,我們介紹了Dubbo中的核心角色,如何搭建Dubbo源碼環境,對Dubbo源碼中的核心模塊進行了簡單的說明,並簡單的分析了Dubbo的示例程序並運行了示例程序。其中,在介紹和運行示例程序時,我們重點介紹了dubbo-demo-annotation示例模塊,小夥伴們可自行分析和運行其他示例模塊。在後續的文章中分析源碼時,我們也主要是通過debug Dubbo的示例程序的方式進行。

本文轉載自微信公眾號「冰河技術」,可以通過以下二維碼關注。轉載本文請聯繫冰河技術公眾號。

【編輯推薦】

【責任編輯:

武曉燕

TEL:(010)68476606】

點讚 0

相關焦點

  • 史上最全 40 道 Dubbo 面試題及答案,看完碾壓面試官
    我曾經面試就遇到過面試官讓你寫這些配置,我也是蒙逼。。 dubbo 通過 telnet 命令來進行服務治理,具體使用看這篇文章《dubbo服務調試管理實用命令》。 telnet localhost 8090 26、Dubbo支持服務降級嗎?
  • Dubbo-go v1.5.1 發布,Apache Dubbo 的 Go 實現
    開發團隊在 dubbo-samples 中給出了 事務測試用例 。4.1.2 靜態規則打標可以在 server 配置文件的 tag 欄位裡設置services: "UserProvider": registry: "hangzhouzk" protocol : "dubbo" interface : "com.ikurento.user.UserProvider"
  • 團隊成員梁飛專訪:阿里巴巴分布式服務框架Dubbo
    等等……在遇到這些問題時,都可以用Dubbo來解決。可參見:http://code.alibabatech.com/wiki/display/dubbo/User+Guide#UserGuide-GettingStartedDubbo的設計思路是什麼?
  • 想研究無人機智能集群編隊,這些核心技術必須掌握
    分布式探測無人機集群具有分散度高,局部感知能力強而全局感知能力弱的特點。但是如果能把集群中的每一個終端的探測信息匯總融合,可以實現全局信息的高效獲取。想要對無人機集群方面有深度研究還要掌握以下關鍵技術才行呢!
  • React源碼之組件的實現與首次渲染
    源碼中的兩種數據結構 貫穿源碼,常見的兩種數據結構,有助於快速閱讀源碼。 ReactElement ] }, }; } } ReactDOM.render( { type: App, props: {}, }, document.getElementById("root") ); ReactDOM.render 先來看下 ReactDOM.render 源碼的執行過程
  • 萬眾期待:Hinton團隊開源CapsNet源碼
    【導讀】前幾天,Hinton團隊的膠囊網絡論文第一作者Sara Sabour將其源碼在GitHub上開源,其實,該論文「Dynamic Routing Between Capsules」早在去年10月份就已經發表,直到今日,其官方實現終於開源。此前,Hinton一再強調,當前的反向傳播和CNN網絡存在很大的局限性,表明AI的下一代研究方向是「無監督學習」。
  • 高中英語閱讀有門道,新東方在線建議掌握這些方法提升閱讀能力
    要想提升閱讀速度,同學們首先要規避一些不良的閱讀習慣,比如:指讀、唇讀、出聲閱讀、心譯等等。這些閱讀習慣,不僅影響閱讀速度,打斷閱讀思維的連貫性,還會破壞對文本的整體理解,難以快速捕獲文章核心意思。  提升閱讀能力:掌握兩種科學猜詞法  要想攻克閱讀理解,詞彙是永遠繞不開的坎,而且英語本身就是片詞海,背誦再多的單詞,也難免會在文章中遇見生僻詞,因此學會猜詞就顯得尤為重要。這裡新東方在線老師分享給同學們兩種較為常見的猜詞法:一是定義猜詞法。
  • 考研英語閱讀拿高分,必須掌握細節題
    根據對多年考研英語真題的統計,在20道閱讀題目中,細節題的比例約佔到60%,是閱讀五大題型中考查最多的,因此要想閱讀拿高分,掌握細節題的做題方法尤其重要。  所有的閱讀都分為三個部分:原文、題幹和選項。原文是解題的依據,題幹是解題的方向,選項是解題的關鍵。我們要知道題幹在很多時候卻是我們定位和篩選正確答案的殺手鐧,尤其在應對細節題時,切記:點對點對應。
  • 2019考研英語閱讀拿高分,必須掌握細節題
    根據對多年考研英語真題的統計,在20道閱讀題目中,細節題的比例約佔到60%,是閱讀五大題型中考查最多的,因此要想閱讀拿高分,掌握細節題的做題方法尤其重要。   所有的閱讀都分為三個部分:原文、題幹和選項。原文是解題的依據,題幹是解題的方向,選項是解題的關鍵。
  • 入門NLP 項目前,你必須掌握哪些理論知識?
    我知道有已經有很多很棒的文章也討論過相同的問題(比如 Sarkar 撰寫的一系列文章:https://towardsdatascience.com/a-practitioners-guide-to-natural-language-processing-part-i-processing-understanding-text-9f4abfd13e72),但對於筆者來說,將這些問題寫下來對於自己梳理自己所掌握的知識很有幫助
  • Spring Boot自動裝配原理源碼分析
    011.環境準備使用IDEA Spring Initializr快速創建一個Spring Boot項目添加一個Controller類主配置類如下022.註解分析Spring Boot規定,項目的主配置類必須放在最外層包
  • java任務調度之Timer定時器(案例和源碼分析)
    對此就有必要深入其源碼看看了。二、Timer源碼分析對於一個類的源碼分析,我一貫的思路就是先從參數開始,然後構造方法,最後就是常用方法。下面我們就按照這個思路開始今天的源碼分析,在這裡基於jdk1.8。
  • 直播系統源碼開發:關於安卓開發工具和obs直播推流
    隨著移動網際網路技術的不算發展,直播系統源碼不再局限於娛樂直播的範疇尤其對於今年來說,購物直播行業的迅速發展,對直播系統源碼開發的需求進一步擴大,同時對直播源碼開發技術也有了新的要求。
  • 如何閱讀文獻、整理文獻綜述?通讀文章前你需要準備這些
    這些期刊能夠幫助我們了解這個領域的最新動態,掌握最新研究方向。圍繞自己的研究方向閱讀。根據自己的研究方向和研究內容大量閱讀有關文獻,這樣可以幫助我們對自己的研究領域有深入細緻的了解。二、帶著問題讀文獻選擇好文獻,第二步就是閱讀文獻。閱讀文獻最常見的問題就是逐字逐句去閱讀。讀文獻的時候一定要帶著問題去閱讀,在這裡給大家介紹一些萬能問題:1.
  • 用深度閱讀認知世界
    這種閱讀是在短時間內通過目錄、標題等關鍵信息以及重點段落掌握主要內容,可以快速地、系統化地了解書籍的骨架和核心意思,不至於 「只見樹木而不見森林」,避免因抓不到頭緒而帶來的閱讀疲勞。第三層閱讀——分析閱讀或解剖式閱讀。這種閱讀沒有時間限制,只為仔細地咀嚼與消化一本書,最終將書中的內容變成自己知識體系的一部分。
  • SpringSecurity 默認表單登錄頁展示流程源碼
    :f520875f-ea2b-4b5d-9b0c-f30c0c17b90b登錄成功並且瀏覽器又會重定向到剛剛訪問的接口2.springSecurityFilterchain 過濾器鏈如果你看過我另一篇關於SpringSecurity初始化源碼的博客
  • SLAM軌跡全局誤差計算
    SLAM軌跡全局誤差計算一、umeyama算法 SLAM結果輸出之後,我們需要對其進行測量,判斷定位的精確度如何
  • 領悟不同閱讀目標內涵,讀那些必須要讀的東西,成為優秀閱讀者
    這些書籍通常都是各自領域中的經典著作,並且都是閱讀難度較高的作品。當然除了上述這些因素之外,對於主動閱讀而言最重要因素就是「讀者」自身。主動閱讀的書籍是各自領域經典書籍讀者不但要具備閱讀這些經典著作的相應水準,同時還要有明確的閱讀目的。我們將閱讀目的分為兩種:第一種為了獲得資訊而閱讀;第二種為了增進理解力而閱讀。
  • 合格刺客必修課 掌握全局命運的主宰者
    把握時機後手切入 看誰先忍不住 說的這一點其實很複雜,什麼才是時機誰也說不清楚,好機會很有很多,比如說對方adc沒有人保護、對方法師沒藍、對方刺客英雄做先手、我方控制需要配合;這些都是很好的機會,在這個時候切入進去成功收割的機率非常大。