Dubbo和Spring Cloud微服務架構對比

微服務架構是互聯網很熱門的話題,是互聯網技術發展的必然結果。它提倡將單一應用程序劃分成一組小的服務,服務之間互相協調、互相配合,為用戶提供最終價值。

目錄

微服務主要的優勢

降低復雜度

可獨立部署

容錯

擴展

核心部件

總體架構

Dubbo 核心部件

Spring Cloud總體架構

微服務架構核心要素

通訊協議

支持協議

Dubbo

Spring Cloud

性能比較

服務依賴方式

Dubbo

Spring Cloud

組件運行流程

Dubbo

Spring Cloud

微服務架構組成以及注意事項

架構分解

注意事項

總結


雖然微服務架構沒有公認的技術標準和規范或者草案,但業界已經有一些很有影響力的開源微服務架構框架提供了微服務的關鍵思路,例如 Dubbo 和 Spring Cloud。

各大互聯網公司也有自研的微服務框架,但其模式都與這二者相差不大。

微服務主要的優勢

降低復雜度

將原來耦合在一起的復雜業務拆分為單個服務,規避了原本復雜度無止境的積累。

每一個微服務專注于單一功能,并通過定義良好的接口清晰表述服務邊界;每個服務開發者只專注服務本身,通過使用緩存、DAL 等各種技術手段來提升系統的性能,而對于消費方來說完全透明。

可獨立部署

由于微服務具備獨立的運行進程,所以每個微服務可以獨立部署。當業務迭代時只需要發布相關服務的迭代即可,降低了測試的工作量同時也降低了服務發布的風險。

容錯

在微服務架構下,當某一組件發生故障時,故障會被隔離在單個服務中。比如通過限流、熔斷等方式降低錯誤導致的危害,保障核心業務正常運行。

擴展

單塊架構應用也可以實現橫向擴展,就是將整個應用完整的復制到不同的節點。

當應用的不同組件在擴展需求上存在差異時,微服務架構便體現出其靈活性,因為每個服務可以根據實際需求獨立進行擴展。

本文主要圍繞微服務的技術選型、通訊協議、服務依賴模式、開始模式、運行模式等幾方面來綜合比較 Dubbo 和 Spring Cloud 這 2 種開發框架。

架構師可以根據公司的技術實力并結合項目的特點來選擇某個合適的微服務架構平臺,以此穩妥地實施項目的微服務化改造或開發進程。

?

核心部件

微服務的核心要素在于服務的發現、注冊、路由、熔斷、降級、分布式配置,基于上述幾種必要條件對 Dubbo 和 Spring Cloud 做出對比。

總體架構

Dubbo 核心部件:

  • Provider:暴露服務的提供方,可以通過 jar 或者容器的方式啟動服務。

  • Consumer:調用遠程服務的服務消費方。

  • Registry:服務注冊中心和發現中心。

  • Monitor:統計服務和調用次數,調用時間監控中心。(Dubbo 的控制臺頁面中可以顯示,目前只有一個簡單版本。)

  • Container:服務運行的容器。


Dubbo 總體架構

Spring Cloud總體架構:

  • Service Provider:?暴露服務的提供方。

  • Service Consumer:調用遠程服務的服務消費方。

  • EureKa Server:?服務注冊中心和服務發現中心。

Spring Cloud 總體架構

點評:從整體架構上來看,二者模式接近,都需要服務提供方,注冊中心,服務消費方。

微服務架構核心要素

Dubbo 只是實現了服務治理,而 Spring Cloud 子項目分別覆蓋了微服務架構下的眾多部件,服務治理只是其中的一個方面。

Dubbo 提供了各種 Filter,對于上述中“無”的要素,可以通過擴展 Filter 來完善。例如:

  • 分布式配置:可以使用淘寶的 diamond、百度的 disconf 來實現分布式配置管理。

  • 服務跟蹤:可以使用京東開源的 Hydra,或者擴展 Filter 用 Zippin 來做服務跟蹤。

  • 批量任務:可以使用當當開源的 Elastic-Job、tbschedule。

點評:從核心要素來看,Spring Cloud 更勝一籌,在開發過程中只要整合 Spring Cloud 的子項目就可以順利的完成各種組件的融合,而 Dubbo 卻需要通過實現各種 Filter 來做定制,開發成本以及技術難度略高。

通訊協議

基于通訊協議層面對 2 種框架支持的協議類型以及運行效率方面進行比較。

支持協議

Dubbo

Dubbo 使用 RPC 通訊協議,提供序列化方式如下:

  • Dubbo:Dubbo 缺省協議采用單一長連接和 NIO 異步通訊,適合于小數據量大并發的服務調用,以及服務消費者機器數遠大于服務提供者機器數的情況。

  • RMI:RMI 協議采用 JDK 標準的 java.rmi.* 實現,采用阻塞式短連接和 JDK 標準序列化方式。

  • Hessian:Hessian 協議用于集成 Hessian 的服務,Hessian 底層采用 HTTP 通訊,采用 Servlet 暴露服務,Dubbo 缺省內嵌 Jetty 作為服務器實現。

  • HTTP:采用 Spring 的 Http Invoker 實現。

  • Webservice:基于 CXF 的 frontend-simple 和 transports-http 實現。

Spring Cloud

Spring Cloud 使用 HTTP 協議的 REST API。

性能比較

使用一個 Pojo 對象包含 10 個屬性,請求 10 萬次,Dubbo 和 Spring Cloud 在不同的線程數量下,每次請求耗時(ms)如下:

說明:客戶端和服務端配置均采用阿里云的 ECS 服務器,4 核 8G 配置,Dubbo 采用默認的 Dubbo 協議。

點評:Dubbo 支持各種通信協議,而且消費方和服務方使用長鏈接方式交互,通信速度上略勝 Spring Cloud,如果對于系統的響應時間有嚴格要求,長鏈接更合適。

服務依賴方式

Dubbo

服務提供方與消費方通過接口的方式依賴,服務調用設計如下:

  • Interface 層:服務接口層,定義了服務對外提供的所有接口。

  • Molel 層:服務的 DTO 對象層。

  • Business層:業務實現層,實現 Interface 接口并且和 DB 交互。

因此需要為每個微服務定義各自的 Interface 接口,并通過持續集成發布到私有倉庫中。調用方應用對微服務提供的抽象接口存在強依賴關系,開發、測試、集成環境都需要嚴格的管理版本依賴。

通過 maven 的 install & deploy 命令把 Interface 和 Model 層發布到倉庫中,服務調用方只需要依賴 Interface 和 Model 層即可。

在開發調試階段只發布 Snapshot 版本,等到服務調試完成再發布 Release 版本,通過版本號來區分每次迭代的版本。通過 xml 配置方式即可接入 Dubbo,對程序無入侵。

Dubbo 接口依賴方式

Spring Cloud

服務提供方和服務消費方通過 Json 方式交互,因此只需要定義好相關 Json 字段即可,消費方和提供方無接口依賴。通過注解方式來實現服務配置,對于程序有一定入侵。

點評:Dubbo 服務依賴略重,需要有完善的版本管理機制,但是程序入侵少。

而 Spring Cloud 通過 Json 交互,省略了版本管理的問題,但是具體字段含義需要統一管理,自身 Rest API 方式交互,為跨平臺調用奠定了基礎。

組件運行流程

Dubbo

下圖中的每個組件都是需要部署在單獨的服務器上,Gateway 用來接受前端請求、聚合服務,并批量調用后臺原子服務。每個 Service 層和單獨的 DB 交互。

Dubbo 組件運行流程

Dubbo 組件運行

  • Gateway:前置網關,具體業務操作,Gateway 通過 Dubbo 提供的負載均衡機制自動完成。

  • Service:原子服務,只提供該業務相關的原子服務。

  • Zookeeper:原子服務注冊到 ZK 上。

Spring Cloud 組件運行

Spring Cloud

Spring Cloud組件運行

  • 所有請求都統一通過 API 網關(Zuul)來訪問內部服務。

  • 網關接收到請求后,從注冊中心(Eureka)獲取可用服務。

  • 由 Ribbon 進行均衡負載后,分發到后端的具體實例。

  • 微服務之間通過 Feign 進行通信處理業務。

點評:業務部署方式相同,都需要前置一個網關來隔絕外部直接調用原子服務的風險。

Dubbo 需要自己開發一套 API 網關,而 Spring Cloud 則可以通過 Zuul 配置即可完成網關定制。使用方式上 Spring Cloud 略勝一籌。

微服務架構組成以及注意事項

到底使用是 Dubbo 還是 Spring Cloud 并不重要,重點在于如何合理的利用微服務。

下面是一張互聯網通用的架構圖,其中每個環節都是微服務的核心部分。

架構分解

  • 網關集群:數據的聚合、實現對接入客戶端的身份認證、防報文重放與防數據篡改、功能調用的業務鑒權、響應數據的脫敏、流量與并發控制等。

  • 業務集群:一般情況下移動端訪問和瀏覽器訪問的網關需要隔離,防止業務耦合。

  • Local Cache:由于客戶端訪問業務可能需要調用多個服務聚合,所以本地緩存有效的降低了服務調用的頻次,同時也提示了訪問速度。本地緩存一般使用自動過期方式,業務場景中允許有一定的數據延時。

  • 服務層:原子服務層,實現基礎的增刪改查功能,如果需要依賴其他服務需要在 Service 層主動調用。

  • Remote Cache:訪問 DB 前置一層分布式緩存,減少 DB 交互次數,提升系統的TPS。

  • DAL:數據訪問層,如果單表數據量過大則需要通過 DAL 層做數據的分庫分表處理。

  • MQ:消息隊列用來解耦服務之間的依賴,異步調用可以通過 MQ 的方式來執行。

  • 數據庫主從:服務化過程中必經的階段,用來提升系統的 TPS。

注意事項

  • 服務啟動方式建議使用jar方式啟動,啟動速度快,更容易監控。

  • 緩存、緩存、緩存,系統中能使用緩存的地方盡量使用緩存,通過合理的使用緩存可以有效的提高系統的TPS。

  • 服務拆分要合理,盡量避免因服務拆分而導致的服務循環依賴。

  • 合理的設置線程池,避免設置過大或者過小導致系統異常。

總結

Dubbo 出生于阿里系,是阿里巴巴服務化治理的核心框架,并被廣泛應用于中國各互聯網公司;只需要通過 Spring 配置的方式即可完成服務化,對于應用無入侵,設計的目的還是服務于自身的業務為主。

雖然阿里內部原因 Dubbo 曾經一度暫停維護版本,但是框架本身的成熟度以及文檔的完善程度,完全能滿足各大互聯網公司的業務需求。

如果我們使用配置中心、分布式跟蹤這些內容都需要自己去集成,這樣無形中增加了使用 Dubbo 的難度。

Spring Cloud 是大名鼎鼎的 Spring 家族的產品, 專注于企業級開源框架的研發。

Spring Cloud 自從發布到現在,仍然在不斷的高速發展,幾乎考慮了服務治理的方方面面,開發起來非常的便利和簡單。

Dubbo 于 2017 年開始又重啟維護,發布了更新后的 2.5.7 版本,而 Spring Cloud 更新的非常快,目前已經更新到 Finchley.M2。

因此,企業需要根據自身的研發水平和所處階段選擇合適的架構來解決業務問題,不管是 Dubbo 還是 Spring Cloud 都是實現微服務有效的工具。

微服務架構是互聯網很熱門的話題,是互聯網技術發展的必然結果。它提倡將單一應用程序劃分成一組小的服務,服務之間互相協調、互相配合,為用戶提供最終價值。


---------------------
作者:豆奶快攻
來源:CSDN
原文:https://blog.csdn.net/zhangweiwei2020/article/details/78646252
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!
內容解析By:CSDN,CNBLOG博客文章一鍵轉載插件

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284016.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284016.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284016.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《ABP Framework 極速開發》 - 教程首發

?寫在發布之前強烈建議每一位小伙伴都應該好好看看 ABP Framework 官方文檔,可能有很多的小伙伴跟我剛開始的感覺一樣“一看文檔深似海”,看完文檔之后,想要上手卻找不著頭緒。本套教程寫作的目的之一是為初學者提供一條相對簡潔的快速上手路…

智能家居系統結構標準化

版權申明:本文為博主窗戶(Colin Cai)原創,歡迎轉帖。如要轉貼,必須注明原文網址http://www.cnblogs.com/Colin-Cai/p/8490423.html作者:窗戶QQ:6679072E-mail:6679072qq.com0 引 言 智能家居是指利用先進的…

洛谷 P3391 文藝平衡樹

題目描述 您需要寫一種數據結構(可參考題目標題),來維護一個有序數列,其中需要提供以下操作:翻轉一個區間,例如原有序序列是5 4 3 2 1,翻轉區間是[2,4]的話,結果是5 2 3 4 1 --by洛谷…

JSONObject中optString和getString等的區別

2019獨角獸企業重金招聘Python工程師標準>>> 同事在看到我寫的解析數據代碼后,告訴我optString比getString好用,optString不會拋異常,而getString會拋異常,自己是將信將疑,就說,回去后我查查資料…

Lombok插件安裝(IDEA)、配置jar包、使用

點擊進入Lombok官網下載Lombok jar包 使用Lombok可能需要注意的地方 (1)當你的IDE是Idea時,要注意你的Idea是支持Lombok的,如果不支持請更換高版本嘗試(這里采用2018 3.3)。 (2)在使…

Blazor University (40)JavaScript 互操作 —— 傳遞 HTML 元素引用

原文鏈接:https://blazor-university.com/javascript-interop/calling-javascript-from-dotnet/passing-html-element-references/傳遞 HTML 元素引用源代碼[1]在編寫 Blazor 應用程序時,不鼓勵對文檔對象模型 (DOM) 進行操作,因為它可能會干…

RabbitMQ+PHP 教程六(RPC)

(using php-amqplib) 前提必讀 本教程假設RabbitMQ是安裝在標準端口上運行(5672)。如果您使用不同的主機、端口或憑據,則連接設置需要調整。 如果您在本教程中遇到困難,可以通過郵件列表與我們聯系。 開始 在第二個教程中&#xf…

TKMybatis 介紹和使用

目錄 一、什么是 TKMybatis 二、TKMybatis 使用 2.1 Springboot 項目中加入依賴 2.2 使用講解 2.2.1 實體類中使用 2.2.2 dao中使用 2.2.3 Service 層中使用 2.3 實際案例 2.3.1 dao 層使用 2.3.2 service 層使用 一、什么是 TKMybatis TKMybatis 是基于 Mybatis 框…

angularjs的ng-repeat回調

首先html代碼是這樣的&#xff1a; <label>Name des Leiters:</label><select name"leaderID" id"selectLeaderID"><option ng-repeat"manager in managers" value"leader_id{{manager.id}}&leader_name{{manager…

sed和vim練習

1、刪除/etc/grub2.conf文件中所有以空白開頭的行行首的空白字符sed s^[[:space:]]\ /etc/grub2.conf2、刪除/etc/fstab文件中所有以#開頭&#xff0c;后面至少跟一個空白字符的行的行首的#和空白字符sed -n s^#[[:space:]]\p /etc/fstab3、在/root/install.log每一行行首增加#…

WinForm(三)揭開可視化控件的面紗

WinForm所見即所得的UI設計框架&#xff0c;開發效率確實有所提升&#xff0c;同時降低了編程門檻&#xff0c;讓WinForm更普及。拖拖拽拽就能設計出一個界面&#xff0c;那么我們拖拽的這些東西是什么&#xff1f;它們是什么原理&#xff1f;。WinForm我覺得很好的一點是&…

淺談 maxMemory , totalMemory , freeMemory 和 OOM 與 native Heap

作者&#xff1a;林冠宏 / 指尖下的幽靈 掘金&#xff1a;https://juejin.im/user/587f0dfe128fe100570ce2d8 博客&#xff1a;http://www.cnblogs.com/linguanh/ GitHub &#xff1a; https://github.com/af913337456/ 騰訊云專欄&#xff1a; https://cloud.tencent.com/deve…

RestTemplate 詳解

在項目中&#xff0c;當我們需要遠程調用一個 HTTP 接口時&#xff0c;我們經常會用到 RestTemplate 這個類。這個類是 Spring 框架提供的一個工具類。Spring 官網對它的介紹如下&#xff1a; RestTemplate: The original Spring REST client with a synchronous, template met…

初識Spark2.0之Spark SQL

內存計算平臺Spark在今年6月份的時候正式發布了spark2.0&#xff0c;相比上一版本的spark1.6版本&#xff0c;在內存優化&#xff0c;數據組織&#xff0c;流計算等方面都做出了較大的改變&#xff0c;同時更加注重基于DataFrame數據組織的MLlib&#xff0c;更加注重機器學習整…

webpack開發Vue配置

一直以來使用webpack都是用的別人的配置&#xff0c;這幾天自己學習了一下。 項目地址&#xff1a;https://github.com/donghaohao... 新建整個工程 npm init安裝依賴&#xff0c;這里我們開發vue項目&#xff0c;npm install vue --save&#xff0c;然后是開發時的依賴npm ins…

ABP詳細教程——模塊類

概述模塊化是ABP vNext的最大亮點&#xff0c;也是ABP vNext框架的核心&#xff0c;而模塊類是ABP vNext框架模塊化的核心要素。這一章節&#xff0c;我就從模塊類的用法、運行機制、源代碼等層面&#xff0c;帶大家詳細了解ABP vNext的模塊類。用法在ABP的約定中&#xff0c;每…

[轉]Eureka工作原理

目錄 Eureka 工作原理 Eureka 核心概念 自我保護機制 Eureka 集群原理 Eurka 工作流程 總結 Eureka 工作原理 上節內容為大家介紹了&#xff0c;注冊中心 Eureka 產品的使用&#xff0c;以及如何利用 Eureka 搭建單臺和集群的注冊中心。這節課我們來繼續學習 Eureka&…

centos7下別名(alias)的特殊用法

版權聲明&#xff1a;轉載請注明出處:http://blog.csdn.net/dajitui2024 https://blog.csdn.net/dajitui2024/article/details/79438200 參考&#xff1a;https://www.cyberciti.biz/faq/bash-bypass-alias-command-on-linux-macos-unix/ 正常情況下&#xff0c;定義過的別名&a…

解決WDCP3環境gbk網站編碼程序亂碼問題

因為默認WDCP V3版本環境編碼格式是UTF-8版本&#xff0c;如果我們程序采用的是GBK編碼肯定都會有亂碼問題。 我們到WDCP后臺&#xff0c;"網站管理"-"PHP設置"&#xff0c;看到上圖所示&#xff0c;準備直接在線編輯PHP.INI文件。 這里我們找到"defa…

重談聯想5G編碼投票事件

此前&#xff0c;司馬南談了聯想好幾個問題&#xff0c;其中最尖銳的要屬國有資產流失&#xff0c;這是聯想管理層無法回避的死穴。不過&#xff0c;司馬南批判聯想5G投票背刺H公司&#xff0c;這基本就是造謠了。當年&#xff0c;媒體把編碼投票炒作的很厲害&#xff0c;抨擊聯…