更新時(shí)間:2022-03-22 來(lái)源:黑馬程序員 瀏覽量:
通過(guò)前面的java學(xué)習(xí)后,相信很多人對(duì)微服務(wù)架構(gòu)都會(huì)產(chǎn)生這樣一些疑問(wèn),例如我要何時(shí)使用微服務(wù)架構(gòu)?又如何將應(yīng)用程序分解為微服務(wù)?分解后,要如何去搭建微服務(wù)架構(gòu)?同時(shí),在微服務(wù)架構(gòu)中,因?yàn)闀?huì)涉及到多個(gè)組件,那么這些組件又可以使用什么技術(shù)來(lái)實(shí)現(xiàn)呢?接下來(lái)的幾個(gè)小節(jié)中,我們將對(duì)這些問(wèn)題進(jìn)行詳細(xì)的講解。
對(duì)于一般的公司而言,實(shí)踐微服務(wù)有非常大的技術(shù)挑戰(zhàn),所以并不是所有的公司都適合將單體架構(gòu)拆分成微服務(wù)架構(gòu)。一般來(lái)說(shuō),微服務(wù)架構(gòu)比較適合未來(lái)有一定的擴(kuò)展復(fù)雜度,且有很大用戶(hù)增量預(yù)期的應(yīng)用,例如一些新興的互聯(lián)網(wǎng)公司應(yīng)用。這些公司在創(chuàng)業(yè)初期,不可能買(mǎi)大量的機(jī)器或者很貴的機(jī)器,但是又必須考慮應(yīng)對(duì)成功后巨量的用戶(hù)問(wèn)題,這時(shí)微服務(wù)架構(gòu)就成了最好的選擇。除此之外,對(duì)于那些項(xiàng)目規(guī)模較大、業(yè)務(wù)復(fù)雜度較高,且需要長(zhǎng)期跟進(jìn)的項(xiàng)目,也適合考慮使用微服務(wù)架構(gòu)。
在決定使用微服務(wù)架構(gòu)后,所面臨的另一個(gè)問(wèn)題就是如何將系統(tǒng)拆分為微服務(wù)。對(duì)于微服務(wù)的拆分,可以參考如下幾點(diǎn)建議:
①通過(guò)業(yè)務(wù)功能分解并定義與業(yè)務(wù)功能相對(duì)應(yīng)的服務(wù)。
②將域驅(qū)動(dòng)設(shè)計(jì)分解為多個(gè)子域。
③按照動(dòng)詞或用例分解,并定義負(fù)責(zé)特定操作的服務(wù)。例如一個(gè)負(fù)責(zé)完成訂單的航運(yùn)服務(wù)。
④通過(guò)定義一個(gè)對(duì)給定類(lèi)型的實(shí)體或資源的所有操作負(fù)責(zé)的服務(wù)來(lái)分解名詞或資源。例如一個(gè)負(fù)責(zé)管理用戶(hù)帳戶(hù)的帳戶(hù)服務(wù)。
由于每個(gè)公司項(xiàng)目的實(shí)際情況不同,所以微服務(wù)的拆分在實(shí)際操作時(shí),會(huì)涉及到很多不同的細(xì)節(jié)問(wèn)題,這里就不一一描述了,但總體來(lái)說(shuō),項(xiàng)目在拆分時(shí)按照上述幾點(diǎn)建議即可。
我們先來(lái)了解下微服務(wù)架構(gòu)中所涉及到的一些常見(jiàn)組件。這些組件的名稱(chēng)及其作用如下:
①服務(wù)注冊(cè)中心:注冊(cè)系統(tǒng)中所有服務(wù)的地方;
②服務(wù)注冊(cè):服務(wù)提供方將自己調(diào)用地址注冊(cè)到服務(wù)注冊(cè)中心,讓服務(wù)調(diào)用方能夠方便地找到自己;
③服務(wù)發(fā)現(xiàn):服務(wù)調(diào)用方從服務(wù)注冊(cè)中心找到自己需要調(diào)用服務(wù)的地址;
④負(fù)載均衡:服務(wù)提供方一般以多實(shí)例的形式提供服務(wù),使用負(fù)載均衡能夠讓服務(wù)調(diào)用方連接到合適的服務(wù)節(jié)點(diǎn);
⑤服務(wù)容錯(cuò):通過(guò)斷路器(也成熔斷器)等一系列的服務(wù)保護(hù)機(jī)制,保證服務(wù)調(diào)用者在調(diào)用異常服務(wù)時(shí)快速的返回結(jié)果,避免大量的同步等待。
⑥服務(wù)網(wǎng)關(guān):也稱(chēng)為API網(wǎng)關(guān),是服務(wù)調(diào)用的唯一入口,可以在這個(gè)組件中實(shí)現(xiàn)用戶(hù)鑒權(quán)、動(dòng)態(tài)路由、灰度發(fā)布、負(fù)載限流等功能;
⑦分布式配置中心:將本地化的配置信息(properties、yml、yaml等)注冊(cè)到配置中心,實(shí)現(xiàn)程序包在開(kāi)發(fā)、測(cè)試、生產(chǎn)環(huán)境的無(wú)差別性,方便程序包的遷移。
通過(guò)前兩個(gè)小節(jié)的學(xué)習(xí),我們已經(jīng)了解了如何將傳統(tǒng)業(yè)務(wù)拆分為微服務(wù),并熟悉了微服務(wù)架構(gòu)中所涉及到的組件。為了使讀者在整體上對(duì)微服務(wù)架構(gòu)有一個(gè)認(rèn)識(shí),下面我們通過(guò)一張圖來(lái)講解如何搭建一個(gè)微服務(wù)架構(gòu),如圖1-5所示。
圖1-5簡(jiǎn)單微服務(wù)架構(gòu)在圖1-5中,部署了一系列的微服務(wù),每個(gè)微服務(wù)都會(huì)訪(fǎng)問(wèn)自己的數(shù)據(jù)庫(kù)(Database)。當(dāng)這些微服務(wù)啟動(dòng)時(shí),會(huì)將其信息注冊(cè)到服務(wù)注冊(cè)中心(Service Registry), 在客戶(hù)端發(fā)送請(qǐng)求時(shí),請(qǐng)求首先會(huì)被API網(wǎng)關(guān)(APIGateWay)攔截,API網(wǎng)關(guān)會(huì)讀取請(qǐng)求數(shù)據(jù),并從注冊(cè)中心獲取對(duì)應(yīng)的服務(wù)信息,然后API網(wǎng)關(guān)會(huì)根據(jù)服務(wù)信息調(diào)用所需的微服務(wù)。
小提示:
圖1-5中展示的只是一個(gè)簡(jiǎn)單的微服務(wù)架構(gòu),然而要判斷一個(gè)架構(gòu)是否是微服務(wù)架構(gòu),還需要滿(mǎn)足以下幾點(diǎn)要求:
①根據(jù)業(yè)務(wù)模塊劃分服務(wù)種類(lèi);
②每個(gè)服務(wù)可獨(dú)立部署且相互隔離;
③通過(guò)輕量級(jí)API調(diào)用服務(wù);
④服務(wù)需保證良好的高可用性。
只有滿(mǎn)足以上幾點(diǎn)要求的架構(gòu),才能稱(chēng)之為微服務(wù)架構(gòu),所以在搭建微服務(wù)架構(gòu)時(shí),一定要注意這些問(wèn)題。