新聞中心
Part 01
微服務(wù)的概念
在傳統(tǒng)軟件開發(fā)中,整個應(yīng)用的代碼都組織在一個單一的代碼庫,一般會有以下拆分代碼的方式:一是按照特征做代碼拆分,如MVC模式;二是按照功能做拆分,在更大的項目中將代碼封裝在處理不同業(yè)務(wù)的包中,包內(nèi)部再做拆分。

成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比霍城網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式霍城網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋霍城地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。
無論怎么拆分,最終二者的代碼都會集中在一個庫中進(jìn)行開發(fā)的管理,而微服務(wù)則是上述第二種拆分方法的拓展,其將代碼按功能拆分為好幾個包,每個都是可獨(dú)立運(yùn)行的單一代碼庫,其區(qū)別如下:
傳統(tǒng)代碼庫與微服務(wù)代碼庫區(qū)別
微服務(wù)相較于傳統(tǒng)開發(fā)來說大大降低了開發(fā)維護(hù)復(fù)雜度且提高了業(yè)務(wù)拓展性。在傳統(tǒng)單一代碼庫的應(yīng)用中,模塊之間是緊耦合且邊界模糊的,隨著產(chǎn)品的深入迭代,代碼的開發(fā)和維護(hù)將變得更加復(fù)雜,潛在的bug和漏洞也不可避免的會越來越多,而將整個應(yīng)用的代碼按功能對應(yīng)拆分為小且獨(dú)立的微代碼服務(wù)庫,模塊耦合度減小、各模塊間邊界進(jìn)一步清晰。在傳統(tǒng)項目開發(fā)中,可能會有一部分代碼會在多個模塊中頻繁地被用到,這種復(fù)用性很高的模塊常常被抽離出來作為公共代碼庫使用,當(dāng)此功能要拓展功能時,單一代碼庫的規(guī)模只增不減,整個應(yīng)用還需重新部署。而在微服務(wù)框架中,高復(fù)用模塊可作為單個服務(wù)獨(dú)立出來,可獨(dú)立運(yùn)行、測試和部署。
微服務(wù)是一種架構(gòu)理念而不是具體的框架項目,許多編程語言都可以實(shí)現(xiàn),但有的語言對微服務(wù)開發(fā)有天生的優(yōu)勢,Golang便是之一。Golang本身十分輕便,運(yùn)行效率極高,同時對并發(fā)編程有著原生的支持,從而能更好的利用多核處理器。這里介紹一種成熟的golang分布式微服務(wù)框架—go-zero。
Part 02
使用go-zero微服務(wù)框架的好處
- 輕松獲得支撐千萬日活服務(wù)的穩(wěn)定性;
- 內(nèi)建級聯(lián)超時控制、限流、自適應(yīng)熔斷、自適應(yīng)降載等微服務(wù)治理能力,無需配置和額外代碼;
- 微服務(wù)治理中間件可無縫集成到其他現(xiàn)有框架使用;
- 極簡API描述一鍵生成各端代碼;
- 自動校驗(yàn)客戶端請求參數(shù)合法性;
- 擁有大量微服務(wù)治理和并發(fā)工具包,社區(qū)生態(tài)優(yōu)秀。
go-zero架構(gòu)圖
Part 03
熔斷原理及實(shí)現(xiàn)
熔斷在微服務(wù)中服務(wù)間非常常見,比如評論服務(wù)依賴審核服務(wù)而審核服務(wù)又依賴反垃圾服務(wù),當(dāng)評論服務(wù)調(diào)用審核服務(wù)時,審核服務(wù)又調(diào)用反垃圾服務(wù),這時如果反垃圾服務(wù)宕機(jī)超時會導(dǎo)致審核服務(wù)一直等待,評論服務(wù)又在一直調(diào)用審核服務(wù),這樣就會導(dǎo)致請求大量堆積導(dǎo)致所有服務(wù)宕機(jī)。
由此可見,在整個調(diào)用鏈中,中間某個環(huán)節(jié)出現(xiàn)異常會引起上游調(diào)用服務(wù)出現(xiàn)一系列問題,甚至導(dǎo)致整個調(diào)用鏈的服務(wù)都宕機(jī)。因此一個服務(wù)作為調(diào)用方調(diào)用另一個服務(wù)時,為了防止被調(diào)用服務(wù)出現(xiàn)問題進(jìn)而導(dǎo)致調(diào)用服務(wù)出現(xiàn)問題,所有調(diào)用服務(wù)器需要進(jìn)行自我保護(hù),而常用的保護(hù)手段就是熔斷。
評論-審核-反垃圾服務(wù)調(diào)用圖
熔斷器原理:熔斷機(jī)制參考了日常生活中的保險絲的保護(hù)機(jī)制,電路超負(fù)荷運(yùn)行時,保險絲會自動斷開,從而保證電路中的電器不受損害。服務(wù)中的熔斷機(jī)制指發(fā)起服務(wù)器調(diào)用時候,如果被調(diào)用方法返回的錯誤率超過閾值,那么將不會真正發(fā)起請求而是在調(diào)用方法時直接返回錯誤。
在熔斷器模式下,服務(wù)調(diào)用方為每一個調(diào)用服務(wù)維護(hù)一個狀態(tài)機(jī),在此狀態(tài)機(jī)中有三個狀態(tài):
1.關(guān)閉(Closed):在此狀態(tài)下,我們需要一個計數(shù)器來記錄調(diào)用失敗的次數(shù)和總的請求次數(shù),如果在某個時間窗口內(nèi),失敗的失敗率達(dá)到預(yù)設(shè)的閾值,則切換到斷開狀態(tài),此時開啟一個超時時間,當(dāng)?shù)竭_(dá)該時間則切換到半關(guān)閉狀態(tài),該超時時間是給了系統(tǒng)一次機(jī)會來修正導(dǎo)致調(diào)用失敗的錯誤,以回到正常的工作狀態(tài)。在關(guān)閉狀態(tài)下,調(diào)用錯誤是基于時間的,在特定的時間間隔內(nèi)會重置,這能夠防止偶然錯誤導(dǎo)致熔斷器進(jìn)入斷開狀態(tài)。
2. 打開(Open):在該狀態(tài)下,發(fā)起請求時會立即返回錯誤,一般會啟動一個超時計時器,當(dāng)計時器超時后,狀態(tài)切換到半打開狀態(tài),也可以設(shè)置一個定時器,定期的探測服務(wù)是否恢復(fù)。
3. 半打開(Half-Open):在該狀態(tài)下,允許應(yīng)用程序一定數(shù)量的請求發(fā)往被調(diào)用服務(wù),如果這些調(diào)用正常,那么可以認(rèn)為被調(diào)用服務(wù)已經(jīng)恢復(fù)正常,此時熔斷器切換到關(guān)閉狀態(tài),同時需要重置計數(shù)。如果這部分仍有調(diào)用失敗的情況,則認(rèn)為被調(diào)用方仍然沒有恢復(fù),熔斷器會切換到打開狀態(tài),然后重置計數(shù)器,半打開狀態(tài)能夠有效防止正在恢復(fù)中的服務(wù)被突然大量請求再次打垮。
熔斷器狀態(tài)集?
Part 04
go-zero并發(fā)編程
在微服務(wù)開發(fā)中,api網(wǎng)管扮演對外提供restful api的角色,而api的數(shù)據(jù)往往以來其他服務(wù),復(fù)雜的api更是會依賴多個甚至數(shù)十個服務(wù),雖然單個被依賴服務(wù)的耗時一般較低但如果多個服務(wù)串行依賴的話那么整個api的耗時將會大大增加。
那么通過什么手段來優(yōu)化呢?我們首先想到的是通過并發(fā)來的方式來處理依賴,這樣就能降低整個依賴的耗時,Go基礎(chǔ)庫中為我們提供了 WaitGroup 工具用來進(jìn)行并發(fā)控制,但實(shí)際業(yè)務(wù)場景中多個依賴如果有一個出錯我們期望能立即返回而不是等所有依賴都執(zhí)行完再返回結(jié)果,而且WaitGroup中對變量的賦值往往需要加鎖,每個依賴函數(shù)都需要添加Add和Done對于新手來說比較容易出錯。
基于以上的背景,go-zero框架中為我們提供了并發(fā)處理工具M(jìn)apReduce,MapReduce是Google提出的一個軟件架構(gòu),用于大規(guī)模數(shù)據(jù)集的并行運(yùn)算,go-zero中的MapReduce工具正是借鑒了這種架構(gòu)思想,go-zero框架中的MapReduce工具主要用來對批量數(shù)據(jù)進(jìn)行并發(fā)的處理,以此來提升服務(wù)的性能。
MapReduce原理圖
當(dāng)前文章:微服務(wù)在Golang開發(fā)中的實(shí)現(xiàn)方案
網(wǎng)頁鏈接:http://m.fisionsoft.com.cn/article/dhsdeph.html


咨詢
建站咨詢
