微服務(wù)架構(gòu)是互聯(lián)網(wǎng)很熱門(mén)的話題,是互聯(lián)網(wǎng)技術(shù)發(fā)展的必然結(jié)果扎即。它提倡將單一應(yīng)用程序劃分成一組小的服務(wù)鬓梅,服務(wù)之間互相協(xié)調(diào)供置、互相配合,為用戶提供最終價(jià)值绽快。雖然微服務(wù)架構(gòu)沒(méi)有公認(rèn)的技術(shù)標(biāo)準(zhǔn)和規(guī)范或者草案芥丧,但業(yè)界已經(jīng)有一些很有影響力的開(kāi)源微服務(wù)架構(gòu)框架提供了微服務(wù)的關(guān)鍵思路,例如Dubbo和Spring Cloud坊罢。各大互聯(lián)網(wǎng)公司也有自研的微服務(wù)框架续担,但其模式都于這二者相差不大。
微服務(wù)主要的優(yōu)勢(shì)如下:
1活孩、降低復(fù)雜度
將原來(lái)偶合在一起的復(fù)雜業(yè)務(wù)拆分為單個(gè)服務(wù)物遇,規(guī)避了原本復(fù)雜度無(wú)止境的積累。每一個(gè)微服務(wù)專注于單一功能憾儒,并通過(guò)定義良好的接口清晰表述服務(wù)邊界询兴。每個(gè)服務(wù)開(kāi)發(fā)者只專注服務(wù)本身,通過(guò)使用緩存航夺、DAL等各種技術(shù)手段來(lái)提升系統(tǒng)的性能蕉朵,而對(duì)于消費(fèi)方來(lái)說(shuō)完全透明。
2阳掐、可獨(dú)立部署
由于微服務(wù)具備獨(dú)立的運(yùn)行進(jìn)程始衅,所以每個(gè)微服務(wù)可以獨(dú)立部署。當(dāng)業(yè)務(wù)迭代時(shí)只需要發(fā)布相關(guān)服務(wù)的迭代即可缭保,降低了測(cè)試的工作量同時(shí)也降低了服務(wù)發(fā)布的風(fēng)險(xiǎn)汛闸。
3、容錯(cuò)
在微服務(wù)架構(gòu)下艺骂,當(dāng)某一組件發(fā)生故障時(shí)诸老,故障會(huì)被隔離在單個(gè)服務(wù)中。 通過(guò)限流钳恕、熔斷等方式降低錯(cuò)誤導(dǎo)致的危害别伏,保障核心業(yè)務(wù)正常運(yùn)行。
4忧额、擴(kuò)展
單塊架構(gòu)應(yīng)用也可以實(shí)現(xiàn)橫向擴(kuò)展厘肮,就是將整個(gè)應(yīng)用完整的復(fù)制到不同的節(jié)點(diǎn)。當(dāng)應(yīng)用的不同組件在擴(kuò)展需求上存在差異時(shí)睦番,微服務(wù)架構(gòu)便體現(xiàn)出其靈活性类茂,因?yàn)槊總€(gè)服務(wù)可以根據(jù)實(shí)際需求獨(dú)立進(jìn)行擴(kuò)展耍属。
本文主要圍繞微服務(wù)的技術(shù)選型、通訊協(xié)議巩检、服務(wù)依賴模式厚骗、開(kāi)始模式、運(yùn)行模式等幾方面來(lái)綜合比較Dubbo和Spring Cloud 這2種開(kāi)發(fā)框架兢哭。架構(gòu)師可以根據(jù)公司的技術(shù)實(shí)力并結(jié)合項(xiàng)目的特點(diǎn)來(lái)選擇某個(gè)合適的微服務(wù)架構(gòu)平臺(tái)领舰,以此穩(wěn)妥地實(shí)施項(xiàng)目的微服務(wù)化改造或開(kāi)發(fā)進(jìn)程。
給大家推薦一個(gè)程序員學(xué)習(xí)交流群:945622618厦瓢。群里有分享的視頻提揍,還有思維導(dǎo)圖
群公告有視頻啤月,都是干貨的,你可以下載來(lái)看。主要分享分布式架構(gòu)唱遭、高可擴(kuò)展算行、高性能、高并發(fā)郑诺、性能優(yōu)化夹姥、Spring boot、Redis辙诞、ActiveMQ辙售、Nginx、Mycat飞涂、Netty旦部、Jvm大型分布式項(xiàng)目實(shí)戰(zhàn)學(xué)習(xí)架構(gòu)師視頻。
一较店、核心部件
微服務(wù)的核心要素在于服務(wù)的發(fā)現(xiàn)士八、注冊(cè)、路由梁呈、熔斷婚度、降級(jí)、分布式配置官卡,基于上述幾種必要條件對(duì)Dubbo和Spring Cloud做出對(duì)比蝗茁。
1、總體架構(gòu)
Dubbo 核心部件(如下圖):
Provider: 暴露服務(wù)的提供方寻咒,可以通過(guò)jar或者容器的方式啟動(dòng)服務(wù)
Consumer:調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方哮翘。
Registry: 服務(wù)注冊(cè)中心和發(fā)現(xiàn)中心。
Monitor: 統(tǒng)計(jì)服務(wù)和調(diào)用次數(shù)仔涩,調(diào)用時(shí)間監(jiān)控中心忍坷。(dubbo的控制臺(tái)頁(yè)面中可以顯示,目前只有一個(gè)簡(jiǎn)單版本)
Container:服務(wù)運(yùn)行的容器。
▲Dubbo 總體架構(gòu)
Spring Cloud總體架構(gòu)如下圖
Service Provider: 暴露服務(wù)的提供方佩研。
Service Consumer:調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方柑肴。
EureKa Server: 服務(wù)注冊(cè)中心和服務(wù)發(fā)現(xiàn)中心。
▲Spring Cloud總體架構(gòu)
點(diǎn)評(píng):從整體架構(gòu)上來(lái)看旬薯,二者模式接近晰骑,都需要需要服務(wù)提供方,注冊(cè)中心绊序,服務(wù)消費(fèi)方硕舆。
2、微服務(wù)架構(gòu)核心要素
Dubbo只是實(shí)現(xiàn)了服務(wù)治理骤公,而Spring Cloud子項(xiàng)目分別覆蓋了微服務(wù)架構(gòu)下的眾多部件抚官,而服務(wù)治理只是其中的一個(gè)方面。Dubbo提供了各種Filter阶捆,對(duì)于上述中“無(wú)”的要素凌节,可以通過(guò)擴(kuò)展Filter來(lái)完善。
例如
1.分布式配置:可以使用淘寶的diamond洒试、百度的disconf來(lái)實(shí)現(xiàn)分布式配置管理
2.服務(wù)跟蹤:可以使用京東開(kāi)源的Hydra倍奢,或者擴(kuò)展Filter用Zippin來(lái)做服務(wù)跟蹤
3.批量任務(wù):可以使用當(dāng)當(dāng)開(kāi)源的Elastic-Job、tbschedule
點(diǎn)評(píng):從核心要素來(lái)看垒棋,Spring Cloud 更勝一籌卒煞,在開(kāi)發(fā)過(guò)程中只要整合Spring Cloud的子項(xiàng)目就可以順利的完成各種組件的融合,而Dubbo缺需要通過(guò)實(shí)現(xiàn)各種Filter來(lái)做定制叼架,開(kāi)發(fā)成本以及技術(shù)難度略高畔裕。
二、通訊協(xié)議
基于通訊協(xié)議層面對(duì)2種框架支持的協(xié)議類型以及運(yùn)行效率方面進(jìn)行比較碉碉;
(一)柴钻、支持協(xié)議
1、Dubbo:dubbo使用RPC通訊協(xié)議垢粮,提供序列化方式如下:
dubbo:Dubbo缺省協(xié)議采用單一長(zhǎng)連接和NIO異步通訊贴届,適合于小數(shù)據(jù)量大并發(fā)的服務(wù)調(diào)用,以及服務(wù)消費(fèi)者機(jī)器數(shù)遠(yuǎn)大于服務(wù)提供者機(jī)器數(shù)的情況
rmi:RMI協(xié)議采用JDK標(biāo)準(zhǔn)的java.rmi.*實(shí)現(xiàn)蜡吧,采用阻塞式短連接和JDK標(biāo)準(zhǔn)序列化方式
Hessian:Hessian協(xié)議用于集成Hessian的服務(wù)毫蚓,Hessian底層采用Http通訊,采用Servlet暴露服務(wù)昔善,Dubbo缺省內(nèi)嵌Jetty作為服務(wù)器實(shí)現(xiàn)
http:采用Spring的HttpInvoker實(shí)現(xiàn)
Webservice:基于CXF的frontend-simple和transports-http實(shí)現(xiàn)
2元潘、Spring Cloud:Spring Cloud 使用HTTP協(xié)議的REST API
(二)、性能比較
使用一個(gè)Pojo對(duì)象包含10個(gè)屬性君仆,請(qǐng)求10萬(wàn)次翩概,Dubbo和Spring Cloud在不同的線程數(shù)量下牲距,每次請(qǐng)求耗時(shí)(ms)如下:
說(shuō)明:客戶端和服務(wù)端配置均采用阿里云的ECS服務(wù)器,4核8G配置钥庇,dubbo采用默認(rèn)的dubbo協(xié)議
點(diǎn)評(píng):dubbo支持各種通信協(xié)議牍鞠,而且消費(fèi)方和服務(wù)方使用長(zhǎng)鏈接方式交互,通信速度上略勝Spring Cloud评姨,如果對(duì)于系統(tǒng)的響應(yīng)時(shí)間有嚴(yán)格要求难述,長(zhǎng)鏈接更合適。
三吐句、服務(wù)依賴方式
Dubbo:服務(wù)提供方與消費(fèi)方通過(guò)接口的方式依賴胁后,服務(wù)調(diào)用設(shè)計(jì)如下:
interface層:服務(wù)接口層,定義了服務(wù)對(duì)外提供的所有接口
Molel層:服務(wù)的DTO對(duì)象層嗦枢,
business層:業(yè)務(wù)實(shí)現(xiàn)層攀芯,實(shí)現(xiàn)interface接口并且和DB交互
因此需要為每個(gè)微服務(wù)定義了各自的interface接口,并通過(guò)持續(xù)集成發(fā)布到私有倉(cāng)庫(kù)中净宵,調(diào)用方應(yīng)用對(duì)微服務(wù)提供的抽象接口存在強(qiáng)依賴關(guān)系敲才,開(kāi)發(fā)裹纳、測(cè)試择葡、集成環(huán)境都需要嚴(yán)格的管理版本依賴。如果想免費(fèi)學(xué)習(xí)Java工程化剃氧、高性能及分布式敏储、深入淺出。微服務(wù)朋鞍、Spring已添,MyBatis,Netty源碼分析的朋友可以加我的Java進(jìn)階群694549689滥酥,群里有阿里大牛直播講解技術(shù)更舞,以及Java大型互聯(lián)網(wǎng)技術(shù)的視頻免費(fèi)分享給大家。
通過(guò)maven的install & deploy命令把interface和Model層發(fā)布到倉(cāng)庫(kù)中坎吻,服務(wù)調(diào)用方只需要依賴interface和model層即可缆蝉。在開(kāi)發(fā)調(diào)試階段只發(fā)布Snapshot版本。等到服務(wù)調(diào)試完成再發(fā)布Release版本瘦真,通過(guò)版本號(hào)來(lái)區(qū)分每次迭代的版本刊头。通過(guò)xml配置方式即可方面接入dubbo,對(duì)程序無(wú)入侵诸尽。
▲Dubbo接口依賴方式
Spring Cloud:服務(wù)提供方和服務(wù)消費(fèi)方通過(guò)json方式交互原杂,因此只需要定義好相關(guān)json字段即可,消費(fèi)方和提供方無(wú)接口依賴您机。通過(guò)注解方式來(lái)實(shí)現(xiàn)服務(wù)配置穿肄,對(duì)于程序有一定入侵年局。
點(diǎn)評(píng):Dubbo服務(wù)依賴略重,需要有完善的版本管理機(jī)制咸产,但是程序入侵少某宪。而Spring Cloud通過(guò)Json交互,省略了版本管理的問(wèn)題锐朴,但是具體字段含義需要統(tǒng)一管理兴喂,自身Rest API方式交互,為跨平臺(tái)調(diào)用奠定了基礎(chǔ)焚志。
四衣迷、組件運(yùn)行流程
下圖中的每個(gè)組件都是需要部署在單獨(dú)的服務(wù)器上,gateway用來(lái)接受前端請(qǐng)求酱酬、聚合服務(wù)壶谒,并批量調(diào)用后臺(tái)原子服務(wù)。每個(gè)service層和單獨(dú)的DB交互膳沽。
▲Dubbo組件運(yùn)行流程
gateWay:前置網(wǎng)關(guān)汗菜,具體業(yè)務(wù)操作,gateWay通過(guò)dubbo提供的負(fù)載均衡機(jī)制自動(dòng)完成
Service:原子服務(wù)挑社,只提供該業(yè)務(wù)相關(guān)的原子服務(wù)
Zookeeper:原子服務(wù)注冊(cè)到zk上
▲Spring Cloud 組件運(yùn)行
Spring Cloud
所有請(qǐng)求都統(tǒng)一通過(guò) API 網(wǎng)關(guān)(Zuul)來(lái)訪問(wèn)內(nèi)部服務(wù)陨界。
網(wǎng)關(guān)接收到請(qǐng)求后,從注冊(cè)中心(Eureka)獲取可用服務(wù)痛阻。
由 Ribbon 進(jìn)行均衡負(fù)載后菌瘪,分發(fā)到后端的具體實(shí)例。
微服務(wù)之間通過(guò) Feign 進(jìn)行通信處理業(yè)務(wù)阱当。
點(diǎn)評(píng):業(yè)務(wù)部署方式相同俏扩,都需要前置一個(gè)網(wǎng)關(guān)來(lái)隔絕外部直接調(diào)用原子服務(wù)的風(fēng)險(xiǎn)。Dubbo需要自己開(kāi)發(fā)一套API 網(wǎng)關(guān)弊添,而Spring Cloud則可以通過(guò)Zuul配置即可完成網(wǎng)關(guān)定制录淡。使用方式上Spring Cloud略勝一籌。
五油坝、微服務(wù)架構(gòu)組成以及注意事項(xiàng)
到底使用是dubbo還是Spring Cloud其實(shí)并不重要嫉戚,重點(diǎn)在于如何合理的利用微服務(wù)。下面是一張互聯(lián)網(wǎng)通用的架構(gòu)圖,其中每個(gè)環(huán)節(jié)都是微服務(wù)的核心部分免钻。
(一)彼水、架構(gòu)分解
網(wǎng)關(guān)集群:數(shù)據(jù)的聚合、實(shí)現(xiàn)對(duì)接入客戶端的身份認(rèn)證极舔、防報(bào)文重放與防數(shù)據(jù)篡改凤覆、功能調(diào)用的業(yè)務(wù)鑒權(quán)、響應(yīng)數(shù)據(jù)的脫敏拆魏、流量與并發(fā)控制等
業(yè)務(wù)集群:一般情況下移動(dòng)端訪問(wèn)和瀏覽器訪問(wèn)的網(wǎng)關(guān)需要隔離盯桦,防止業(yè)務(wù)耦合
Local Cache:由于客戶端訪問(wèn)業(yè)務(wù)可能需要調(diào)用多個(gè)服務(wù)聚合慈俯,所以本地緩存有效的降低了服務(wù)調(diào)用的頻次,同時(shí)也提示了訪問(wèn)速度拥峦。本地緩存一般使用自動(dòng)過(guò)期方式贴膘,業(yè)務(wù)場(chǎng)景中允許有一定的數(shù)據(jù)延時(shí)。
服務(wù)層:原子服務(wù)層略号,實(shí)現(xiàn)基礎(chǔ)的增刪改查功能刑峡,如果需要依賴其他服務(wù)需要在Service層主動(dòng)調(diào)用
Remote Cache:訪問(wèn)DB前置一層分布式緩存,減少DB交互次數(shù)玄柠,提升系統(tǒng)的TPS
DAL:數(shù)據(jù)訪問(wèn)層突梦,如果單表數(shù)據(jù)量過(guò)大則需要通過(guò)DAL層做數(shù)據(jù)的分庫(kù)分表處理。
MQ:消息隊(duì)列用來(lái)解耦服務(wù)之間的依賴羽利,異步調(diào)用可以通過(guò)MQ的方式來(lái)執(zhí)行
數(shù)據(jù)庫(kù)主從:服務(wù)化過(guò)程中畢竟的階段宫患,用來(lái)提升系統(tǒng)的TPS
(二)注意事項(xiàng)
服務(wù)啟動(dòng)方式建議使用jar方式啟動(dòng),啟動(dòng)速度快这弧,更容易監(jiān)控
緩存娃闲、緩存、緩存匾浪,系統(tǒng)中能使用緩存的地方盡量使用緩存皇帮,通過(guò)合理的使用緩存可以有效的提高系統(tǒng)的TPS
服務(wù)拆分要合理,盡量避免因服務(wù)拆分而導(dǎo)致的服務(wù)循環(huán)依賴
合理的設(shè)置線程池户矢,避免設(shè)置過(guò)大或者過(guò)小導(dǎo)致系統(tǒng)異常
給大家推薦一個(gè)程序員學(xué)習(xí)交流群:945622618玲献。群里有分享的視頻,還有思維導(dǎo)圖
群公告有視頻梯浪,都是干貨的,你可以下載來(lái)看瓢娜。主要分享分布式架構(gòu)挂洛、高可擴(kuò)展、高性能眠砾、高并發(fā)虏劲、性能優(yōu)化、Spring boot褒颈、Redis柒巫、ActiveMQ、Nginx谷丸、Mycat堡掏、Netty、Jvm大型分布式項(xiàng)目實(shí)戰(zhàn)學(xué)習(xí)架構(gòu)師視頻刨疼。
六泉唁、總結(jié)
Dubbo出生于阿里系鹅龄,是阿里巴巴服務(wù)化治理的核心框架,并被廣泛應(yīng)用于中國(guó)各互聯(lián)網(wǎng)公司亭畜;只需要通過(guò)spring配置的方式即可完成服務(wù)化扮休,對(duì)于應(yīng)用無(wú)入侵。設(shè)計(jì)的目的還是服務(wù)于自身的業(yè)務(wù)為主拴鸵。雖然阿里內(nèi)部原因dubbo曾經(jīng)一度暫停維護(hù)版本玷坠,但是框架本身的成熟度以及文檔的完善程度,完全能滿足各大互聯(lián)網(wǎng)公司的業(yè)務(wù)需求劲藐。如果我們需要使用配置中心侨糟、分布式跟蹤這些內(nèi)容都需要自己去集成,這樣無(wú)形中增加了使用 Dubbo 的難度瘩燥。
Spring Cloud 是大名鼎鼎的 Spring 家族的產(chǎn)品秕重, 專注于企業(yè)級(jí)開(kāi)源框架的研發(fā)。 Spring Cloud 自從發(fā)展到現(xiàn)在厉膀,仍然在不斷的高速發(fā)展溶耘,幾乎考慮了服務(wù)治理的方方面面,開(kāi)發(fā)起來(lái)非常的便利和簡(jiǎn)單服鹅。
Dubbo于2017年開(kāi)始又重啟維護(hù)凳兵,發(fā)布了更新后的2.5.6版本,而Spring Cloud更新的非称笕恚快庐扫,目前已經(jīng)更新到Finchley.M2。因此仗哨,企業(yè)需要根據(jù)自身的研發(fā)水平和所處階段選擇合適的架構(gòu)來(lái)解決業(yè)務(wù)問(wèn)題形庭,不管是Dubbo還是Spring Cloud都是實(shí)現(xiàn)微服務(wù)有效的工具。