Dubbo原始碼 從HelloWorld開始

2021-09-08 13:57:53 字數 3134 閱讀 4620

dubbo,相信做後端的同學應該都用過,或者有所耳聞。沒錯,我就是那個有所耳聞中的一員。

公司在好幾年前實現了一套自己的rpc框架,所以也就沒有機會使用市面上琳琅滿目的rpc框架產品。

之所以想好好看看dubbo,有以下幾個原因

dubbo是alibaba開源的分布式服務框架,它最大的特點是按照分層的方式來架構,使用這種方式可以使各個層之間解耦合(或者最大限度地鬆耦合)。

github:

官網:

中文使用者手冊:

1.沒有dubbo之前,我們是什麼樣的工作方式

dubbo代表的是一類rpc框架,類似的產品還有鼎鼎大名的grpc。

沒有dubbo之前是什麼樣的,可以回想下我們學生時代做的專案。

一台電腦既是伺服器又是客戶端,估計當時也沒有想過我呼叫的這個介面是哪台電腦上,我是不是可以多部署幾台電腦,怎麼樣充分利用這幾台電腦好讓呼叫的效率更高。

因為即使想了,也搞不了,因為沒錢!

即使我們在自己的pc上把專案做好了,需要部署到伺服器上,那麼我們只要記住那台伺服器的ip,使用socket通訊,就很簡單的實現了服務的呼叫和通訊了。

2.dubbo有什麼用

接著學生時代的專案說,那時候我們做個圖書管理系統,學籍管理系統,其訪問量和併發量一般不會太高,準確說,是非常低。

但是如果還是乙個服務端,大量的使用者請求,達到高併發的場景,那麼問題就來了,一台機子顯然承受不住,這時候需要考慮分布式。

dubbo的產生於微服務聯絡緊密,我們一方面想著借助微服務的思想,實現各個服務或者模組之間的解耦。那麼我們另一方面就不能忽視服務之間的通訊,這時候dubbo一類的rpc框架就應運而生。

我們需要考慮擴充套件性,比如為了防止訪問過載,服務所在機器需要進行水平擴充套件,同時也要考慮不斷增加的服務呼叫方。

我們需要考慮負載均衡,怎麼樣才能將服務集群的威力發揮到最大。

我們需要考慮如何自動的註冊服務以及更新服務,如果做好異常情況下,比如註冊中心宕機時,服務方和呼叫方之間的服務呼叫。

如此種種,都是催生dubbo的重要因素。

相應的啟動zk和關閉zk服務的命令分別是zkserver startzkserver stop

匯入dubbo專案並且完成編譯後,可以看到dubbo專案的目錄結構如下

今天要介紹的是dubbo-demo,該子模組包括

dubbo-demo-api

該模組最核心的類就是demoservice介面,該介面只有乙個方法sayhello

package com.alibaba.dubbo.demo;

public inte***ce demoservice

這個介面是聯絡呼叫方和提供方的紐帶。

dubbo-demo-consumer

該模組核心的類為consumer,主要是乙個main函式

public class consumer  catch (throwable throwable) }}

}

其主要功能是載入配置檔案,用於尋找服務提供方所在的位置,拿到demoservice介面的實現類demoserviceimpl,並呼叫其方法實現sayhello

dubbo-demo-provider

該模組包含了demoservice的實現類demoserviceimpl,同時包含乙個服務啟動類provider

public class provider 

}

啟動註冊中心因為呼叫方和服務提供方需要靠註冊中心來聯絡,提供方將自己的服務登記到註冊中心,呼叫方需要拉取可用的服務提供方的位置資訊,比較常見的關係描述如下圖所示

呼叫關係說明

鑑於dubbo原始碼中,配置檔案中的預設配置是multicast,但是我在執行的時候總是出現can't assign address的情況,所以改用zookeeper。

相應修改如下,在dubbo-demo-provider專案中,將dubbo-demo-provider.xml修改為

<?xml version="1.0" encoding="utf-8"?>

將dubbo-demo-consumer專案中的dubbo-demo-consumer.xml修改為

<?xml version="1.0" encoding="utf-8"?>

同時在命令列輸入zkserver start啟動zk

分別啟動proiver和consumer

執行provider類,將自己的服務介面對外開放

執行consumer類,尋找服務提供方,並呼叫其介面實現

至此,對於dubbo有了乙個初步的認識並通過dubbo-demo專案了解dubbo的運作模式。

網上找了乙份pdf版的原始碼閱讀心得,如果有需要,下方留下你的郵箱

dubbo原始碼 dubbo之Listener

1.exporterlistener spi public inte ce exporterlistener 使用者可以繼承該方法重寫需要的方法 public abstract class exporterlisteneradapter implements exporterlistener pub...

Dubbo原始碼分析

dubbo原始碼分析 其實已經有很多比較好的原始碼分析部落格,結合部落格和開發經驗再去分析原始碼,就能對dubbo的實現有個整體全面的理解,也能深入去深究其中的具體實現細節。dubbo裡主要用到的spi service provider inte ce netty nio 同步非阻塞多路復用框架,d...

dubbo原始碼解析(dubbo容器部分)

dubbo 解析 dubbo中也有內建的容器介面就是類 com.alibaba.dubbo.container.container 如下所示 spi spring public inte ce container 也同樣是 spi擴充套件點。而且介面非常的簡單,乾淨,在 dubbo 框架中一共出現了...