Dubbo + zookeeper 是現(xiàn)在比較流行的架構筷狼,也是我們行部分系統(tǒng)正在使用的架構动看,例如支撐平臺裕偿。下面就介紹一下為什么要使用這個架構和這個架構的工作流程洞慎。
上面這個圖是dubbo官網(wǎng)的,簡單介紹一下工作流程
0.服務器啟動
1.生產(chǎn)者向注冊中心注冊服務
2.消費者向注冊中心訂閱服務
3.注冊中心通知消費者击费,告知其對應服務器和服務
4.消費者invoke調用生產(chǎn)者服務
5.統(tǒng)計服務注冊消費等信息dubbo有什么優(yōu)點
Dubbo 便于橫向擴展
Dubbo使用registry進行服務注冊和訂閱拢蛋,當我們新增生產(chǎn)者服務時,只需要向注冊中心注冊便可蔫巩,不同以往谆棱,需要修改消費者的配置文件才可以實現(xiàn)集群的擴展。
Dubbo 簡化了開發(fā)過程
對于開發(fā)者來說圆仔,通過dubbo的框架垃瞧,消費者和生產(chǎn)者在使用或提供服務時,只需要在配置文件里聲明要使用或提供的服務坪郭,配上注冊中心的配置个从,便可以使用和調用對應的服務,因此在消費者一側,無需關心要調用哪臺服務器的服務嗦锐,IP嫌松、URL等等信息,調用遠程接口的時候也不用像傳統(tǒng)的new一個httpclient奕污,然后輸入url這樣去調用萎羔,直接像調用本地接口一樣,提高了開發(fā)的效率
Dubbo 簡化了開發(fā)過程
對于開發(fā)者來說碳默,通過dubbo的框架贾陷,消費者和生產(chǎn)者在使用或提供服務時,只需要在配置文件里聲明要使用或提供的服務嘱根,配上注冊中心的配置髓废,便可以使用和調用對應的服務,因此在消費者一側该抒,無需關心要調用哪臺服務器的服務慌洪,IP、URL等等信息凑保,調用遠程接口的時候也不用像傳統(tǒng)的new一個httpclient蒋譬,然后輸入url這樣去調用,直接像調用本地接口一樣愉适,提高了開發(fā)的效率
Dubbo采用了RPC調度
一個RPC調用服務的工作流程:
- 客戶端調用(消費者調用服務)
- 客戶端存根打包(通過RPC協(xié)議對請求報文進行序列化和打包,這里已經(jīng)完成了注冊中心的訂閱癣漆,得到了服務的列表维咸,把對應的服務器IP和端口寫進報文頭里,從而調用對應的服務)
- RPC發(fā)送請求(通過client stub發(fā)送報文)
- RPC接收(通過server stub 接收報文)
- 服務器端存根解包(通過RPC協(xié)議進行解包)
- 調用接口(調用本地接口)
- 返回信息(獲得信息后向客戶端存根發(fā)送返回結果)
- 服務器端存根打包(server stub通過RPC協(xié)議對報文進行序列化和打包惠爽,這里不用通過注冊中心癌蓖,原路返回)
- RPC請求(通過server stub發(fā)送報文)
- RPC接收(client stub接收報文)
- 客戶端存根解包(RPC協(xié)議解包)
- 客戶端獲得調用結果(消費者獲得返回結果)
可能有人會問,這么多的工作流程婚肆,http調用不香么租副?其實各有各的優(yōu)點。HTTP調用较性,每次都會建立一次TCP連接用僧,三次握手四次分手,像平時網(wǎng)銀微信的服務器赞咙,訪問的人多了责循,就出現(xiàn)很多ESTABLISHED和TIME_WAIT狀態(tài)的連接,EST狀態(tài)的連接就不說了攀操,肯定會占用比較多的帶寬資源院仿,而TIMEWAIT狀態(tài)的也會占用一定的資源去等待握手結束。這樣對于應用性能和環(huán)境資源都不太友好。
而RPC調用通過兩邊stub進行通訊歹垫,這兩個相當于一個代理剥汤,建立一次TCP連接,每次TCP連接可調用多個接口排惨,這樣不僅提高了應用程序的性能吭敢,還減少了網(wǎng)絡資源的負擔。
RPC調用與傳統(tǒng)的HTTP調用不同有以下優(yōu)點:
- 對于開發(fā)者若贮,接口層以下都是透明的省有,只管調用接口
- 減輕了網(wǎng)絡的負擔
- 提升了程序的性能
zookeeper注冊中心
從上面的分析應該可以得出,zookeeper不是dubbo必須的谴麦,只是zookeeper暴露的接口和內部機制比較適合作為dubbo的注冊中心蠢沿。
那么zookeeper作為dubbo的注冊中心做了什么呢?引用dubbo的架構圖匾效,zookeeper做了以下三個步驟:
1. register(服務注冊)
2. subscribe(訂閱)
3. notify(通知)
這三個步驟主要調用了zookeeper提供的兩種接口:
創(chuàng)建節(jié)點
zookeeper提供了兩種節(jié)點舷蟀,一種是持久節(jié)點,一種是臨時節(jié)點面哼,而dubbo注冊服務其實就是在zookeeper上面創(chuàng)建一個節(jié)點野宜,然后利用臨時節(jié)點的特性,當生產(chǎn)者服務器崩潰時魔策,不能提供服務匈子,與zookeeper的連接斷開會話結束,就會銷毀創(chuàng)建的臨時節(jié)點闯袒,也就是注銷服務虎敦。這樣消費者就不會調用崩潰的服務器的接口。這里可以試著在生產(chǎn)者的服務器上政敢,用防火墻屏蔽其應用端口的出局其徙,模擬應用程序的崩潰,這是監(jiān)視zookeeper的節(jié)點數(shù)量喷户,就會發(fā)現(xiàn)其節(jié)點的數(shù)量相比之前減少了唾那,也就是所謂的臨時節(jié)點被銷毀了。
設置監(jiān)視器
設置監(jiān)視器的接口實現(xiàn)了訂閱和通知褪尝,dubbo消費者端在zookeeper的節(jié)點上闹获,對需要訂閱的服務(也就是一個節(jié)點)設置一個監(jiān)視器