一绑改、背景
- 隨著互聯(lián)網(wǎng)的發(fā)展谢床,網(wǎng)站應(yīng)用的規(guī)模不斷擴(kuò)大,常規(guī)的垂直應(yīng)用架構(gòu)已無(wú)法應(yīng)對(duì)厘线,分布式服務(wù)架構(gòu)以及流動(dòng)計(jì)算架構(gòu)勢(shì)在必行识腿,亟需一個(gè)治理系統(tǒng)確保架構(gòu)有條不紊的演進(jìn)。
從單一的架構(gòu)到分布式架構(gòu)演變
(1)單一應(yīng)用架構(gòu)
當(dāng)網(wǎng)站流量很小時(shí)造壮,只需一個(gè)應(yīng)用渡讼,將所有功能都部署在一起,以減少部署節(jié)點(diǎn)和成本耳璧。此時(shí)成箫,用于簡(jiǎn)化增刪改查工作量的數(shù)據(jù)訪問(wèn)框架(ORM)是關(guān)鍵
(2)垂直應(yīng)用架構(gòu)
當(dāng)訪問(wèn)量逐漸增大,單一應(yīng)用增加機(jī)器性能帶來(lái)的加速度越來(lái)越小旨枯,將應(yīng)用拆成互不相干的幾個(gè)應(yīng)用蹬昌,以提升效率。此時(shí)攀隔,用于加速前端頁(yè)面開(kāi)發(fā)的Web框架(MVC)是關(guān)鍵皂贩。
(3)分布式服務(wù)架構(gòu)
當(dāng)垂直應(yīng)用越來(lái)越多,應(yīng)用之間交互不可避免竞慢,將核心業(yè)務(wù)抽取出來(lái)先紫,作為獨(dú)立的服務(wù),逐漸形成穩(wěn)定的服務(wù)中心筹煮,使前端應(yīng)用能更快速的響應(yīng)多變的市場(chǎng)需求遮精。此時(shí),用于提高業(yè)務(wù)復(fù)用及整合的分布式服務(wù)框架(RPC)是關(guān)鍵败潦。
(4)流動(dòng)計(jì)算架構(gòu)
當(dāng)服務(wù)越來(lái)越多本冲,容量的評(píng)估,小服務(wù)資源的浪費(fèi)等問(wèn)題逐漸顯現(xiàn)劫扒,此時(shí)需增加一個(gè)調(diào)度中心基于訪問(wèn)壓力實(shí)時(shí)管理集群容量檬洞,提高集群利用率。此時(shí)沟饥,用于提高機(jī)器利用率的資源調(diào)度和治理中心(SOA)是關(guān)鍵添怔。
二湾戳、需求
- 大規(guī)模服務(wù)化后的問(wèn)題及解決思路:
(1)在大規(guī)模服務(wù)化之前,應(yīng)用可能只是通過(guò) RMI 或 Hessian 等工具广料,簡(jiǎn)單的暴露和引用遠(yuǎn)程服務(wù)砾脑,通過(guò)配置服務(wù)的URL地址進(jìn)行調(diào)用,通過(guò) F5 等硬件進(jìn)行負(fù)載均衡艾杏。--------------需要一種高效的運(yùn)程通信手段
(2)當(dāng)服務(wù)越來(lái)越多時(shí)韧衣,服務(wù) URL 配置管理變得非常困難,F(xiàn)5 硬件負(fù)載均衡器的單點(diǎn)壓力也越來(lái)越大购桑。 此時(shí)需要一個(gè)服務(wù)注冊(cè)中心畅铭,動(dòng)態(tài)的注冊(cè)和發(fā)現(xiàn)服務(wù),使服務(wù)的位置透明勃蜘。并通過(guò)在消費(fèi)方獲取服務(wù)提供方地址列表硕噩,實(shí)現(xiàn)軟負(fù)載均衡和 Failover,降低對(duì) F5 硬件負(fù)載均衡器的依賴缭贡,也能減少部分成本榴徐。
(3)當(dāng)進(jìn)一步發(fā)展,服務(wù)間依賴關(guān)系變得錯(cuò)蹤復(fù)雜匀归,甚至分不清哪個(gè)應(yīng)用要在哪個(gè)應(yīng)用之前啟動(dòng)坑资,架構(gòu)師都不能完整的描述應(yīng)用的架構(gòu)關(guān)系。 這時(shí)穆端,需要自動(dòng)畫(huà)出應(yīng)用間的依賴關(guān)系圖袱贮,以幫助架構(gòu)師理清理關(guān)系。----需要服務(wù)治理
(4)服務(wù)的調(diào)用量越來(lái)越大体啰,服務(wù)的容量問(wèn)題就暴露出來(lái)攒巍,這個(gè)服務(wù)需要多少機(jī)器支撐?什么時(shí)候該加機(jī)器荒勇? 為了解決這些問(wèn)題柒莉,第一步,要將服務(wù)現(xiàn)在每天的調(diào)用量沽翔,響應(yīng)時(shí)間兢孝,都統(tǒng)計(jì)出來(lái),作為容量規(guī)劃的參考指標(biāo)仅偎。其次跨蟹,要可以動(dòng)態(tài)調(diào)整權(quán)重,在線上橘沥,將某臺(tái)機(jī)器的權(quán)重一直加大窗轩,并在加大的過(guò)程中記錄響應(yīng)時(shí)間的變化,直到響應(yīng)時(shí)間到達(dá)閾值座咆,記錄此時(shí)的訪問(wèn)量痢艺,再以此訪問(wèn)量乘以機(jī)器數(shù)反推總?cè)萘?--需要服務(wù)監(jiān)控
三仓洼、dubbo架構(gòu)
-
dubbo是一個(gè)阿里巴巴開(kāi)發(fā)的開(kāi)源分布式服務(wù)框架,致力于提供高性能和透明化的RPC遠(yuǎn)程服務(wù)調(diào)用方案堤舒,以及SOA服務(wù)治理方案是阿里巴巴集團(tuán)的各成員站點(diǎn)的核心框架衬潦,每天為2,000+個(gè)服務(wù)提供3,000,000,000+次訪問(wèn)量支持。
dubbo架構(gòu)
1.相關(guān)的節(jié)點(diǎn)說(shuō)明
Provider 暴露服務(wù)的服務(wù)提供方
Consumer 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方
Registry 服務(wù)注冊(cè)與發(fā)現(xiàn)的注冊(cè)中心
Monitor 統(tǒng)計(jì)服務(wù)的調(diào)用次數(shù)和調(diào)用時(shí)間的監(jiān)控中心
Container 服務(wù)運(yùn)行容器
2.調(diào)用關(guān)系說(shuō)明服務(wù)容器負(fù)責(zé)啟動(dòng)植酥,加載,運(yùn)行服務(wù)提供者弦牡。
(1)服務(wù)提供者在啟動(dòng)時(shí)友驮,向注冊(cè)中心注冊(cè)自己提供的服務(wù)。
(2)服務(wù)消費(fèi)者在啟動(dòng)時(shí)驾锰,向注冊(cè)中心訂閱自己所需的服務(wù)卸留。
(3)注冊(cè)中心返回服務(wù)提供者地址列表給消費(fèi)者,如果有變更椭豫,注冊(cè)中心將基于長(zhǎng)連接推送變更數(shù)據(jù)給消費(fèi)者耻瑟。
(4)服務(wù)消費(fèi)者,從提供者地址列表中赏酥,基于軟負(fù)載均衡算法喳整,選一臺(tái)提供者進(jìn)行調(diào)用,如果調(diào)用失敗裸扶,再選另一臺(tái)調(diào)用框都。
(5)服務(wù)消費(fèi)者和提供者,在內(nèi)存中累計(jì)調(diào)用次數(shù)和調(diào)用時(shí)間呵晨,定時(shí)每分鐘發(fā)送一次統(tǒng)計(jì)數(shù)據(jù)到監(jiān)控中心魏保。
3.dubbo的特點(diǎn)
(1)連通性
- 注冊(cè)中心負(fù)責(zé)服務(wù)地址的注冊(cè)與查找,相當(dāng)于目錄服務(wù)摸屠,服務(wù)提供者和消費(fèi)者只在啟動(dòng)時(shí)與注冊(cè)中心交互谓罗,注冊(cè)中心不轉(zhuǎn)發(fā)請(qǐng)求,壓力較小
- 監(jiān)控中心負(fù)責(zé)統(tǒng)計(jì)各服務(wù)調(diào)用次數(shù)季二,調(diào)用時(shí)間等檩咱,統(tǒng)計(jì)先在內(nèi)存匯總后每分鐘一次發(fā)送到監(jiān)控中心服務(wù)器,并以報(bào)表展示
- 服務(wù)提供者向注冊(cè)中心注冊(cè)其提供的服務(wù)胯舷,并匯報(bào)調(diào)用時(shí)間到監(jiān)控中心税手,此時(shí)間不包含網(wǎng)絡(luò)開(kāi)銷
- 服務(wù)消費(fèi)者向注冊(cè)中心獲取服務(wù)提供者地址列表,并根據(jù)負(fù)載算法直接調(diào)用提供者需纳,同時(shí)匯報(bào)調(diào)用時(shí)間到監(jiān)控中心芦倒,此時(shí)間包含網(wǎng)絡(luò)開(kāi)銷
- 注冊(cè)中心,服務(wù)提供者不翩,服務(wù)消費(fèi)者三者之間均為長(zhǎng)連接兵扬,監(jiān)控中心除外
- 注冊(cè)中心通過(guò)長(zhǎng)連接感知服務(wù)提供者的存在麻裳,服務(wù)提供者宕機(jī),注冊(cè)中心將立即推送事件通知消費(fèi)者
- 注冊(cè)中心和監(jiān)控中心全部宕機(jī)器钟,不影響已運(yùn)行的提供者和消費(fèi)者津坑,消費(fèi)者在本地緩存了提供者列表
- 注冊(cè)中心和監(jiān)控中心都是可選的,服務(wù)消費(fèi)者可以直連服務(wù)提供者
(2)健壯性
- 監(jiān)控中心宕掉不影響使用傲霸,只是丟失部分采樣數(shù)據(jù)
- 數(shù)據(jù)庫(kù)宕掉后疆瑰,注冊(cè)中心仍能通過(guò)緩存提供服務(wù)列表查詢,但不能注冊(cè)新服務(wù)
- 注冊(cè)中心對(duì)等集群昙啄,任意一臺(tái)宕掉后穆役,將自動(dòng)切換到另一臺(tái)
- 注冊(cè)中心全部宕掉后,服務(wù)提供者和服務(wù)消費(fèi)者仍能通過(guò)本地緩存通訊
- 服務(wù)提供者無(wú)狀態(tài)梳凛,任意一臺(tái)宕掉后耿币,不影響使用
- 服務(wù)提供者全部宕掉后,服務(wù)消費(fèi)者應(yīng)用將無(wú)法使用韧拒,并無(wú)限次重連等待服務(wù)提供者恢復(fù)
(3)伸縮性
- 注冊(cè)中心為對(duì)等集群淹接,可動(dòng)態(tài)增加機(jī)器部署實(shí)例,所有客戶端將自動(dòng)發(fā)現(xiàn)新的注冊(cè)中心
- 服務(wù)提供者無(wú)狀態(tài)叛溢,可動(dòng)態(tài)增加機(jī)器部署實(shí)例塑悼,注冊(cè)中心將推送新的服務(wù)提供者信息給消費(fèi)者
(4)升級(jí)性
當(dāng)服務(wù)集群規(guī)模進(jìn)一步擴(kuò)大,帶動(dòng)IT治理結(jié)構(gòu)進(jìn)一步升級(jí)楷掉,需要實(shí)現(xiàn)動(dòng)態(tài)部署拢肆,進(jìn)行流動(dòng)計(jì)算,現(xiàn)有分布式服務(wù)架構(gòu)不會(huì)帶來(lái)阻力靖诗。下圖是未來(lái)可能的一種架構(gòu):
節(jié)點(diǎn) | 角色說(shuō)明 |
---|---|
Deployer | 自動(dòng)部署服務(wù)的本地代理 |
Repository | 倉(cāng)庫(kù)用于存儲(chǔ)服務(wù)應(yīng)用發(fā)布包 |
Scheduler | 調(diào)度中心基于訪問(wèn)壓力自動(dòng)增減服務(wù)提供者 |
Admin | 統(tǒng)一管理控制臺(tái) |
Registry | 服務(wù)注冊(cè)與發(fā)現(xiàn)的注冊(cè)中心 |
Monitor | 統(tǒng)計(jì)服務(wù)的調(diào)用次數(shù)和調(diào)用時(shí)間的監(jiān)控中心 |
4.總結(jié)dubbo核心功能
(1)遠(yuǎn)程通訊: 提供對(duì)多種基于長(zhǎng)連接的NIO框架抽象封裝郭怪,包括多種線程模型,序列化刊橘,以及“請(qǐng)求-響應(yīng)”模式的信息交換方式鄙才。
(2)集群容錯(cuò): 提供基于接口方法的透明遠(yuǎn)程過(guò)程調(diào)用,包括多協(xié)議支持促绵,以及軟負(fù)載均衡攒庵,失敗容錯(cuò),地址路由败晴,動(dòng)態(tài)配置等集群支持浓冒。
(3) 自動(dòng)發(fā)現(xiàn): 基于注冊(cè)中心目錄服務(wù),使服務(wù)消費(fèi)方能動(dòng)態(tài)的查找服務(wù)提供方尖坤,使地址透明稳懒,使服務(wù)提供方可以平滑增加或減少機(jī)器。
5.dubbo優(yōu)勢(shì)
(1)透明化的遠(yuǎn)程方法調(diào)用慢味,調(diào)用本地方法一樣场梆,只是需要簡(jiǎn)單的配置沒(méi)有任何的api侵入墅冷,性能相對(duì)http傳送方式要好。
(2)軟負(fù)載均衡及容錯(cuò)機(jī)制或油,可在內(nèi)網(wǎng)內(nèi)替代F5等硬件負(fù)載均衡寞忿,降低成本,減少單點(diǎn)顶岸,實(shí)現(xiàn)了高可用機(jī)制
(3)服務(wù)自動(dòng)注冊(cè)和發(fā)現(xiàn)及服務(wù)監(jiān)控
(4)可以與spring結(jié)合使用
6腔彰、dubbo劣勢(shì)
(1)Dubbo實(shí)現(xiàn)了服務(wù)治理的基礎(chǔ),其他組件需要另外整合以實(shí)現(xiàn)對(duì)應(yīng)的功能辖佣,比如:
分布式配置:可以使用淘寶的diamond霹抛、百度的disconf來(lái)實(shí)現(xiàn)分布式配置管理,攜程apollo等凌简。
服務(wù)跟蹤:可以使用京東開(kāi)源的Hydra
批量任務(wù):可以使用當(dāng)當(dāng)開(kāi)源的Elastic-Job
(2)版本Dubbo升級(jí)比較困難,需要考慮因素多恃逻。服務(wù)提供方與調(diào)用方接口依賴方式太強(qiáng):調(diào)用方對(duì)提供方的抽象接口存在強(qiáng)依賴關(guān)系雏搂,需要嚴(yán)格的管理版本依賴,才不會(huì)出現(xiàn)服務(wù)方與調(diào)用方的不一致導(dǎo)致應(yīng)用無(wú)法編譯成功等一系列問(wèn)題寇损;
(3)服務(wù)對(duì)平臺(tái)敏感凸郑,難以簡(jiǎn)單復(fù)用:通常我們?cè)谔峁?duì)外服務(wù)時(shí),都會(huì)以REST的方式提供出去矛市,這樣可以實(shí)現(xiàn)跨平臺(tái)的特點(diǎn)芙沥。在Dubbo中我們要提供REST接口時(shí),不得不實(shí)現(xiàn)一層代理浊吏,用來(lái)將RPC接口轉(zhuǎn)換成REST接口進(jìn)行對(duì)外發(fā)布而昨。所以當(dāng)當(dāng)網(wǎng)在dubbox(基于Dubbo的開(kāi)源擴(kuò)展)中增加了對(duì)REST支持。