我們先從 Nginx 說起,了解為什么需要微服務笔横。最初的服務化解決方案是給相同服務提供一個統(tǒng)一的域名约计,然后服務調用者向這個域發(fā)送 HTTP 請求,由 Nginx 負責請求的分發(fā)和跳轉木张。
這種架構存在很多問題:Nginx 作為中間層众辨,在配置文件中耦合了服務調用的邏輯,這削弱了微服務的完整性窟哺,也使得 Nginx 在一定程度上變成了一個重量級的 ESB泻轰。圖 1 標識出了 Nginx 的轉發(fā)信息流走向。
服務的信息分散在各個系統(tǒng)且轨,無法統(tǒng)一管理和維護浮声。每一次的服務調用都是一次嘗試,服務消費方并不知道有哪些實例在給他們提供服務旋奢。這帶來了一些問題:
- 無法直觀地看到服務提供方和服務消費方當前的運行狀況與通信頻率泳挥;
- 消費方的失敗重發(fā)、負載均衡等都沒有統(tǒng)一策略至朗,這加大了開發(fā)每個服務的難度屉符,不利于快速演化。
為了解決上面的問題,我們需要一個現成的中心組件對服務進行整合矗钟,將每個服務的信息匯總唆香,包括服務的組件名稱、地址吨艇、數量等躬它。
服務的調用方在請求某項服務時首先通過中心組件獲取提供服務的實例信息(IP、端口等)东涡,再通過默認或自定義的策略選擇該服務的某一提供方直接進行訪問冯吓,所以考慮引入 Dubbo。
Dubbo 是阿里開源的一個 SOA 服務治理解決方案疮跑,文檔豐富组贺,在國內的使用度非常高。圖 2 為 Dubbo 的基本架構圖祖娘,使用 Dubbo 構建的微服務已經可以較好地解決上面提到的問題失尖。
從圖 2 中,可以看出以下幾點:
- 調用中間層變成了可選組件贿条,消費方可以直接訪問服務提供方雹仿;
- 服務信息被集中到 Registry 中,形成了服務治理的中心組件整以;
- 通過 Monitor 監(jiān)控系統(tǒng)胧辽,可以直觀地展示服務調用的統(tǒng)計信息;
- 服務消費者可以進行負載均衡公黑、服務降級的選擇邑商。
但是對于微服務架構而言,Dubbo 并不是十全十美的凡蚜,也有一些缺陷人断,比如:
- Registry 嚴重依賴第三方組件(ZooKeeper 或者 Redis),當這些組件出現問題時朝蜘,服務調用很快就會中斷恶迈。
- Dubbo 只支持 RPC 調用。這使得服務提供方與調用方在代碼上產生了強依賴谱醇,服務提供方需要不斷將包含公共代碼的 Jar 包打包出來供消費方使用暇仲。一旦打包出現問題,就會導致服務調用出錯副渴。
筆者認為奈附,Dubbo 和 Spring Cloud 并不是完全的競爭關系,兩者所解決的問題域并不一樣煮剧。
Dubbo 的定位始終是一款 RPC 框架斥滤,而 Spring Cloud 的目標是微服務架構下的一站式解決方案将鸵。如果非要比較的話,Dubbo 可以類比到 Netflix OSS 技術棧佑颇,而 Spring Cloud 集成了 Netflix OSS 作為分布式服務治理解決方案顶掉,但除此之外 Spring Cloud 還提供了配置、消息漩符、安全一喘、調用鏈跟蹤等分布式問題解決方案。
當前由于 RPC 協(xié)議嗜暴、注冊中心元數據不匹配等問題,在面臨微服務基礎框架選型時 Dubbo 與 Spring Cloud 只能二選一议蟆,這也是大家總是拿 Dubbo 和 Spring Cloud 做對比的原因之一闷沥。
Dubbo 已經適配到 Spring Cloud 生態(tài),比如作為 Spring Cloud 的二進制通信方案來發(fā)揮 Dubbo 的性能優(yōu)勢咐容,Dubbo 通過模塊化以及對 HTTP 的支持適配到 Spring Cloud舆逃。
Spring Cloud 好在哪里
作為新一代的服務框架,Spring Cloud 提出的口號是開發(fā)“面向云的應用程序”戳粒,它為微服務架構提供了更加全面的技術支持路狮。結合我們一開始提到的微服務的訴求,參見表 1蔚约,把Spring Cloud 與 Dubbo 進行一番對比奄妨。
Spring Cloud 拋棄了 Dubbo 的 RPC 通信,采用的是基于 HTTP 的 REST 方式苹祟。嚴格來說砸抛,這兩種方式各有優(yōu)劣。雖然從一定程度上來說树枫,后者犧牲了服務調用的性能直焙,但也避免了上面提到的原生 RPC 帶來的問題。而且 REST 相比 RPC 更為靈活砂轻,服務提供方和調用方奔誓,不存在代碼級別的強依賴,這在強調快速演化的微服務環(huán)境下顯得更加合適搔涝。
很明顯厨喂,Spring Cloud 的功能比 Dubbo 更加強大,涵蓋面更廣体谒,而且作為 Spring 的拳頭項目杯聚,它也能夠與 Spring Framework、Spring Boot抒痒、Spring Data幌绍、Spring Batch 等其他 Spring 項目完美融合,這些對于微服務而言是至關重要的。
前面提到傀广,微服務背后一個重要的理念就是持續(xù)集成颁独、快速交付伪冰,而在服務內部使用一個統(tǒng)一的技術框架,顯然比將分散的技術組合到一起更有效率贮聂。
更重要的是,相比于 Dubbo吓懈,它是一個正在持續(xù)維護的歼冰、社區(qū)更加火熱的開源項目耻警,這就可以保證使用它構建的系統(tǒng)持續(xù)地得到開源力量的支持。
下面列舉 Spring Cloud 的幾個優(yōu)勢甘穿。
- Spring Cloud 來源于 Spring,質量温兼、穩(wěn)定性秸滴、持續(xù)性都可以得到保證妨托。
- Spirng Cloud 天然支持 Spring Boot,更加便于業(yè)務落地兰伤。
- Spring Cloud 發(fā)展得非常快敦腔,從開始接觸時的相關組件版本為 1.x,到現在將要發(fā)布 2.x 系列符衔。
- Spring Cloud 是 java領域最適合做微服務的框架找前。