基于云原生應(yīng)用架構(gòu)設(shè)計(jì)

本文目標(biāo)

本文介紹基于云原生應(yīng)用架構(gòu)設(shè)計(jì),實(shí)際是《傳統(tǒng)軟件開(kāi)發(fā)架構(gòu)向基于云平臺(tái)轉(zhuǎn)型之路》后面一部分。通過(guò)本文獲得基于云原生應(yīng)用架構(gòu)設(shè)計(jì)的方法、特點(diǎn)和技術(shù)。

架構(gòu)介紹

云原生架構(gòu)主要對(duì)業(yè)務(wù)場(chǎng)景、隔離故障、容錯(cuò)、自動(dòng)恢復(fù)等非功能性要求考慮較多,通過(guò)云原生架構(gòu)可實(shí)現(xiàn)彈性資源的要求、跨機(jī)房的高可用、數(shù)據(jù)高可用(可達(dá)99.9999999%)。

云原生架構(gòu)概念

敏捷基礎(chǔ)設(shè)施要求像機(jī)器等基礎(chǔ)資源,能夠支持開(kāi)發(fā)人員、運(yùn)維人員和業(yè)務(wù)人員通過(guò)代碼隨時(shí)拉取、隨時(shí)釋放,同時(shí)以接口的方式提供彈性、按需的計(jì)算和存儲(chǔ)能力,且是自動(dòng)化。

持續(xù)交付要求業(yè)務(wù)需求變更、迭代和部署是自動(dòng)化的。

持續(xù)交付架構(gòu)及流程


DevOps(Development and Operation)是開(kāi)發(fā)運(yùn)維一體化,實(shí)際是讓開(kāi)發(fā)人員、測(cè)試人員和運(yùn)維人員溝通、協(xié)同和整合,要實(shí)現(xiàn)整個(gè)過(guò)程自動(dòng)化。

微服務(wù)主要采用Unxi設(shè)計(jì)哲學(xué),讓每個(gè)功能職責(zé)單一化,獨(dú)立化(獨(dú)立擴(kuò)展、升級(jí)和部署)、服務(wù)化,然后通過(guò)服務(wù)的聯(lián)合提供整體功能。

架構(gòu)設(shè)計(jì)

架構(gòu)設(shè)計(jì)主要包含業(yè)務(wù)拆分、微服務(wù)設(shè)計(jì)、統(tǒng)一配置中心,其中有一塊就是分布式任務(wù)及一致性設(shè)計(jì)。

第一業(yè)務(wù)拆分

拆分的基本原則是“高內(nèi)聚、低耦合”,拆分的基本方法,首先確定業(yè)務(wù)邊界,主要依據(jù)數(shù)據(jù)獨(dú)立,但實(shí)踐過(guò)程比較麻煩,有些業(yè)務(wù)的邊界比較模糊,這個(gè)時(shí)候建議先統(tǒng)一設(shè)計(jì),等邊界確定后再拆分,不能強(qiáng)制拆分。其次數(shù)據(jù)庫(kù)獨(dú)立,不同業(yè)務(wù)訪(fǎng)問(wèn)不同的數(shù)據(jù)庫(kù)。然后開(kāi)發(fā)的代碼獨(dú)立,開(kāi)發(fā)時(shí)候使用獨(dú)立工程實(shí)現(xiàn)其功能。再確定服務(wù)之間通信方式,主要同步、異步和同步異步相結(jié)合的方式,同步選擇目前常用RESTful、分布式服務(wù)框架,異步采用消息隊(duì)列來(lái)實(shí)現(xiàn)。最后就是服務(wù)獨(dú)立發(fā)布與部署。

第二微服務(wù)設(shè)計(jì)

主要包含服務(wù)發(fā)現(xiàn)、服務(wù)治理、框架選擇、服務(wù)編排和服務(wù)測(cè)試。

服務(wù)發(fā)現(xiàn)是動(dòng)態(tài)感知服務(wù)訪(fǎng)問(wèn)地址的變化,有服務(wù)端發(fā)現(xiàn)和客戶(hù)端發(fā)現(xiàn),區(qū)別在于誰(shuí)負(fù) 責(zé)維護(hù)服務(wù)訪(fǎng)問(wèn)地址的變化,服務(wù)端發(fā)現(xiàn)模式通過(guò)DNS或帶VIP的負(fù)載均衡實(shí)現(xiàn),客戶(hù)端 主要向注冊(cè)服務(wù)列表選擇請(qǐng)求服務(wù),然后直接發(fā)起服務(wù)請(qǐng)求。一般公有云提供服務(wù)端服務(wù) 發(fā)現(xiàn)機(jī)制。技術(shù)選型可選擇ZooKeeper或Consul中間件來(lái)實(shí)現(xiàn)。




基于客戶(hù)端服務(wù)發(fā)現(xiàn)


服務(wù)治理范圍涵蓋服務(wù)的整個(gè)生命周期,從服務(wù)建模開(kāi)始、到開(kāi)發(fā)、測(cè)試、審批、發(fā)布、運(yùn)行時(shí)治理和服務(wù)下線(xiàn),這里主要討論的服務(wù)運(yùn)行治理,達(dá)到在線(xiàn)治理、實(shí)時(shí)生效。主要兩種方式:彈性擴(kuò)容和熔斷機(jī)制。彈性擴(kuò)展介紹基于kubernetes的Horizonal Pod AutoScaler(HPA)彈性擴(kuò)容機(jī)制,實(shí)現(xiàn)方法是通過(guò)定期輪訓(xùn)Pod的狀態(tài),當(dāng)Pod狀態(tài)連續(xù)達(dá)到提前設(shè)置的閾值時(shí)候,出發(fā)副本控制器,修改其應(yīng)用副本數(shù)量,使Pod的負(fù)載中心回到正常范圍內(nèi)。熔斷機(jī)制是對(duì)出現(xiàn)故障的節(jié)點(diǎn),當(dāng)被調(diào)用的時(shí)候,防止出現(xiàn)級(jí)聯(lián)反應(yīng),中斷線(xiàn)路,回到初始狀態(tài)(比如:用戶(hù)提交訂單,調(diào)用支付服務(wù)的時(shí)候,支付服務(wù)調(diào)用失敗,這個(gè)時(shí)候啟動(dòng)熔斷機(jī)制,后續(xù)用戶(hù)可以定位頁(yè)面繼續(xù)選擇支付,否則產(chǎn)生服務(wù)調(diào)用級(jí)聯(lián)反應(yīng))。




熔斷機(jī)制


微服務(wù)框架有SpringCloud和Dubbo,SpringClound是基于SpringBoot,提供一套完整的解決方案,包含功能有分布式配置、服務(wù)注冊(cè)和發(fā)現(xiàn)、路由、服務(wù)間調(diào)用、負(fù)載均衡、斷路器、選主、集群狀態(tài)和分布式消息機(jī)制,實(shí)現(xiàn)通過(guò)SpringCloud Config實(shí)現(xiàn)統(tǒng)一配置,通過(guò)SpringClund Netflix實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)(Eureka)、智能路由(Zuul)、客戶(hù)負(fù)載均衡(Ribbon)。Dubbo是阿里針對(duì)大規(guī)模網(wǎng)站應(yīng)用研發(fā)微服務(wù)架構(gòu),主要應(yīng)用于長(zhǎng)鏈接小數(shù)據(jù)的模式提供服務(wù),但如果產(chǎn)品業(yè)務(wù)后臺(tái)邏輯復(fù)雜、時(shí)間長(zhǎng)而導(dǎo)致異步邏輯比較多的話(huà),可能Dubbo不太合適。具體請(qǐng)參看官方文檔。

服務(wù)編排以服務(wù)為中心定義服務(wù)的彈性伸縮、灰度發(fā)布、滾動(dòng)升級(jí)、資源配置等功能組合,基于容器的服務(wù)編排結(jié)合Docker對(duì)容器定義進(jìn)行組合,實(shí)現(xiàn)包含對(duì)象定義、語(yǔ)法解析、任務(wù)調(diào)度和模板管理。

微服務(wù)測(cè)試主要包括單元測(cè)試、接口測(cè)試、集成測(cè)試和系統(tǒng)測(cè)試,實(shí)現(xiàn)可以通過(guò)Mock來(lái)實(shí)現(xiàn),Mock通過(guò)定義輸入和輸出,模擬當(dāng)前服務(wù)需要調(diào)用其他服務(wù)的情況,這樣就可以模擬整個(gè)流程來(lái)對(duì)當(dāng)前上線(xiàn)的服務(wù)進(jìn)行測(cè)試。

第三統(tǒng)一配置中心

配置中心主要解決:每個(gè)服務(wù)都有很多雨來(lái)和配置信息,比如:數(shù)據(jù)庫(kù)、緩存、隊(duì)列、運(yùn)行閾值和策略等等,當(dāng)業(yè)務(wù)擴(kuò)張一定程度后,就需要由一個(gè)配置中心,來(lái)應(yīng)對(duì)每個(gè)業(yè)務(wù)配置變更。

配置中心工作流程


分布式定時(shí)任務(wù)

分布式主要包括分布式定時(shí)任務(wù)、分布式鎖等問(wèn)題,分布式定時(shí)任務(wù)需要滿(mǎn)足分布式、高可用、彈性擴(kuò)容和統(tǒng)一管理特征,有搶占式和分配式。搶占式是每個(gè)Woker定時(shí)任務(wù)的最終執(zhí)行者,通過(guò)槍?xiě)?zhàn)的方式從調(diào)度器節(jié)點(diǎn)上獲取任務(wù),并定時(shí)執(zhí)行,Worker可以連上任意一個(gè)調(diào)度器節(jié)點(diǎn),申請(qǐng)分配任務(wù)。定時(shí)任務(wù)的調(diào)度邏輯放在調(diào)度器節(jié)點(diǎn),并最終持續(xù)化到任務(wù)中心。分配式是調(diào)度器只有一個(gè)Master節(jié)點(diǎn),Master節(jié)點(diǎn)通過(guò)分布式鎖服務(wù)(zk或Redis實(shí)現(xiàn))選取或者競(jìng)爭(zhēng)產(chǎn)生,Master及誒單任務(wù)中心獲取定時(shí)任務(wù),分配給Worker定時(shí)執(zhí)行。當(dāng)Master失效是,Slaver節(jié)點(diǎn)會(huì)重新選舉出Master節(jié)點(diǎn)。

搶占式調(diào)度,優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單,調(diào)度器Master可以水平擴(kuò)展,缺點(diǎn)是無(wú)法控制Worker節(jié)點(diǎn)大量并行輪詢(xún),可以通過(guò)Worker退避輪詢(xún)或任務(wù)中心緩存熱點(diǎn)數(shù)據(jù)等通過(guò)方法規(guī)避或者部分解決。分配式調(diào)度,優(yōu)點(diǎn)控制任務(wù)分配的節(jié)點(diǎn),保證系統(tǒng)的整體負(fù)載是正常,缺點(diǎn)是調(diào)度器屬于一主從模式,需要額外引入分布式鎖服務(wù)解決Master選取的問(wèn)題。

可選用的開(kāi)源框架有:Quartz、Chronos和Scheduled Job,Quartz應(yīng)用比較廣泛,提供多種觸發(fā)器供使用,當(dāng)搭建Quartz集群時(shí)候,通過(guò)悲觀(guān)鎖和標(biāo)志字段等方式保證一個(gè)作業(yè)不會(huì)被多個(gè)Quartz進(jìn)程調(diào)度。Chronos通過(guò)Leader和非Leader節(jié)點(diǎn)實(shí)現(xiàn)分布式調(diào)度控制,具備WEBUI、支持ISO8601重復(fù)事件表示法、作業(yè)精細(xì)化等等優(yōu)勢(shì)。Scheduled Job是kubernets用于管理事件的作業(yè)。

本文基于《云原生應(yīng)用架構(gòu)實(shí)踐》理解整理而成。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容