spring Boot環境下dubbo+zookeeper的一個基礎講解與示例

来源:https://www.cnblogs.com/thelovelybugfly/archive/2019/03/04/9593411.html
-Advertisement-
Play Games

一,學習背景 1. 前言 對於我們不管工作還是生活中,需要或者想去學習一些東西的時候,大致都考慮幾點: a) 我們為什麼需要學習這個東西? b) 這個東西是什麼? c) 這個東西能為我們做什麼? d) 如何去學? 結合以上幾點,我們一起學習下Dubbo這個框架! 2. 學習背景 互聯網的發展,網站應 ...


一,學習背景

1.   前言

對於我們不管工作還是生活中,需要或者想去學習一些東西的時候,大致都考慮幾點:

a)      我們為什麼需要學習這個東西?

b)     這個東西是什麼?

c)      這個東西能為我們做什麼?

d)     如何去學?

結合以上幾點,我們一起學習下Dubbo這個框架!

2.   學習背景

互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分散式服務架構以及流動計算架構勢在必行,Dubbo是一個分散式服務框架,在這種情況下誕生的。現在核心業務抽取出來,作為獨立的服務,使前端應用能更快速和穩定的響應。

3.   Dubbo是什麼

Dubbo是Alibaba開源的分散式服務框架,它最大的特點是按照分層的方式來架構,使用這種方式可以使各個層之間解耦合(或者最大限度地松耦合)。從服務模型的角度來看,Dubbo採用的是一種非常簡單的模型,要麼是提供方提供服務,要麼是消費方消費服務,所以基於這一點可以抽象出服務提供方(Provider)和服務消費方(Consumer)兩個角色。關於註冊中心、協議支持、服務監控等內容

4.   Dubbo能做什麼

當網站變大後,不可避免的需要拆分應用進行服務化(微服務),以提高開發效率,調優性能,節省關鍵競爭資源等。 
當服務越來越多時,服務的URL地址信息就會爆炸式增長,配置管理變得非常困難,F5硬體負載均衡器的單點壓力也越來越大。 
當進一步發展,服務間依賴關係變得錯蹤複雜,甚至分不清哪個應用要在哪個應用之前啟動,架構師都不能完整的描述應用的架構關係。 
接著,服務的調用量越來越大,服務的容量問題就暴露出來,這個服務需要多少機器支撐?什麼時候該加機器?等等…… 
在遇到這些問題時,都可以用Dubbo來解決。

5.   如何去學習Dubbo

百度搜索Dubbo

a)        官網:http://dubbo.io/ 去查看關於dubbo的官方定義,瞭解這是個什麼東西。

b)       Dubbo框架設計者的專訪:http://www.iteye.com/magazines/103看一下阿裡巴巴人士如何評價dubbo的。

c)        Dubbo的入門使用:http://blog.csdn.net/congcong68/article/details/41113239

d)       Dubbo框架的詳解與原理:http://shiyanjun.cn/archives/325.html看不懂就先會用。

二,開啟學習之路

1.   Dubbo架構圖

總體設計架構:

 

基礎架構:

 

上圖中,藍色的表示與業務有交互,綠色的表示只對Dubbo內部交互。上述圖所描述的調用流程關係如下:

0. 服務容器負責啟動,載入,運行服務提供者,這個圖上沒標識出來,服務端啟動就是0.

1. 服務提供者在啟動時,向註冊中心註冊自己提供的服務。

2. 服務消費者在啟動時,向註冊中心訂閱自己所需的服務。

3. 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據給消費者。

4. 服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。

5. 服務消費者和提供者,在記憶體中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。

2.   Dubbo與zookeeper

Dubbo為什麼要與zookeeper/Consule一起使用?

dubbo主要是一個分散式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。簡單的說,dubbo就是個服務框架,如果沒有分散式的需求,其實是不需要用的.告別Web Service模式中的WSdl,以服務者與消費者的方式在dubbo上註冊.

zookeeper用來註冊服務和進行負載均衡,哪一個服務由哪一個機器來提供必需讓調用者知道,簡單來說就是ip地址和服務名稱的對應關係。zookeeper通過心跳機制可以檢測掛掉的機器並將掛掉機器的ip和服務對應關係從列表中刪除。

看圖識物:

 

上圖所示,假如我有四台伺服器,每台伺服器都提供相同的服務,如果我消費者去掉用的時候,肯定要在四個當中選擇某一個去調用,可是選擇哪一個就是一個難題,當然這就涉及到負載均衡問題了,或者我們在消費者這邊加代碼邏輯判斷達到負載均衡的效果。還有每次調用的時候都不知道要去掉哪個服務,都要查詢當前有哪些服務提供者,這是很耗開銷的,當服務提供越來越多的時候,越來越亂。

最終方案:

 

利用zookeeper生成的節點樹,伺服器提供者在啟動的時候,將提供的服務名稱和地址以節點的方式註冊都伺服器zookeeper伺服器配置中心,消費者通過伺服器配置中心獲取需要的服務名稱節點下的服務地址。因為znode有非持久節點的特性,伺服器可以動態的從服務配置中心一處,並且觸發消費者的watcher方法!!!

消費者只有在第一次調用的時候直接本地緩存伺服器列表信息,而不需要重新發起請求到伺服器配置中心區獲取相應 的伺服器列表,直到伺服器地址列表有變化(機器下線或者上線),變更之後消費者watcher進行服務地址的重新查詢。正是因為這種無中心化的結構,使得服務消費者在服務信息沒變更時候,幾乎不依賴配置中心,解決了負載均衡設備導致的單點故障的問題,大大減少了服務配置中心的壓力 

3.    Zookeeper的安裝

此處以windows環境下為例

註:linux安裝參考http://blog.csdn.net/lk10207160511/article/details/50526404

在apache的官方網站提供了好多鏡像下載地址,然後找到對應的版本,目前最新的是3.3.6

下載地址:

http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.3.6/zookeeper-3.3.6.tar.gz

把下載的zookeeper的文件解壓到指定目錄

 

修改conf下增加一個zoo.cfg

內容如下:

# The number of milliseconds of eachtick  心跳間隔毫秒每次

tickTime=2000

# The number of ticks that the initial

# synchronization phase can take

initLimit=10

# The number of ticks that can pass between

# sending a request and gettinganacknowledgement

syncLimit=5

# the directory where the snapshotisstored.  //鏡像數據位置

dataDir=D:\\data\\zookeeper

#日誌位置

dataLogDir=D:\\logs\\zookeeper

# the port at which the clientswillconnect  客戶端連接的埠

clientPort=2181

註:如果啟動有報錯提示cfg文件有錯誤,可以用zoo_sample.cfg內內容替代也是可以的

進入到bin目錄,並且啟動zkServer.cmd,這個腳本中會啟動一個Java進程

這個時候zookeeper已經安裝成功了.

4.  配置dubbo-admin的管理頁面

下載dubbo-admin-2.4.1.war包,解壓到tomcat中。

如圖所示:

 

修改dubbo.properties文件,裡面指向Zookeeper ,使用的是Zookeeper 的註冊中心。

然後啟動tomcat服務,用戶名和密碼:root,並訪問服務,顯示登陸頁面,說明dubbo-admin部署成功,如圖所示:

目前我們還沒有註冊服務,所以內容都是空的。

5.   程式演示

現在我們來看個簡單的dubbo-demo項目,此項目只分解了兩個工程,一個服務提供者,一個消費者。此項目只適用於演示使用。因為,你在非分散式的項目上使用dubbo,多此一舉。

如圖:

 

6.   服務提供者

演示工程結構如下:

 

首先看下咱們的pom文件,引入Dubbo和Zookeeper的jar包.沒啥好說的。

 

然後我們寫自己的介面與實現,通常分散式設計下介面應該與實現分開,讓介面與bean單獨起工程模塊,以便服務提供者與消費者都可以調用。如果服務端有自己不暴漏的方法,可單寫介面類,也可中間加層,看業務而定。

 

重點看下我們dobbo配置

 

屬性說明:

   dubbo:registry 標簽一些屬性的說明:

a)        register是否向此註冊中心註冊服務,如果設為false,將只訂閱,不註冊。

b)        check註冊中心不存在時,是否報錯。

c)        subscribe是否向此註冊中心訂閱服務,如果設為false,將只註冊,不訂閱。

d)        timeout註冊中心請求超時時間(毫秒)。

e)        address可以Zookeeper集群配置,地址可以多個以逗號隔開等。

  dubbo:service標簽的一些屬性說明:

a)        interface服務介面的路徑

b)        ref引用對應的實現類的Bean的ID

c)        registry向指定註冊中心註冊,在多個註冊中心時使用,值為<dubbo:registry>的id屬性,多個註冊中心ID用逗號分隔,如果不想將該服務註冊到任何registry,可將值設為N/A

d)        register 預設true ,該協議的服務是否註冊到註冊中心。

接下來我們啟動服務提供者服務,這裡我們常用的應該是啟動一個java程式,因為我們的工程中並沒有涉及web方面的業務,儘量不適用tomcat 啟動Web容器。

 

此時我們看下dubbo控制台,我們的服務已經註冊進zookeeper中,服務完成。

 

7.   服務消費者

我們寫一個消費者工程項目,結構如下:

 

Pom文件與服務者要引用的基本一樣,都是dubbo與zookeeper。

我們同樣寫一個介面類,與服務端的介面一致,此處如果服務端的介面分層出來,我們可以直接引用的,則不用寫此步了。

 

我們寫一個控制器代碼,調取介面。

 

配置我們dubbo配置文件,讓zookeeper給我們訂閱需要的服務,此處配置介面的訂閱也可使用註解形式,但對此,如果初期我們的項目用戶量不是特別大,我們不想使用分散式的時候,就不好拆除dubbo了。

 

配置說明:

   dubbo:reference 的一些屬性的說明:

a)        interface調用的服務介面

b)        check 啟動時檢查提供者是否存在,true報錯,false忽略

c)        registry 從指定註冊中心註冊獲取服務列表,在多個註冊中心時使用,值為<dubbo:registry>的id屬性,多個註冊中心ID用逗號分隔

d)        loadbalance 負載均衡策略,可選值:random,roundrobin,leastactive,分別表示:隨機,輪循,最少活躍調用。此處可在zookeeper單獨配置,如下:

 

再次查看我們的dubbo控制台,發現消費者已經被註冊到zookeeper中。

 

消費者服務完成,我們來寫個測試。

 

8.   Dubbo泛化調用(擴展篇)

Q:一個PHP工程師想調用某個Java介面,他並不能按照你約定,去寫一個個的介面,此時該怎麼辦?

A:Dubbo並不是跨語言的RPC框架,但並不是不能解決這個問題,使用dubbo的泛化調用,然後利用web返回json,這樣完成跨語言的調用。

總結:泛化調用,最最直接的表現就是服務消費者不需要有任何介面的實現,就能完成服務的調用。

泛化的使用比較簡單,服務提供者咱們還用上面工程,不需改變。泛化調用,肯定是調用方

去實現泛化。

看下我們的配置文件,如下:

 

有兩個地方需要註意一下,第一個是interface,其實該介面在消費者端並不存在,這是與往常寫的不一樣的地方,第二個地方需要註意的地方就是generic=”true”這樣的標簽,表示該介面支持泛型調用.

來看下我們怎麼用程式調用,如下一個測試:

 

從spring的上下文中讀到引用的介面bean,之後卻把它強轉為GenericService類,通用寫法。然後調用GenericService的$invoke的方法。

該方法有三個參數,第一個參數是你調用遠程介面的具體方法名,第二個參數是這個方法的入參的類型,最後一個參數是值。如下:

 

 

一個PHP程式員想要搭建一個簡單的web項目,可是你卻叫他依賴於spring的配置文件,他肯定不樂意,dubbo也幫你想到了,泛型調用,服務消費端可以不依賴spring的配置文件。如下:

 

小結:泛化調用可以方便用戶對dubbo服務消費者端的擴展,可以方便,豐富了服務消費者的調用方式,甚至可以做變相的Rest調用,這些都是可以的,不過,它的缺點也是很明顯的,參數傳遞複雜,不方便使用。但是這種方式是不能缺失的。

本文轉自


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前幾天刷朋友圈的時候,看到一段話: 如果現在我是傻逼,那麼我現在不管怎麼努力,也還是傻逼,因為我現在的傻逼是由以前決定的,現在努力,是為了讓以後的自己不再傻逼 。話糙理不糙,如果妄想現在努力一下,馬上就不再傻逼,那是不可能的,需要積累,需要沉澱,才能慢慢的不再傻逼。 好了,雞湯喝完。 今天我們的內容 ...
  • 定義:在基類中定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。 可以理解為將不變的行為放在父類中,會發生變化的行為在子類中實現,這樣可以避免子類中出現大量重覆的代碼。也就是說當子類中的方法混合了不變和可變的行為,我們通過模 ...
  • 1. 第二款抓包工具Charles安裝與使用 Charles和Fiddler一樣,也是一款抓包工具,比Fiddler界面更加清晰,支持多平臺 1.1 官方網址 https://www.charlesproxy.com/ 1.2 下載地址 Charles工具下載地址:https://www.charl ...
  • 概論: '/*'註釋內容的開始,'*/'註釋內容的結束 預處理指令 # include "studio.h" “studio.h”文件定義了很多輸入輸出功能 *.h 頭文件 *.c c源程式文件 main 函數 void mian() void代表函數不需要返回值,不需要將結果遞交給上一級程式 每個 ...
  • "知乎原鏈, 作者亦本人" 事情起源於項目另一開發者在中文Windows下構建時遇到的 "部分中文出現亂碼問題" . 當時很不解的是, 為什麼會只有部分出現亂碼. 第一感覺是, 如果編碼轉換不正確, 要麼全亂碼, 要麼全正確. 為何會"部分"出現亂碼. 初步分析 "在此" . 簡單說, 就是在轉碼過 ...
  • 題意 "題目鏈接" Sol 居然出個SAM板子也是沒誰了233 cpp include define Pair pair define MP(x, y) make_pair(x, y) define fi first define se second // define int long long ...
  • "知乎原鏈" 相關問題: "哪些Java庫有中文命名的API?" 且記下隨想. 之前沒有發佈過, 看了SO上的推薦: "Publish a library to maven repositories" 決定在sonatype發佈. sonatype發佈開源軟體庫的 "步驟" 寫的蠻詳細, 不過一些細 ...
  • 1、 "官網" 下載 2、雙擊開始安裝,一直下一步 用舊版的密碼加密 自己寫個密碼,最少8位 3、測試 打開系統偏好設置 4、mysql需要在系統環境變數里 1)在終端輸入 ,沒有指令說明。此時就還不能用命令或者IDE使用資料庫 2)進入存放系統命令的文件夾, 3)類似配置Java的環境變數, 4) ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...