SpringCloud與Dubbo區(qū)別

SpringCloud和Dubbo都是當(dāng)下流行的RPC框架,各自都集成了服務(wù)發(fā)現(xiàn)和治理組件。SpringCloud用Eureka,Dubbo用Zookeeper,這篇博客就將將這兩個組件在各自系統(tǒng)中的作用機制的區(qū)別。

1.注冊的服務(wù)的區(qū)別

Dubbo是基于java接口及Hession2序列化的來實現(xiàn)傳輸?shù)模琍rovider對外暴露接口,Consumer根據(jù)接口的規(guī)則調(diào)用。也就是Provider向Zookeeper注冊的是接口信息,Consumer從Zookeeper發(fā)現(xiàn)的是接口的信息,通過接口的name,group,version來匹配調(diào)用。Consumer只關(guān)注接口是否匹配,而對此接口屬于什么應(yīng)用不關(guān)心。當(dāng)然接口的注冊信息里會包含應(yīng)用的ip,hostname等。

SpringCloud的服務(wù)發(fā)現(xiàn)是基于Http協(xié)議來實現(xiàn)的,Provider對外暴露的是應(yīng)用信息,比如應(yīng)用名稱,ip地址等等,Consumer發(fā)現(xiàn)的是應(yīng)用的信息,當(dāng)調(diào)用的時候隨機選擇一個Provider的IP地址,應(yīng)用名稱,然后依據(jù)Http協(xié)議發(fā)送請求。Consumer關(guān)注的是應(yīng)用名稱,根據(jù)應(yīng)用名稱來決定調(diào)用的是哪個服務(wù)集群,然后對此名稱對應(yīng)的服務(wù)集群做負(fù)載均衡。Provider接受到請求后,根據(jù)內(nèi)置的SpringMVC來匹配路由處理請求。

2 . Server集群服務(wù)信息同步的區(qū)別

Dubbo使用Zookeeper做服務(wù)發(fā)現(xiàn)和治理,Zookeeper是一個分布式協(xié)調(diào)框架,其有很多很實用的功能,服務(wù)發(fā)現(xiàn)僅僅是其中的一個。Zookeeper基于著名的CAP理論中的C(一致性),P(分區(qū)可用性)實現(xiàn),它的ZAB(zookeeper atomic broadcast protocol)協(xié)議,保證了集群里狀態(tài)的一致性。Client的每一個事務(wù)操作都由Leader廣播給所有Follower,當(dāng)超過半數(shù)的Follower都返回執(zhí)行成功后,才執(zhí)行事務(wù)的ack。對于因網(wǎng)絡(luò)崩潰或者宕機等問題而執(zhí)行失敗的zookeeper節(jié)點,zookeeper會基于zab的崩潰恢復(fù)機制來處理,這里不再講述。每一個操作都需要過半數(shù)的zookeeper節(jié)點執(zhí)行成功才確認(rèn)成功,那么當(dāng)zookeeper集群過半數(shù)節(jié)點出現(xiàn)問題時,服務(wù)發(fā)現(xiàn)功能就不可用。

SpringCloud使用Eureka做服務(wù)發(fā)現(xiàn)和治理,它是一個專門用于服務(wù)發(fā)現(xiàn)和治理的框架,其基于CAP理論中的A(可用性),P(分區(qū)可用性)實現(xiàn)。EurekaServer節(jié)點間的服務(wù)信息同步是基于異步Http實現(xiàn)的。每隔Server節(jié)點在接收Client的服務(wù)請求時,立即處理請求,然后將此次請求的信息拷貝,封裝成一個Task,存入Queue中。Server初始化時會啟動一個線程定期的從TaskQueue中批量提取Task,然后執(zhí)行。服務(wù)同步不保證一定成功,雖然有失敗重試,但超過一定時限后就放棄同步。當(dāng)然其有一個特性,當(dāng)服務(wù)丟失后,同步的操作返回400,404后會立即將最新的服務(wù)信息同步過去,因此即使中途同步失敗,不會對后續(xù)的同步有影響。

3 . 服務(wù)更新機制的區(qū)別

Dubbo使用Zookeeper做服務(wù)發(fā)現(xiàn)和治理,訂閱Zookeeper下相應(yīng)的znode。當(dāng)節(jié)點發(fā)生變化,比如有新的元素增加,或者舊的元素移除,Zookeeper會通知所有訂閱此節(jié)點的Client,將當(dāng)前的全量數(shù)據(jù)同步給各Client,Dubbo里根據(jù)最新的數(shù)據(jù)來做相應(yīng)處理,移除下線的,初始化新增的。每次更新都同步全量數(shù)據(jù)。

Eureka在啟動時向Server進行一次全量拉取,獲取所有的可用服務(wù)信息,之后默認(rèn)情況下都是進行增量拉取。Server會將有變化的服務(wù)信息放在一個Queue里,Client每次同步時僅獲取增量信息,根據(jù)信息里的操作類型,服務(wù)信息來對當(dāng)前持有的服務(wù)做相應(yīng)的處理,移除下線的,初始化新增的等。每次更新僅同步增量數(shù)據(jù),也就是更新的數(shù)據(jù)。

4 . 服務(wù)更新反饋機制的區(qū)別

Dubbo訂閱Zookeeper下相應(yīng)的節(jié)點,當(dāng)節(jié)點的狀態(tài)發(fā)生改變時,Zookeeper會立即反饋訂閱的Client,實時性很高。

Eureka Server在接收到Client的更新操作,或者移除服務(wù)信息時,僅僅會將更新消息存放入recentlyChangedQueue中,不會主動的反饋其他Client。其他Client只有在拉取服務(wù)增量信息時才會感知到某個服務(wù)的更新,延時最大為30S,也就是拉取周期。

5 . 服務(wù)信息回收機制的區(qū)別

Dubbo Provider初始化時會創(chuàng)建一個Zookeeper Client,專門用于與Zookeeper集群交互。維持與集群間的長連接,定時發(fā)送心跳,維護Zookeeper上自身節(jié)點的存在。節(jié)點類型是臨時節(jié)點,也就是當(dāng)心跳超時或者長連接斷開時,會立即移除Provider對應(yīng)的節(jié)點。
Dubbo Consumer初始化時也會創(chuàng)建一個Zookeeper Client,專門用于與Zookeeper集群交互。維持長連接,創(chuàng)建EvenetListener,監(jiān)聽Provider節(jié)點的變動情況。當(dāng)Provider節(jié)點新增或者移除時,Zookeeper會廣播這個事件,然后將此節(jié)點的當(dāng)前值(剩下的所有接口信息)發(fā)送給那些注冊了此節(jié)點監(jiān)聽器的Client。Consumer獲取到對應(yīng)Provider節(jié)點下的所有接口信息后,移除已下線的,創(chuàng)建新增的。
Zookeeper對服務(wù)信息的維護實時性和一致性比較高,但也可能因為網(wǎng)絡(luò)問題或者集群問題導(dǎo)致服務(wù)不可用。

SpringCloud的服務(wù)信息回收僅基于心跳超時,與長連接無關(guān)。當(dāng)心跳超時后,EurekaServer回收服務(wù)信息,然后將此動作同步給其他Server節(jié)點。當(dāng)然可能一個服務(wù)信息會存在多個Server上,多次回收操作的同步具備冪等性。也就是說服務(wù)回收只需要通知一個Server節(jié)點就可以了,回收動作會通過Server節(jié)點傳播開來。EurekaServer能夠回收服務(wù)信息由個重要前提:上一分鐘內(nèi)正常發(fā)送心跳的服務(wù)的比列超過總數(shù)的85%,如果因為網(wǎng)絡(luò)波動等原因造成大量服務(wù)的心跳超時,那么EurekaServer會觸發(fā)自我保護機制,放棄回收那些心跳超時的服務(wù)信息。服務(wù)發(fā)現(xiàn)組件應(yīng)該優(yōu)先保證可用性,Consumer能夠發(fā)現(xiàn)Provider,即使發(fā)現(xiàn)的是非可用的Provider,但因為Conusmer一般具備容錯機制,不會對服務(wù)的正常調(diào)用有太多影響。從這點上看Eureka的服務(wù)發(fā)現(xiàn)機制要比Zookeeper稍微合理一點的。

6 . 節(jié)點性質(zhì)的區(qū)別

Dubbo只有Consumer訂閱Provider節(jié)點,也就是Consumer發(fā)現(xiàn)Provider節(jié)點信息

Eureka不區(qū)分Consumer或者Provider,兩者都統(tǒng)稱為Client,一個Client內(nèi)可能同時含有Provider,Consumer,通過服務(wù)發(fā)現(xiàn)組件獲取的是其他所有的Client節(jié)點信息,在調(diào)用時根據(jù)應(yīng)用名稱來篩選節(jié)點

7 . 使用方式的區(qū)別

Dubbo使用Zookeeper作為服務(wù)發(fā)現(xiàn)和治理的組件,所以需要搭建Zookeeper集群作為依賴。

SpringCloud使用Eureka作為服務(wù)發(fā)現(xiàn)和治理組件,在Spring應(yīng)用中整合Eureka還是很簡單的,引入依賴,加個注解,指定集群Server的serviceUrl,其他的都可以使用默認(rèn)配置即可,啟動應(yīng)用,Eureka集群就搭建好了。同時配合SpringCloudConfg,能夠統(tǒng)一管理Eureka的集群配置信息,可以動態(tài)的增加或減少EurekaServer的集群節(jié)點。Eurerka會每隔15分鐘根據(jù)配置上的集群信息重新生成集群節(jié)點,覆蓋之前的。這種機制比Zookeeper要更優(yōu)秀一些,畢竟Eureka算是Spring生態(tài)里的一環(huán),已經(jīng)被整合的非常好了,能夠以很多匪夷所思的方式來使用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1 為什么需要服務(wù)發(fā)現(xiàn) 簡單來說,服務(wù)化的核心就是將傳統(tǒng)的一站式應(yīng)用根據(jù)業(yè)務(wù)拆分成一個一個的服務(wù),而微服務(wù)在這個基...
    謙小易閱讀 25,349評論 4 93
  • Dubbo是什么 Dubbo是Alibaba開源的分布式服務(wù)框架,它最大的特點是按照分層的方式來架構(gòu),使用這種方式...
    Coselding閱讀 17,461評論 3 196
  • #復(fù)利# *孩子是不需要教的,他們會自己去學(xué)習(xí),也會自己糾正自己的錯誤。教育者能做的,只需要對孩子們充滿信心,為孩...
    姜一得閱讀 309評論 0 0
  • 1 現(xiàn)在人人都幾乎是機不離手的生活狀態(tài),很多事情微信上有人給我發(fā)信息,我都是秒回的。除了長輩發(fā)來的要等幾分鐘才能回...
    一盞燈ll閱讀 2,282評論 0 1
  • 自下而上的方法是核心關(guān)鍵 今天我們將開始談一個重要的課題,那就叫:執(zhí)行,或者叫行動,或者叫執(zhí)行力,這對我們來講是真...
    張鏝溪閱讀 306評論 0 1

友情鏈接更多精彩內(nèi)容