最近一段時間不論互聯網還是傳統(tǒng)行業(yè),凡是涉及信息技術范疇的圈子幾乎都在討論微服務架構
。近期也看到各大技術社區(qū)開始組織一些沙龍和論壇來分享Spring Cloud的相關實施經驗,這對于最近正在整理Spring Cloud相關套件內容與實例應用的我而言,還是有不少激勵的。
目前,Spring Cloud在國內的知名度并不高,在前陣子的求職過程中,與一些互聯網公司的架構師、技術VP或者CTO在交流時,有些甚至還不知道該項目的存在??赡苓@也與國內阿里巴巴開源服務治理框架Dubbo有一定的關系,除了Dubbo本身較為完善的中文文檔之外,不少科技公司的架構師均出自阿里系,所以就目前情況看,短期國內還是Dubbo的天下。
那么第一次實施微服務架構時,我們應該選擇哪個基礎框架更好呢?
以下內容均為作者個人觀點,知識面有限,如有不對,純屬正常,不喜勿噴。
Dubbo,是阿里巴巴服務化治理的核心框架,并被廣泛應用于阿里巴巴集團的各成員站點。阿里巴巴近幾年對開源社區(qū)的貢獻不論在國內還是國外都是引人注目的,比如:JStorm捐贈給Apache并加入Apache基金會等,為中國互聯網人爭足了面子,使得阿里巴巴在國人眼里已經從電商升級為一家科技公司了。
Spring Cloud,從命名我們就可以知道,它是Spring Source的產物,Spring社區(qū)的強大背書可以說是Java企業(yè)界最有影響力的組織了,除了Spring Source之外,還有Pivotal和Netfix是其強大的后盾與技術輸出。其中Netflix開源的整套微服務架構套件是Spring Cloud的核心。
小結:如果拿Dubbo與Netflix套件做對比,前者在國內影響力較大,后者在國外影響力較大,我認為在背景上可以打個平手;但是若要與Spring Cloud做對比,由于Spring Source的加入,在背書上,Spring Cloud略勝一籌。不過,英雄不問出處,在背景這一點上,不能作為選擇框架的主要因素,當您一籌莫展的時候,可以作為參考依據。
我們選擇一個開源框架,社區(qū)的活躍度是我們極為關注的一個要點。社區(qū)越活躍,解決問題的速度越快,框架也會越來越完善,不然當我們碰到問題,就不得不自己解決。而對于團隊來說,也就意味著我們不得不自己去維護框架的源碼,這對于團隊來說也將會是一個很大的負擔。
下面看看這兩個項目在github上的更新時間,下面截圖自2016年7月30日:
可以看到Dubbo的更新已經是幾個月前,并且更新頻率很低。而Spring Cloud的更新是12分鐘前,仍處于高速迭代的階段。
小結:在社區(qū)活躍度上,Spring Cloud毋庸置疑的優(yōu)于Dubbo,這對于沒有大量精力與財力維護這部分開源內容的團隊來說,Spring Cloud會是更優(yōu)的選擇。
或許很多人會說Spring Cloud和Dubbo的對比有點不公平,Dubbo只是實現了服務治理,而Spring Cloud下面有17個子項目(可能還會新增)分別覆蓋了微服務架構下的方方面面,服務治理只是其中的一個方面,一定程度來說,Dubbo只是Spring Cloud Netflix中的一個子集。但是在選擇框架上,方案完整度恰恰是一個需要重點關注的內容。
根據Martin Fowler對微服務架構的描述中,雖然該架構相較于單體架構有模塊化解耦、可獨立部署、技術多樣性等諸多優(yōu)點,但是由于分布式環(huán)境下解耦,也帶出了不少測試與運維復雜度。
根據微服務架構在各方面的要素,看看Spring Cloud和Dubbo都提供了哪些支持。
Dubbo | Spring Cloud | |
---|---|---|
服務注冊中心 | Zookeeper | Spring Cloud Netflix Eureka |
服務調用方式 | RPC | REST API |
服務網關 | 無 | Spring Cloud Netflix Zuul |
斷路器 | 不完善 | Spring Cloud Netflix Hystrix |
分布式配置 | 無 | Spring Cloud Config |
服務跟蹤 | 無 | Spring Cloud Sleuth |
消息總線 | 無 | Spring Cloud Bus |
數據流 | 無 | Spring Cloud Stream |
批量任務 | 無 | Spring Cloud Task |
... | ... | ... |
以上列舉了一些核心部件,大致可以理解為什么之前說Dubbo只是類似Netflix的一個子集了吧。當然這里需要申明一點,Dubbo對于上表中總結為“無”的組件不代表不能實現,而只是Dubbo框架自身不提供,需要另外整合以實現對應的功能,比如:
雖然,Dubbo自身只是實現了服務治理的基礎,其他為保證集群安全、可維護、可測試等特性方面都沒有很好的實現,但是幾乎大部分關鍵組件都能找到第三方開源來實現,這些組件主要來自于國內各家大型互聯網企業(yè)的開源產品。
另外,由于Dubbo是基礎框架,其實現的內容對于我們實施微服務架構是否合理,也需要我們根據自身需求去考慮是否要修改,比如Dubbo的服務調用是通過RPC實現的,但是如果仔細拜讀過Martin Fowler的microservices一文,其定義的服務間通信是HTTP協議的REST API。那么這兩種有何區(qū)別呢?
先來說說,使用Dubbo的RPC來實現服務間調用的一些痛點:
相信這些痛點也是為什么當當網在dubbox(基于Dubbo的開源擴展)中增加了對REST支持的原因之一。
小結:Dubbo實現了服務治理的基礎,但是要完成一個完備的微服務架構,還需要在各環(huán)節(jié)去擴展和完善以保證集群的健康,以減輕開發(fā)、測試以及運維各個環(huán)節(jié)上增加出來的壓力,這樣才能讓各環(huán)節(jié)人員真正的專注于業(yè)務邏輯。而Spring Cloud依然發(fā)揚了Spring Source整合一切的作風,以標準化的姿態(tài)將一些微服務架構的成熟產品與框架揉為一體,并繼承了Spring Boot簡單配置、快速開發(fā)、輕松部署的特點,讓原本復雜的架構工作變得相對容易上手一些(如果您讀過我之前關于Spring Cloud的一些核心組件使用的文章,應該能體會這些讓人興奮而激動的特性,傳送門)。所以,如果選擇Dubbo請務必在各個環(huán)節(jié)做好整套解決方案的準備,不然很可能隨著服務數量的增長,整個團隊都將疲于應付各種架構上不足引起的困難。而如果選擇Spring Cloud,相對來說每個環(huán)節(jié)都已經有了對應的組件支持,可能有些也不一定能滿足你所有的需求,但是其活躍的社區(qū)與高速的迭代進度也會是你可以依靠的強大后盾。
Dubbo的文檔可以說在國內開源框架中算是一流的,非常全,并且講解的也非常深入,由于版本已經穩(wěn)定不再更新,所以也不太會出現不一致的情況,另外提供了中文與英文兩種版本,對于國內開發(fā)者來說,閱讀起來更加容易上手,這也是dubbo在國內更火一些的原因吧。
Spring Cloud由于整合了大量組件,文檔在體量上自然要比dubbo多很多,文檔內容上還算簡潔清楚,但是更多的是偏向整合,更深入的使用方法還是需要查看其整合組件的詳細文檔。另外由于Spring Cloud基于Spring Boot,很多例子相較于傳統(tǒng)Spring應用要簡單很多(因為自動化配置,很多內容都成了約定的默認配置),這對于剛接觸的開發(fā)者可能會有些不適應,比較建議了解和學習Spring Boot之后再使用Spring Cloud,不然可能會出現很多一知半解的情況。
小結:雖然Spring Cloud的文檔量大,但是如果使用Dubbo去整合其他第三方組件,實際也是要去閱讀大量第三方組件文檔的,所以在文檔量上,我覺得區(qū)別不大。對于文檔質量,由于Spring Cloud的迭代很快,難免會出現不一致的情況,所以在質量上我認為Dubbo更好一些。而對于文檔語言上,Dubbo自然對國內開發(fā)團隊來說更有優(yōu)勢。
通過上面再幾個環(huán)節(jié)上的分析,相信大家對Dubbo和Spring Cloud有了一個初步的了解。就我個人對這兩個框架的使用經驗和理解,打個不恰當的比喻:使用Dubbo構建的微服務架構就像組裝電腦,各環(huán)節(jié)我們的選擇自由度很高,但是最終結果很有可能因為一條內存質量不行就點不亮了,總是讓人不怎么放心,但是如果你是一名高手,那這些都不是問題;而Spring Cloud就像品牌機,在Spring Source的整合下,做了大量的兼容性測試,保證了機器擁有更高的穩(wěn)定性,但是如果要在使用非原裝組件外的東西,就需要對其基礎有足夠的了解。
從目前Spring Cloud的被關注度和活躍度上來看,很有可能將來會成為微服務架構的標準框架。所以,Spring Cloud的系列文章,我會繼續(xù)寫下去。也歡迎各位朋友一起交流,共同進步。
【一些文章與示例的匯總】:http://git.oschina.net/didispace/SpringBoot-Learning
著作權歸作者所有