瞭解爲何須要微服務。最初的服務化解決方案是給相同服務提供一個統一的域名,而後服務調用者向這個域發送 HTTP 請求,由 Nginx 負責請求的分發和跳轉。
這種架構存在不少問題:Nginx 做爲中間層,在配置文件中耦合了服務調用的邏輯,這削弱了微服務的完整性,也使得 Nginx 在必定程度上變成了一個重量級的 ESB。圖 1 標識出了 Nginx 的轉發信息流走向。spring
圖 1 Nginx 轉發的信息流安全
服務的信息分散在各個系統,沒法統一管理和維護。每一次的服務調用都是一次嘗試,服務消費方並不知道有哪些實例在給他們提供服務。這帶來了一些問題:架構
爲了解決上面的問題,咱們須要一個現成的中心組件對服務進行整合,將每一個服務的信息彙總,包括服務的組件名稱、地址、數量等。
服務的調用方在請求某項服務時首先經過中心組件獲取提供服務的實例信息(IP、端口等),再經過默認或自定義的策略選擇該服務的某一提供方直接進行訪問,因此考慮引入 Dubbo。
Dubbo 是阿里開源的一個 SOA 服務治理解決方案,文檔豐富,在國內的使用度很是高。圖 2 爲 Dubbo 的基本架構圖,使用 Dubbo 構建的微服務已經能夠較好地解決上面提到的問題。負載均衡
圖 2 Dubbo 的基本架構圖框架
從圖 2 中,能夠看出如下幾點:分佈式
可是對於微服務架構而言,Dubbo 並非十全十美的,也有一些缺陷,好比:ide
筆者認爲,Dubbo 和 SpringCloud並非徹底的競爭關係,二者所解決的問題域並不同。
Dubbo 的定位始終是一款 RPC 框架,而 Spring Cloud 的目標是微服務架構下的一站式解決方案。若是非要比較的話,Dubbo 能夠類比到 Netflix OSS 技術棧,而 Spring Cloud 集成了 Netflix OSS 做爲分佈式服務治理解決方案,但除此以外 Spring Cloud 還提供了配置、消息、安全、調用鏈跟蹤等分佈式問題解決方案。
當前因爲 RPC 協議、註冊中心元數據不匹配等問題,在面臨微服務基礎框架選型時 Dubbo 與 Spring Cloud 只能二選一,這也是你們老是拿 Dubbo 和 Spring Cloud 作對比的緣由之一。
Dubbo 已經適配到 Spring Cloud 生態,好比做爲 Spring Cloud 的二進制通訊方案來發揮 Dubbo 的性能優點,Dubbo 經過模塊化以及對 HTTP 的支持適配到 Spring Cloud。模塊化
做爲新一代的服務框架,Spring Cloud 提出的口號是開發「面向雲的應用程序」,它爲微服務架構提供了更加全面的技術支持。結合咱們一開始提到的微服務的訴求,參見表 1,把Spring Cloud 與 Dubbo 進行一番對比。微服務
表 1 Spring Cloud與Dubbo功能對比性能
Spring Cloud 拋棄了 Dubbo 的 RPC 通訊,採用的是基於 HTTP 的 REST 方式。嚴格來講,這兩種方式各有優劣。雖然從必定程度上來講,後者犧牲了服務調用的性能,但也避免了上面提到的原生 RPC 帶來的問題。並且 REST 相比 RPC 更爲靈活,服務提供方和調用方,不存在代碼級別的強依賴,這在強調快速演化的微服務環境下顯得更加合適。
很明顯,Spring Cloud 的功能比 Dubbo 更增強大,涵蓋面更廣,並且做爲 Spring 的拳頭項目,它也可以與 Spring Framework、Spring Boot、Spring Data、Spring Batch 等其餘 Spring 項目完美融合,這些對於微服務而言是相當重要的。
前面提到,微服務背後一個重要的理念就是持續集成、快速交付,而在服務內部使用一個統一的技術框架,顯然比將分散的技術組合到一塊兒更有效率。
更重要的是,相比於 Dubbo,它是一個正在持續維護的、社區更加火熱的開源項目,這就能夠保證使用它構建的系統持續地獲得開源力量的支持。
下面列舉 Spring Cloud 的幾個優點。
相比於其餘框架,Spring Cloud 對微服務周邊環境的支持力度最大。對於中小企業來說,使用門檻較低。