轉載於 http://www.cnblogs.com/xishuai/p/dubbo-and-spring-cloud.htmlhtml
微服務(Microservices)是一種架構風格,一個大型複雜軟件應用由一個或多個微服務組成。系統中的各個微服務可被獨立部署,各個微服務之間是鬆耦合的。每一個微服務僅關注於完成一件任務並很好地完成該任務。在全部狀況下,每一個任務表明着一個小的業務能力。git
以往咱們開發應用程序都是單體型(能夠看做是一個怪獸👿),雖然開發和部署比較方便,但後期隨着業務的不斷增長,開發迭代和性能瓶頸等問題,將會困擾開發團隊,微服務就是解決此問題的有效手段,市面上有不少的微服務框架,好比最著名的兩個 Dubbo 和 Spring Cloud,咱們該如何選擇呢?github
公司近期打算向 Java 微服務技術轉型(一步一步實現,會考慮兼容 .NET/.NET Core),如下是我整理的相關內容,若是你有更好的建議和意見,歡迎探討~~~redis
由於服務調用方式是 Dubbo 和 Spring Cloud 重要不一樣點,瞭解 RPC/gRPC/HTTP/REST 相關概念,有助於對比 Dubbo 和 Spring Cloud。算法
RPC 是遠端過程調用,其調用協議一般包含傳輸協議和編碼協議。spring
HTTP 嚴格來講跟 RPC 不是一個層級的概念,HTTP 自己也能夠做爲 RPC 的傳輸層協議。數據庫
傳輸協議包含: 如著名的 gRPC 使用的 HTTP 2.0 協議,也有如 Dubbo 一類的自定義報文的 TCP 協議。編碼協議包含: 如基於文本編碼的 XML Json,也有二進制編碼的 ProtoBuf Binpack 等。apache
所謂的效率優點是針對 HTTP 1.1 協議來說的,HTTP 2.0 協議已經優化編碼效率問題,像 gRPC 這種 RPC 庫使用的就是 HTTP 2.0 協議。後端
在跨語言調用的時候,REST 風格直接把 HTTP 做爲應用協議(直接和服務打交道),不一樣語言之間調用比較方便。安全
而 RPC 能夠把 HTTP 做爲一種傳輸協議(好比 gRPC 使用 HTTP 2.0 協議傳輸),自己還會封裝一層 RPC 框架的應用層協議,不一樣語言之間調用須要依賴 RPC 協議(須要跨語言 RPC 庫實現,好比 Thrift)。
問題:爲何 Dubbo 比 Spring Cloud 性能要高一些?
回答:由於 Dubbo 採用單一長鏈接和 NIO 異步通信(保持鏈接/輪詢處理),使用自定義報文的 TCP 協議,而且序列化使用定製 Hessian2 框架,適合於小數據量大併發的服務調用,以及服務消費者機器數遠大於服務提供者機器數的狀況,但不適用於傳輸大數據的服務調用。而 Spring Cloud 直接使用 HTTP 協議(但也不是強綁定,也可使用 RPC 庫,或者採用 HTTP 2.0 + 長連接方式(Fegin 能夠靈活設置))。
另外,Martin Fowler 的 MicroServices 一文,其定義的服務間通訊是 HTTP 協議的 REST API。
https://github.com/apache/incubator-dubbo
Dubbo 是一個分佈式服務框架,致力於提供高性能和透明化的 RPC 遠程服務調用方案,以及 SOA 服務治理方案。簡單的說,Dubbo 就是個服務框架,說白了就是個遠程服務調用的分佈式框架。
模塊註解:
流程詳解:
面對服務消費方,當業務邏輯中須要調用一個服務時,真正調用的實際上是 Dubbo 建立的一個 Proxy,該 Proxy 會把調用轉化成調用指定的 Invoker(Cluster 將 Directory 中的多個 Invoker 假裝成一個 Invoker,對上層透明,假裝過程包含了容錯邏輯,調用失敗後,重試另外一個(經過 LoadBalance),Invoker 封裝了 Provider 地址及 Service 接口信息)。而在這一系列的委託調用的過程裏就完成了服務治理的邏輯,最終完成調用。
Dubbo 負責人說明(重啓維護是接受的採訪):
阿里內部使用 HSF,緣由業務屬性和規模有關。
這裏就不得不提到目前的一些文章在談到微服務的時候老是拿 Spring Cloud 和 Dubbo 來對比,須要強調的是 Dubbo 將來的定位並非要成爲一個微服務的全面解決方案,而是專一在 RPC 領域,成爲微服務生態體系中的一個重要組件。至於你們關注的微服務化衍生出的服務治理需求,咱們會在 Dubbo 積極適配開源解決方案,甚至啓動獨立的開源項目予以支持。
受衆主要來自國內各友商以及我的開發者,但願未來可以將用戶拓展到全球,表明國人在 RPC 領域與 gRPC(基於 HTTP 2.0)、Finagle 等競爭。
https://github.com/spring-cloud
Spring Cloud 基於 Spring Boot,爲微服務體系開發中的架構問題,提供了一整套的解決方案——服務註冊與發現,服務消費,服務保護與熔斷,網關,分佈式調用追蹤,分佈式配置管理等。
Spring Boot 是 Spring 的一套快速配置腳手架,使用默認大於配置的理念,用於快速開發單個微服務。
重點:
核心功能:
流程:
Spring Cloud 拋棄了 Dubbo 的 RPC 通訊,採用的是基於 HTTP 的 REST 方式。嚴格來講,這兩種方式各有優劣。雖然從必定程度上來講,後者犧牲了服務調用的性能,但也避免了上面提到的原生 RPC 帶來的問題。並且 REST 相比 RPC 更爲靈活,服務提供方和調用方的依賴只依靠一紙契約,不存在代碼級別的強依賴,這在強調快速演化的微服務環境下,顯得更加合適。
Dubbo 專一 RPC 和服務治理,Spring Cloud 則是一個微服務架構生態。
鑑於服務發現對服務化架構的重要性,Dubbo 實踐一般以 ZooKeeper 爲註冊中心(Dubbo 原生支持的 Redis 方案須要服務器時間同步,且性能消耗過大)。針對分佈式領域著名的 CAP 理論(C——數據一致性,A——服務可用性,P——服務對網絡分區故障的容錯性),Zookeeper 保證的是 CP ,但對於服務發現而言,可用性比數據一致性更加劇要,AP 賽過 CP,而 Eureka 設計則遵循 AP 原則。
Spring Cloud 支持 Consul(CA)和 Zookeeper,但不推薦使用。
當前開源上可選用的微服務框架主要有 Dubbo、Spring Cloud 等,鑑於 Dubbo 完備的功能和文檔且在國內被衆多大型互聯網公司選用,考拉天然也選擇了 Dubbo 做爲服務化的基礎框架。其實相比於 Dubbo,Spring Cloud 能夠說是一個更完備的微服務解決方案,它從功能性上是 Dubbo 的一個超集,我的認爲從選型上對於一些中小型企業 Spring Cloud 多是一個更好的選擇。提起 Spring Cloud,一些開發的第一印象是 HTTP + JSON 的 REST 通訊,性能上難堪重用,其實這也是一種誤讀。微服務選型要評估如下幾點:內部是否存在異構系統集成的問題;備選框架功能特性是否知足需求;HTTP 協議的通訊對於應用的負載量會否真正成爲瓶頸點(Spring Cloud 也並非和 HTTP + JSON 強制綁定的,若有必要 Thrift、ProtoBuf 等高效的 RPC、序列化協議一樣能夠做爲替代方案);社區活躍度、團隊技術儲備等。做爲已經沒有團隊持續維護的開源項目,選擇 Dubbo 框架內部就必需要組建一個維護團隊,先不論你要準備要集成多少功能作多少改造,做爲一個支撐全部工程正常運轉的基礎組件,問題的及時響應與解答、重大缺陷的及時修復能力就已足夠重要。
使用 Dubbo 構建的微服務架構就像組裝電腦,各環節咱們的選擇自由度很高,可是最終結果頗有可能由於一條內存質量不行就點不亮了,老是讓人不怎麼放心,可是若是你是一名高手,那這些都不是問題;而 Spring Cloud 就像品牌機,在 Spring Source 的整合下,作了大量的兼容性測試,保證了機器擁有更高的穩定性,可是若是要在使用非原裝組件外的東西,就須要對其基礎有足夠的瞭解。
若使用 Spring Cloud,.NET Core 兼容 Spring Cloud 比較好實現,由於基於 REST 服務調用,能夠自行實現其服務(Eureka 提供 REST API 進行服務註冊),也已有成熟的開源框架如 Steeltoe。
官方介紹:
Steeltoe is an open source project that enables .NET developers to implement industry standard best practices when building resilient microservices for the cloud. The Steeltoe client libraries enable .NET Core and .NET Framework apps to easily leverage Netflix Eureka, Hystrix, Spring Cloud Config Server, and Cloud Foundry services.
2017 年末,非侵入式的 Service Mesh 技術從萌芽到走向了成熟。
Service Mesh 又譯做「服務網格」,做爲服務間通訊的基礎設施層。
若是用一句話來解釋什麼是 Service Mesh,能夠將它比做是應用程序或者說微服務間的 TCP/IP,負責服務之間的網絡調用、限流、熔斷和監控。對於編寫應用程序來講通常無須關心 TCP/IP 這一層(好比經過 HTTP 協議的 RESTful 應用),一樣使用 Service Mesh 也就無須關係服務之間的那些原來是經過應用程序或者其餘框架實現的事情,好比 Spring Cloud、OSS,如今只要交給 Service Mesh 就能夠了。
關於 Dubbo 和 Spring Cloud 的相關概念和對比,上面已經敘述的很清楚了,我我的比較傾向於 Spring Cloud,緣由就是真正的微服務框架、提供整套的組件支持、使用簡單方便、強大的社區支持等等,另外,由於考慮到 .NET/.NET Core 的兼容處理,RPC 並不能很好的實現跨語言(須要藉助跨語言庫,好比 gRPC、Thrift,但由於 Dubbo 自己就是「gRPC」,在 Dubbo 之上再包一層 gRPC,有點重複封裝了),而 HTTP REST 自己就是支持跨語言實現,因此,Spring Cloud 這一點仍是很是好的(Dubbox 也支持,但性能相比要差一些)。
但凡事無絕對,每件事物有好的地方也有很差的地方,總的來講,Dubbo 和 Spring Cloud 的主要不一樣體如今兩個方面:服務調用方式不一樣和專一點不一樣(生態不一樣)。
最後,關於 Service Mesh,由於是很新的概念(去年年末才火起來),相關的框架並未真正用於生產環境,因此這邊就不考慮了,但之後可能會發展的很是好。