微服務(wù)架構(gòu)的基礎(chǔ)框架選擇:Spring Cloud還是Dubbo?

最近一段時間不論互聯(lián)網(wǎng)還是傳統(tǒng)行業(yè),凡是涉及信息技術(shù)范疇的圈子幾乎都在討論微服務(wù)架構(gòu)。近期也看到各大技術(shù)社區(qū)開始組織一些沙龍和論壇來分享Spring Cloud的相關(guān)實施經(jīng)驗,這對于最近正在整理Spring Cloud相關(guān)套件內(nèi)容與實例應(yīng)用的我而言,還是有不少激勵的。

目前,Spring Cloud在國內(nèi)的知名度并不高,在前陣子的求職過程中,與一些互聯(lián)網(wǎng)公司的架構(gòu)師、技術(shù)VP或者CTO在交流時,有些甚至還不知道該項目的存在??赡苓@也與國內(nèi)阿里巴巴開源服務(wù)治理框架Dubbo有一定的關(guān)系,除了Dubbo本身較為完善的中文文檔之外,不少科技公司的架構(gòu)師均出自阿里系,所以就目前情況看,短期國內(nèi)還是Dubbo的天下。

那么第一次實施微服務(wù)架構(gòu)時,我們應(yīng)該選擇哪個基礎(chǔ)框架更好呢?

以下內(nèi)容均為作者個人觀點,知識面有限,如有不對,純屬正常,不喜勿噴。

Round 1:背景


Dubbo,是阿里巴巴服務(wù)化治理的核心框架,并被廣泛應(yīng)用于阿里巴巴集團的各成員站點。阿里巴巴近幾年對開源社區(qū)的貢獻(xiàn)不論在國內(nèi)還是國外都是引人注目的,比如:JStorm捐贈給Apache并加入Apache基金會等,為中國互聯(lián)網(wǎng)人爭足了面子,使得阿里巴巴在國人眼里已經(jīng)從電商升級為一家科技公司了。

Spring Cloud,從命名我們就可以知道,它是Spring Source的產(chǎn)物,Spring社區(qū)的強大背書可以說是Java企業(yè)界最有影響力的組織了,除了Spring Source之外,還有Pivotal和Netfix是其強大的后盾與技術(shù)輸出。其中Netflix開源的整套微服務(wù)架構(gòu)套件是Spring Cloud的核心。

小結(jié):如果拿Dubbo與Netflix套件做對比,前者在國內(nèi)影響力較大,后者在國外影響力較大,我認(rèn)為在背景上可以打個平手;但是若要與Spring Cloud做對比,由于Spring Source的加入,在背書上,Spring Cloud略勝一籌。不過,英雄不問出處,在背景這一點上,不能作為選擇框架的主要因素,當(dāng)您一籌莫展的時候,可以作為參考依據(jù)。

Round 2:社區(qū)活躍度


我們選擇一個開源框架,社區(qū)的活躍度是我們極為關(guān)注的一個要點。社區(qū)越活躍,解決問題的速度越快,框架也會越來越完善,不然當(dāng)我們碰到問題,就不得不自己解決。而對于團隊來說,也就意味著我們不得不自己去維護框架的源碼,這對于團隊來說也將會是一個很大的負(fù)擔(dān)。

下面看看這兩個項目在github上的更新時間,下面截圖自2016年7月30日:

最后更新時間為:2016年5月6日
最后更新時間為:12分鐘前

可以看到Dubbo的更新已經(jīng)是幾個月前,并且更新頻率很低。而Spring Cloud的更新是12分鐘前,仍處于高速迭代的階段。

小結(jié):在社區(qū)活躍度上,Spring Cloud毋庸置疑的優(yōu)于Dubbo,這對于沒有大量精力與財力維護這部分開源內(nèi)容的團隊來說,Spring Cloud會是更優(yōu)的選擇。

Round 3:架構(gòu)完整度


或許很多人會說Spring Cloud和Dubbo的對比有點不公平,Dubbo只是實現(xiàn)了服務(wù)治理,而Spring Cloud下面有17個子項目(可能還會新增)分別覆蓋了微服務(wù)架構(gòu)下的方方面面,服務(wù)治理只是其中的一個方面,一定程度來說,Dubbo只是Spring Cloud Netflix中的一個子集。但是在選擇框架上,方案完整度恰恰是一個需要重點關(guān)注的內(nèi)容。

根據(jù)Martin Fowler對微服務(wù)架構(gòu)的描述中,雖然該架構(gòu)相較于單體架構(gòu)有模塊化解耦、可獨立部署、技術(shù)多樣性等諸多優(yōu)點,但是由于分布式環(huán)境下解耦,也帶出了不少測試與運維復(fù)雜度。

根據(jù)微服務(wù)架構(gòu)在各方面的要素,看看Spring Cloud和Dubbo都提供了哪些支持。

| Dubbo| Spring Cloud
----|------|----
服務(wù)注冊中心| Zookeeper| Spring Cloud Netflix Eureka
服務(wù)調(diào)用方式| RPC| REST API
服務(wù)網(wǎng)關(guān)| 無| Spring Cloud Netflix Zuul
斷路器| 不完善| Spring Cloud Netflix Hystrix
分布式配置| 無| Spring Cloud Config
服務(wù)跟蹤| 無| Spring Cloud Sleuth
消息總線| 無| Spring Cloud Bus
數(shù)據(jù)流| 無| Spring Cloud Stream
批量任務(wù)| 無| Spring Cloud Task
...| ...| ...

以上列舉了一些核心部件,大致可以理解為什么之前說Dubbo只是類似Netflix的一個子集了吧。當(dāng)然這里需要申明一點,Dubbo對于上表中總結(jié)為“無”的組件不代表不能實現(xiàn),而只是Dubbo框架自身不提供,需要另外整合以實現(xiàn)對應(yīng)的功能,比如:

  • 分布式配置:可以使用淘寶的diamond、百度的disconf來實現(xiàn)分布式配置管理。但是Spring Cloud中的Config組件除了提供配置管理之外,由于其存儲可以使用git,因此它天然的實現(xiàn)了配置內(nèi)容的版本管理,可以完美的與應(yīng)用版本管理整合起來。
  • 服務(wù)跟蹤:可以使用京東開源的Hydra
  • 批量任務(wù):可以使用當(dāng)當(dāng)開源的Elastic-Job
  • ……

雖然,Dubbo自身只是實現(xiàn)了服務(wù)治理的基礎(chǔ),其他為保證集群安全、可維護、可測試等特性方面都沒有很好的實現(xiàn),但是幾乎大部分關(guān)鍵組件都能找到第三方開源來實現(xiàn),這些組件主要來自于國內(nèi)各家大型互聯(lián)網(wǎng)企業(yè)的開源產(chǎn)品。

RPC vs REST

另外,由于Dubbo是基礎(chǔ)框架,其實現(xiàn)的內(nèi)容對于我們實施微服務(wù)架構(gòu)是否合理,也需要我們根據(jù)自身需求去考慮是否要修改,比如Dubbo的服務(wù)調(diào)用是通過RPC實現(xiàn)的,但是如果仔細(xì)拜讀過Martin Fowler的microservices一文,其定義的服務(wù)間通信是HTTP協(xié)議的REST API。那么這兩種有何區(qū)別呢?

先來說說,使用Dubbo的RPC來實現(xiàn)服務(wù)間調(diào)用的一些痛點:

  • 服務(wù)提供方與調(diào)用方接口依賴方式太強:我們?yōu)槊總€微服務(wù)定義了各自的service抽象接口,并通過持續(xù)集成發(fā)布到私有倉庫中,調(diào)用方應(yīng)用對微服務(wù)提供的抽象接口存在強依賴關(guān)系,因此不論開發(fā)、測試、集成環(huán)境都需要嚴(yán)格的管理版本依賴,才不會出現(xiàn)服務(wù)方與調(diào)用方的不一致導(dǎo)致應(yīng)用無法編譯成功等一系列問題,以及這也會直接影響本地開發(fā)的環(huán)境要求,往往一個依賴很多服務(wù)的上層應(yīng)用,每天都要更新很多代碼并install之后才能進(jìn)行后續(xù)的開發(fā)。若沒有嚴(yán)格的版本管理制度或開發(fā)一些自動化工具,這樣的依賴關(guān)系會成為開發(fā)團隊的一大噩夢。而REST接口相比RPC更為輕量化,服務(wù)提供方和調(diào)用方的依賴只是依靠一紙契約,不存在代碼級別的強依賴,當(dāng)然REST接口也有痛點,因為接口定義過輕,很容易導(dǎo)致定義文檔與實際實現(xiàn)不一致導(dǎo)致服務(wù)集成時的問題,但是該問題很好解決,只需要通過每個服務(wù)整合swagger,讓每個服務(wù)的代碼與文檔一體化,就能解決。所以在分布式環(huán)境下,REST方式的服務(wù)依賴要比RPC方式的依賴更為靈活。
  • 服務(wù)對平臺敏感,難以簡單復(fù)用:通常我們在提供對外服務(wù)時,都會以REST的方式提供出去,這樣可以實現(xiàn)跨平臺的特點,任何一個語言的調(diào)用方都可以根據(jù)接口定義來實現(xiàn)。那么在Dubbo中我們要提供REST接口時,不得不實現(xiàn)一層代理,用來將RPC接口轉(zhuǎn)換成REST接口進(jìn)行對外發(fā)布。若我們每個服務(wù)本身就以REST接口方式存在,當(dāng)要對外提供服務(wù)時,主要在API網(wǎng)關(guān)中配置映射關(guān)系和權(quán)限控制就可實現(xiàn)服務(wù)的復(fù)用了。

相信這些痛點也是為什么當(dāng)當(dāng)網(wǎng)在dubbox(基于Dubbo的開源擴展)中增加了對REST支持的原因之一。

小結(jié):Dubbo實現(xiàn)了服務(wù)治理的基礎(chǔ),但是要完成一個完備的微服務(wù)架構(gòu),還需要在各環(huán)節(jié)去擴展和完善以保證集群的健康,以減輕開發(fā)、測試以及運維各個環(huán)節(jié)上增加出來的壓力,這樣才能讓各環(huán)節(jié)人員真正的專注于業(yè)務(wù)邏輯。而Spring Cloud依然發(fā)揚了Spring Source整合一切的作風(fēng),以標(biāo)準(zhǔn)化的姿態(tài)將一些微服務(wù)架構(gòu)的成熟產(chǎn)品與框架揉為一體,并繼承了Spring Boot簡單配置、快速開發(fā)、輕松部署的特點,讓原本復(fù)雜的架構(gòu)工作變得相對容易上手一些(如果您讀過我之前關(guān)于Spring Cloud的一些核心組件使用的文章,應(yīng)該能體會這些讓人興奮而激動的特性,傳送門)。所以,如果選擇Dubbo請務(wù)必在各個環(huán)節(jié)做好整套解決方案的準(zhǔn)備,不然很可能隨著服務(wù)數(shù)量的增長,整個團隊都將疲于應(yīng)付各種架構(gòu)上不足引起的困難。而如果選擇Spring Cloud,相對來說每個環(huán)節(jié)都已經(jīng)有了對應(yīng)的組件支持,可能有些也不一定能滿足你所有的需求,但是其活躍的社區(qū)與高速的迭代進(jìn)度也會是你可以依靠的強大后盾。

Round 4:文檔質(zhì)量


Dubbo的文檔可以說在國內(nèi)開源框架中算是一流的,非常全,并且講解的也非常深入,由于版本已經(jīng)穩(wěn)定不再更新,所以也不太會出現(xiàn)不一致的情況,另外提供了中文與英文兩種版本,對于國內(nèi)開發(fā)者來說,閱讀起來更加容易上手,這也是dubbo在國內(nèi)更火一些的原因吧。

Spring Cloud由于整合了大量組件,文檔在體量上自然要比dubbo多很多,文檔內(nèi)容上還算簡潔清楚,但是更多的是偏向整合,更深入的使用方法還是需要查看其整合組件的詳細(xì)文檔。另外由于Spring Cloud基于Spring Boot,很多例子相較于傳統(tǒng)Spring應(yīng)用要簡單很多(因為自動化配置,很多內(nèi)容都成了約定的默認(rèn)配置),這對于剛接觸的開發(fā)者可能會有些不適應(yīng),比較建議了解和學(xué)習(xí)Spring Boot之后再使用Spring Cloud,不然可能會出現(xiàn)很多一知半解的情況。

小結(jié):雖然Spring Cloud的文檔量大,但是如果使用Dubbo去整合其他第三方組件,實際也是要去閱讀大量第三方組件文檔的,所以在文檔量上,我覺得區(qū)別不大。對于文檔質(zhì)量,由于Spring Cloud的迭代很快,難免會出現(xiàn)不一致的情況,所以在質(zhì)量上我認(rèn)為Dubbo更好一些。而對于文檔語言上,Dubbo自然對國內(nèi)開發(fā)團隊來說更有優(yōu)勢。

總結(jié)


通過上面再幾個環(huán)節(jié)上的分析,相信大家對Dubbo和Spring Cloud有了一個初步的了解。就我個人對這兩個框架的使用經(jīng)驗和理解,打個不恰當(dāng)?shù)谋扔鳎菏褂肈ubbo構(gòu)建的微服務(wù)架構(gòu)就像組裝電腦,各環(huán)節(jié)我們的選擇自由度很高,但是最終結(jié)果很有可能因為一條內(nèi)存質(zhì)量不行就點不亮了,總是讓人不怎么放心,但是如果你是一名高手,那這些都不是問題;而Spring Cloud就像品牌機,在Spring Source的整合下,做了大量的兼容性測試,保證了機器擁有更高的穩(wěn)定性,但是如果要在使用非原裝組件外的東西,就需要對其基礎(chǔ)有足夠的了解。

從目前Spring Cloud的被關(guān)注度和活躍度上來看,很有可能將來會成為微服務(wù)架構(gòu)的標(biāo)準(zhǔn)框架。所以,Spring Cloud的系列文章,我會繼續(xù)寫下去。也歡迎各位朋友一起交流,共同進(jìn)步。

【一些文章與示例的匯總】:http://git.oschina.net/didispace/SpringBoot-Learning

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,106評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,441評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,211評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,736評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,475評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,834評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,829評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,009評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,559評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,306評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,516評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,038評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,728評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,132評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,443評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,249評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,484評論 2 379

推薦閱讀更多精彩內(nèi)容