Spring Cloud技術分析之Dubbo與Cloud的對比
現如今微服務架構十分流行,而採用微服務構建系統也會帶來更清晰的業務劃分和可擴充套件性。同時,支援微服務的技術棧也是多種多樣的,本系列文章主要介紹這些技術中的翹楚——Spring Cloud。這是序篇,主要講述我們為什麼選擇Spring Cloud和它的技術概覽。
1 為什麼微服務架構需要Spring Cloud
簡單來說,服務化的核心就是將傳統的一站式應用根據業務拆分成一個一個的服務,而微服務在這個基礎上要更徹底地去耦合(不再共享DB、KV,去掉重量級ESB),並且強調DevOps和快速演化。這就要求我們必須採用與一站式時代、泛SOA時代不同的技術棧,而Spring Cloud就是其中的佼佼者。
DevOps是英文Development和Operations的合體,他要求開發、測試、運維進行一體化的合作,進行更小、更頻繁、更自動化的應用釋出,以及圍繞應用架構來構建基礎設施的架構。這就要求應用充分的內聚,也方便運維和管理。這個理念與微服務理念不謀而合。
接下來我們從服務化架構演進的角度來看看為什麼Spring Cloud更適應微服務架構。
2 從使用nginx說起
最初的服務化解決方案是給提供相同服務提供一個統一的域名,然後服務呼叫者向這個域名傳送HTTP請求,由Nginx負責請求的分發和跳轉。
這種架構存在很多問題:
-
Nginx作為中間層,在配置檔案中耦合了服務呼叫的邏輯,這削弱了微服務的完整性,也使得Nginx在一定程度上變成了一個重量級的ESB。
-
服務的資訊分散在各個系統,無法統一管理和維護。每一次的服務呼叫都是一次嘗試,服務消費者並不知道有哪些例項在給他們提供服務。這不符合DevOps的理念。
-
無法直觀的看到服務提供者和服務消費者當前的執行狀況和通訊頻率。這也不符合DevOps的理念。
-
消費者的失敗重發,負載均衡等都沒有統一策略,這加大了開發每個服務的難度,不利於快速演化。
為了解決上面的問題,我們需要一個現成的中心元件對服務進行整合,將每個服務的資訊彙總,包括服務的元件名稱、地址、數量等。服務的呼叫方在請求某項服務時首先通過中心元件獲取提供這項服務的例項的資訊(IP、埠等),再通過預設或自定義的策略選擇該服務的某一提供者直接進行訪問。所以,我們引入了Dubbo。
3 基於Dubbo實現微服務
Dubbo是阿里開源的一個SOA服務治理解決方案,文件豐富,在國內的使用度非常高。
使用Dubbo構建的微服務,已經可以比較好地解決上面提到的問題:
-
呼叫中間層變成了可選元件,消費者可以直接訪問服務提供者。
-
服務資訊被集中到Registry中,形成了服務治理的中心元件。
-
通過Monitor監控系統,可以直觀地展示服務呼叫的統計資訊。
-
Consumer可以進行負載均衡、服務降級的選擇。
但是對於微服務架構而言,Dubbo也並不是十全十美的:
-
Registry嚴重依賴第三方元件(zookeeper或者redis),當這些元件出現問題時,服務呼叫很快就會中斷。
-
DUBBO只支援RPC呼叫。使得服務提供方與呼叫方在程式碼上產生了強依賴,服務提供者需要不斷將包含公共程式碼的jar包打包出來供消費者使用。一旦打包出現問題,就會導致服務調用出錯。
4 新的選擇——Spring Cloud
作為新一代的服務框架,Spring Cloud提出的口號是開發“面向雲環境的應用程式”,它為微服務架構提供了更加全面的技術支援。
結合我們一開始提到的微服務的訴求,我們把Spring Cloud與DUBBO進行一番對比:
微服務需要的功能 | Dubbo | Spring Cloud |
服務註冊和發現 | Zookeeper | Eureka |
服務呼叫方式 | RPC | RESTful API |
斷路器 | 有 | 有 |
負載均衡 | 有 | 有 |
服務路由和過濾 | 有 | 有 |
分散式配置 | 無 | 有 |
分散式鎖 | 無 | 計劃開發 |
叢集選主 | 無 | 有 |
分散式訊息 | 無 | 有 |
Spring Cloud拋棄了Dubbo的RPC通訊,採用的是基於HTTP的REST方式。嚴格來說,這兩種方式各有優劣。雖然從一定程度上來說,後者犧牲了服務呼叫的效能,但也避免了上面提到的原生RPC帶來的問題。而且REST相比RPC更為靈活,服務提供方和呼叫方的依賴只依靠一紙契約,不存在程式碼級別的強依賴,這在強調快速演化的微服務環境下,顯得更加合適。
Eureka相比於zookeeper,更加適合於服務發現的場景,這點會在下一篇會詳細展開。
很明顯,Spring Cloud的功能比DUBBO更加強大,涵蓋面更廣,而且作為Spring的拳頭專案,它也能夠與Spring Framework、Spring Boot、Spring Data、Spring Batch等其他Spring專案完美融合,這些對於微服務而言是至關重要的。前面提到,微服務背後一個重要的理念就是持續整合、快速交付,而在服務內部使用一個統一的技術框架,顯然比把分散的技術組合到一起更有效率。更重要的是,相比於Dubbo,它是一個正在持續維護的、社群更加火熱的開源專案,這就保證使用它構建的系統,可以持續地得到開源力量的支援。
5 Spring Cloud技術概覽
下圖展示了Spring Cloud的完整技術組成:
-
服務治理:這是Spring Cloud的核心。目前Spring Cloud主要通過整合Netflix的相關產品來實現這方面的功能(Spring Cloud Netflix),包括用於服務註冊和發現的Eureka,呼叫斷路器Hystrix,呼叫端負載均衡Ribbon,Rest客戶端Feign,智慧服務路由Zuul,用於監控資料收集和展示的Spectator、Servo、Atlas,用於配置讀取的Archaius和提供Controller層Reactive封裝的RxJava。除此之外,針對Feign和RxJava並不是Netiflix的產品,但是被整合到了Spring Cloud Netflix中。
對於服務的註冊和發現,除了Eureka,Spring Cloud也整合了Consul和Zookeeper作為備選,但是因為這兩個方案在CAP理論上都遵循CP而不是AP(下一篇會詳細介紹這點),所以官方並沒有推薦使用。
-
分散式鏈路監控:Spring Cloud Sleuth提供了全自動、可配置的資料埋點,以收集微服務呼叫鏈路上的效能資料,併發送給Zipkin進行儲存、統計和展示。
-
訊息元件:Spring Cloud Stream對於分散式訊息的各種需求進行了抽象,包括髮布訂閱、分組消費、訊息分片等功能,實現了微服務之間的非同步通訊。Spring Cloud Stream也集成了第三方的RabbitMQ和Apache Kafka作為訊息佇列的實現。而Spring Cloud Bus基於Spring Cloud Stream,主要提供了服務間的事件通訊(比如重新整理配置)。
-
配置中心:基於Spring Cloud Netflix和Spring Cloud Bus,Spring又提供了Spring Cloud Config,實現了配置集中管理、動態重新整理的配置中心概念。配置通過Git或者簡單檔案來儲存,支援加解密。
-
安全控制:Spring Cloud Security基於OAUTH2這個開放網路的安全標準,提供了微服務環境下的單點登入、資源授權、令牌管理等功能。
-
命令列工具:Spring Cloud Cli提供了以命令列和指令碼的方式來管理微服務及Spring Cloud元件的方式。
-
叢集工具:Spring Cloud Cluster提供了叢集選主、分散式鎖(暫未實現)、一次性令牌(暫未實現)等分散式叢集需要的技術元件。
後續章節我們會詳細介紹我們實際使用到的Spring Cloud元件。
作者:網易樂得技術團隊
連結:http://tech.lede.com/2017/03/15/rd/server/SpringCloud0/