2023-07-28 10:22:29來源:今日頭條
(資料圖片僅供參考)
微服務(wù)架構(gòu)是由很多小而自治的微服務(wù)組合而成,每個服務(wù)都提供一套獨(dú)立自洽的業(yè)務(wù)能力。從應(yīng)用的層面,我們首先對業(yè)務(wù)進(jìn)行建模,業(yè)務(wù)域定義的邊界也自然而然作為每個微服務(wù)的職能邊界。
什么是微服務(wù)?微服務(wù)的定義比較直白,但只有理解它的設(shè)計理念和原則,才能真正用好它。從單個服務(wù)/服務(wù)間關(guān)系來看,有以下特征:
微服務(wù)通常很小、提供很少但獨(dú)立的功能,服務(wù)間耦合度很低。一個很小的研發(fā)團(tuán)隊(duì)就可以開發(fā)和維護(hù)一個微服務(wù)。每個服務(wù)都是一個單獨(dú)的代碼庫,可以由一個很小的研發(fā)團(tuán)隊(duì)來管理。服務(wù)可以獨(dú)立部署,而不需要重新構(gòu)建和部署整個應(yīng)用。每個服務(wù)負(fù)責(zé)維護(hù)自己的數(shù)據(jù)和狀態(tài),數(shù)據(jù)所有權(quán)歸本服務(wù)所有,其他服務(wù)必須通過該服務(wù)訪問數(shù)據(jù)和狀態(tài)。服務(wù)之間通過定義好的API進(jìn)行通信,對外隱藏API的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)。支持多語言編程,不同服務(wù)可以使用獨(dú)立的技術(shù)棧進(jìn)行開發(fā),自由選擇編程語言、框架和庫。如果從更全局的視角來看,微服務(wù)架構(gòu)還必須下面幾個組件:
服務(wù)管理和編排。該組件負(fù)責(zé)把服務(wù)部署在物理機(jī)/虛擬機(jī)節(jié)點(diǎn)上、做失敗檢查、在多個節(jié)點(diǎn)上負(fù)責(zé)對服務(wù)的多個實(shí)例做負(fù)載均衡等。我們通??梢允褂矛F(xiàn)成的開源技術(shù)來充當(dāng)這個組件,比如k8s。API Gateway。API Gateway給所有Client提供了訪問入口。Client通常不會直接訪問提供業(yè)務(wù)支持的服務(wù),而是調(diào)用API Gateway,由Gateway負(fù)責(zé)把請求轉(zhuǎn)發(fā)給后端對應(yīng)的服務(wù)。使用 API Gateway 有很多優(yōu)勢:
解耦Client和服務(wù),我們可以單獨(dú)對服務(wù)進(jìn)行更新或重構(gòu),client端可能不需要更新甚至不需要感知。服務(wù)間通信可以使用更靈活的方式,比如不走HTTP協(xié)議,而是走rpc等二進(jìn)制協(xié)議、消息隊(duì)列等,某些超大數(shù)據(jù)量的場景甚至?xí)遬2p協(xié)議。API Gateway可以承擔(dān)一些跨業(yè)務(wù)的職能,比如權(quán)限認(rèn)證、日志、SSL校驗(yàn)、負(fù)載均衡等。API Gateway一般會提供一些開箱即用的能力,比如限流、緩存、請求篡改、權(quán)限校驗(yàn)等。架構(gòu)優(yōu)勢支持敏捷迭代。由于微服務(wù)可以獨(dú)立部署,所以修復(fù)bug和上線新特性也更容易。你可以獨(dú)立更新特定的服務(wù),而不是重新部署整個應(yīng)用,如果更新出現(xiàn)問題,也支持快速回滾。在傳統(tǒng)應(yīng)用中,一旦在應(yīng)用的某個環(huán)節(jié)發(fā)現(xiàn)問題,整個發(fā)布流程都要被阻塞。新特性也可以等著bug修復(fù)后再去測試和發(fā)布。小而專的研發(fā)團(tuán)隊(duì)。微服務(wù)可以很小,小到一個獨(dú)立的小團(tuán)隊(duì)iu可以構(gòu)建、測試和阿布。小團(tuán)隊(duì)非常適合推行敏捷迭代流程。往往大型團(tuán)隊(duì)的生產(chǎn)力更弱一些,因?yàn)闇贤M,管理成本上升,由此也不適合再推行敏捷迭代。代碼庫小。在大型單體應(yīng)用中,隨著時間推移,代碼依賴越來越復(fù)雜。增加新特性意味著要改很多地方的代碼。由于不共享代碼和數(shù)據(jù),微服務(wù)架構(gòu)將依賴最小化,部署新特性也更容易。可以融合使用多種技術(shù)。團(tuán)隊(duì)成員可以選擇最適合服務(wù)的技術(shù),并在適當(dāng)?shù)那闆r下混合使用多個技術(shù)棧。故障隔離。如果一個特定的微服務(wù)掛掉了,只要上游微服務(wù)在設(shè)計時考慮到容災(zāi)處理,通常不會影響整個應(yīng)用的正常功能。比如,采用適當(dāng)?shù)娜蹟鄼C(jī)制,或者服務(wù)間通信走異步消息隊(duì)列。架構(gòu)擴(kuò)展性好。每個服務(wù)都可以單獨(dú)進(jìn)行擴(kuò)容,這樣的話,我們就能獨(dú)立擴(kuò)容需要更多資源的子系統(tǒng),而不是整個應(yīng)用。使用K8s等對服務(wù)進(jìn)行編排,我們可以把多個服務(wù)的實(shí)例部署在同一臺機(jī)器上,以提高資源利用率。原生支持服務(wù)間的數(shù)據(jù)隔離。如果要更新數(shù)據(jù)的schema,只有單個服務(wù)受到影響。在單體應(yīng)用中,更新schema往往不太容易,因?yàn)閼?yīng)用的多個模塊都會通過庫依賴的形式訪問數(shù)據(jù),在更新時,很難追蹤到所有使用的地方和使用方式,導(dǎo)致schema的迭代有很多未知的風(fēng)險。有哪些挑戰(zhàn)微服務(wù)的架構(gòu)優(yōu)勢是有代價的,在采用微服務(wù)架構(gòu)之前,我們要認(rèn)識到未來可能面臨的挑戰(zhàn):
架構(gòu)復(fù)雜度高。相對于單體應(yīng)用,微服務(wù)應(yīng)用有很多可變的組件。每個服務(wù)都更簡單了,但整個系統(tǒng)變得更復(fù)雜了。開發(fā)和測試麻煩,尤其是集成測試。在實(shí)現(xiàn)一個微服務(wù)時,如果它依賴了其他服務(wù),編寫和測試過程都會比單體應(yīng)用更復(fù)雜?,F(xiàn)存的工具在設(shè)計時可能并未考慮到服務(wù)依賴。如果我們要對相互依賴的多個服務(wù)進(jìn)行重構(gòu),難度也會比重構(gòu)單體應(yīng)用高。在測試時,涉及到服務(wù)依賴,需要單獨(dú)維護(hù)多套與線上相似的測試環(huán)境??紤]到每個服務(wù)都有多個測試版本,迭代比較快時,很容易出問題?;ハ嗒?dú)立的服務(wù),很難做治理。由于微服務(wù)以區(qū)中心化的方式去構(gòu)建各個服務(wù),在服務(wù)治理上增加了額外的難度。最終整個應(yīng)用中可能包含多個編程語言,使用了多種框架,開發(fā)人員可以更自由地選擇小眾的技術(shù),導(dǎo)致后期維護(hù)成本反而更高。容易產(chǎn)生網(wǎng)絡(luò)擁塞和延遲。很多小且功能獨(dú)立的服務(wù)需要通過API或消息隊(duì)列繼續(xù)頻繁的通信。由于底層走網(wǎng)卡進(jìn)行通信,對比單體架構(gòu)的代碼庫依賴,網(wǎng)絡(luò)通信的代價可能很高。當(dāng)服務(wù)的依賴鏈很長時,比如 A調(diào)用B,B調(diào)用C,C調(diào)用...,額外的網(wǎng)絡(luò)延遲會高到無法接受。所以在設(shè)計服務(wù)時,需要慎重考慮API的設(shè)計,應(yīng)避免過度繁瑣的API,考慮到編碼格式(二進(jìn)制協(xié)議優(yōu)于文本協(xié)議),優(yōu)先使用異步通信模式或消息隊(duì)列模式;跨服務(wù)的數(shù)據(jù)一致性問題。每個微服務(wù)負(fù)責(zé)自身的數(shù)據(jù)持久化,導(dǎo)致多個服務(wù)的數(shù)據(jù)可能存在不一致。通常我們使用最終一致性原則解決這些問題;服務(wù)管理難度高。微服務(wù)架構(gòu)的成功采用離不開成熟的DevOps文化。處理跨服務(wù)的日志追蹤,尤其是一個用戶操作觸發(fā)整個鏈路的微服務(wù)調(diào)用,日志都要記錄下來,并且在發(fā)生錯誤時,能夠把整個調(diào)用鏈的日志拉取出來;服務(wù)的發(fā)布版本管理。在更新服務(wù)時,不能對API做破壞性的更新,否則依賴它的服務(wù)可能會掛掉。由于多個開發(fā)團(tuán)隊(duì)在同一時間段可能都要對服務(wù)做更新,所以接口設(shè)計必須保持向前或向后兼容。一個典型的低級錯誤是:刪除了API定義的某些字段,或修改了某些字段的業(yè)務(wù)含義;要求研發(fā)團(tuán)隊(duì)懂分布式系統(tǒng)。微服務(wù)通常是分布式的,需要認(rèn)真評估團(tuán)隊(duì)是否具備對應(yīng)的能力和經(jīng)驗(yàn);最佳實(shí)踐基于業(yè)務(wù)場景對服務(wù)進(jìn)行建模;盡量去中心化。每個團(tuán)隊(duì)都要負(fù)責(zé)設(shè)計和構(gòu)建服務(wù),避免分享代碼或底層數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)存儲只允許單個服務(wù)訪問,每個服務(wù)根據(jù)自己的業(yè)務(wù)需求設(shè)計選擇存儲方案和數(shù)據(jù)格式。服務(wù)間通過設(shè)計良好的API進(jìn)行通信,應(yīng)盡量避免透露實(shí)現(xiàn)細(xì)節(jié)。API的定義應(yīng)當(dāng)基于業(yè)務(wù)場景進(jìn)行設(shè)計,而不是根據(jù)內(nèi)部的技術(shù)實(shí)現(xiàn)進(jìn)行設(shè)計。避免服務(wù)間的耦合。服務(wù)間耦合的原因通常是把數(shù)據(jù)庫schema透傳給外部,或通信協(xié)議彈性比較差。將跨業(yè)務(wù)域的需求交給API Gateway來處理,比如身份認(rèn)證、SSL驗(yàn)證。保持API Gateway的純粹性,不摻入業(yè)務(wù)邏輯。API Gateway只處理和轉(zhuǎn)發(fā)client側(cè)的請求,不感知任何業(yè)務(wù)邏輯。否則API Gateway將成為一個依賴,導(dǎo)致服務(wù)間的耦合。服務(wù)間應(yīng)該高內(nèi)聚、低耦合。應(yīng)該一起變化的邏輯應(yīng)該被打包到一個服務(wù)里,統(tǒng)一部署。如果他們分散在不同的服務(wù)里,這些服務(wù)將高度耦合在一起,一個服務(wù)的更新也將連鎖導(dǎo)致另一個服務(wù)的更新。兩個服務(wù)間繁瑣的通信是“高耦合低內(nèi)聚”的體現(xiàn)。故障隔離。應(yīng)當(dāng)采取一定的恢復(fù)策略,以避免一個服務(wù)的故障引發(fā)連鎖反應(yīng)。關(guān)鍵詞:
微服務(wù)架構(gòu)是由很多小而自治的微服務(wù)組合而成,每個服務(wù)都提供一套獨(dú)立
01車載激光雷達(dá)的激光點(diǎn)云通過點(diǎn)云技術(shù),激光雷達(dá)的成像能夠更為清晰、
分組集的定義是多個分組的并集,用于在一個查詢中,按照不同的分組列對
7月27日13時,市氣象臺將溫州市區(qū)暴雨橙色預(yù)警信號升級為暴雨紅色預(yù)警
據(jù)國家發(fā)展改革委7月27日消息國家發(fā)展改革委等六部門近日發(fā)布關(guān)于推動
加強(qiáng)科技支撐,推進(jìn)綠色低碳科技自立自強(qiáng),是日前召開的全國生態(tài)環(huán)境保
2Q2023,分產(chǎn)業(yè)視角觀察區(qū)域經(jīng)濟(jì),伴隨線下消費(fèi)復(fù)蘇、地產(chǎn)走弱、出口短
07月27日,中山公用獲深股通增持萬股,最新持股量為萬股,占公司A股總
【銳眼看市】超級寬松貨幣政策的確為市場注入了豐沛的流動性,滿足了企
大家好,小福來為大家解答以上的問題。aukoala是什么牌子,aukoala這個
大家好,小樂來為大家解答以上的問題。灼灼其華打字機(jī)n號,灼灼妻華這個
hello大家好,我是城鄉(xiāng)經(jīng)濟(jì)網(wǎng)小晟來為大家解答以上問題,三線城市做什
大行評級丨Bernstein:上調(diào)微軟目標(biāo)價至398美元看好人工智能“順風(fēng)”:
hello大家好,我是城鄉(xiāng)經(jīng)濟(jì)網(wǎng)小晟來為大家解答以上問題,紅櫻桃之袖珍
近日,胡錫進(jìn)發(fā)文稱,也許我們需要一場由政府、企業(yè)、投資機(jī)構(gòu)和散戶共