本節(jié)介紹微服務(wù)之間交互的通用設(shè)計(jì)模式,這些設(shè)計(jì)模式對(duì)微服務(wù)之間的交互定義契約,服務(wù)的生產(chǎn)者和調(diào)用者都需要遵守這些契約,才能保證微服務(wù)不出問題。 1. 讀者容錯(cuò)模式 讀者容錯(cuò)模式(Tolerant Reader)指微服務(wù)化中服務(wù)提供者和消費(fèi)者之間如何對(duì)接口的改變進(jìn)行容錯(cuò)。從字面上來講,消費(fèi)者需要對(duì)提供者提供的功能進(jìn)行兼容性設(shè)計(jì),尤其對(duì)服務(wù)提供者返回的內(nèi)容進(jìn)行兼容,或者解決在服務(wù)提供者改變接口或者數(shù)據(jù)的格式的情況下,如何讓服務(wù)消費(fèi)者正常運(yùn)行。 任何一個(gè)產(chǎn)品在設(shè)計(jì)時(shí)都無法預(yù)見將來可能增加的所有需求,服務(wù)的開發(fā)者通常通過迭代及時(shí)地增加新功能,或者讓服務(wù)提供的API自然地演進(jìn)。不過,服務(wù)提供者對(duì)外提供的接口的數(shù)據(jù)格式的改變、增加和刪除,都會(huì)導(dǎo)致服務(wù)的消費(fèi)者不能正常工作。 因此,在服務(wù)消費(fèi)者處理服務(wù)提供者返回的消息的過程中,需要對(duì)服務(wù)返回的消息進(jìn)行過濾,只提取自己需要的內(nèi)容,對(duì)多余或者未知的內(nèi)容采取拋棄的策略,而不是硬生生地拋錯(cuò)處理。 在實(shí)現(xiàn)過程中不推薦使用嚴(yán)格的校驗(yàn)策略,而是推薦使用寬松的校驗(yàn)策略,即使服務(wù)消費(fèi)者拿到的消息報(bào)文發(fā)生了改變,程序也只需盡最大努力提取需要的數(shù)據(jù),同時(shí)忽略不可識(shí)別的數(shù)據(jù)。只有在服務(wù)消費(fèi)者完全不能識(shí)別接收到的消息,或者無法通過識(shí)別的信息繼續(xù)處理流程時(shí),才能拋出異常。 服務(wù)的消費(fèi)者的容錯(cuò)模式忽略了新的消息項(xiàng)、可選的消息項(xiàng)、未知的數(shù)據(jù)值及服務(wù)消費(fèi)者不需要的數(shù)據(jù)項(xiàng)。 筆者當(dāng)前在某個(gè)支付公司工作,公司里幾乎每個(gè)業(yè)務(wù)都需要使用枚舉類型,在微服務(wù)平臺(tái)下,筆者在研發(fā)流程規(guī)范中定義了一條枚舉值使用規(guī)范: 在服務(wù)接口的定義中,參數(shù)可以使用枚舉值,在返回值的DTO中禁止使用枚舉值。 這條規(guī)范就是讀者容錯(cuò)模式在實(shí)踐中的一個(gè)實(shí)例,之所以在參數(shù)中允許使用枚舉值,是因?yàn)槿绻?wù)的提供者升級(jí)了接口,增加了枚舉值,若服務(wù)的消費(fèi)者并沒有感知,則服務(wù)的消費(fèi)者得知新的枚舉值就可以傳遞新的枚舉值了;但是如果接口的返回DTO中使用了枚舉值,并且因?yàn)槟撤N原因增加了枚舉值,則服務(wù)消費(fèi)者在反序列化枚舉時(shí)就會(huì)報(bào)錯(cuò),因此在返回值中我們應(yīng)該使用字符串等互相認(rèn)可的類型,來做到雙方的互相兼容,并實(shí)現(xiàn)讀者容錯(cuò)模式。 2. 消費(fèi)者驅(qū)動(dòng)契約模式 消費(fèi)者驅(qū)動(dòng)契約模式用來定義服務(wù)化中服務(wù)之間交互接口改變的最佳規(guī)則。 服務(wù)契約分為:提供者契約、消費(fèi)者契約及消費(fèi)者驅(qū)動(dòng)的契約,它從期望與約束的角度描述了服務(wù)提供者與服務(wù)消費(fèi)者之間的聯(lián)動(dòng)關(guān)系。
在現(xiàn)實(shí)的服務(wù)交互設(shè)計(jì)中,上面這三種契約是同時(shí)存在的,筆者所在的支付平臺(tái)里,交易系統(tǒng)在完成一筆支付后,需要到賬務(wù)系統(tǒng)為商戶入賬,在這個(gè)過程中,服務(wù)契約表現(xiàn)如下。
服務(wù)之間的交互需要使用的三種服務(wù)契約如圖1-10所示。 從圖1-10可以看到,服務(wù)提供者契約是服務(wù)提供者單方面定下的規(guī)則,而一個(gè)消費(fèi)者契約會(huì)成為提供者契約的一部分,多個(gè)服務(wù)消費(fèi)者可以對(duì)服務(wù)提供者提出約束,服務(wù)提供者需要在將來遵守服務(wù)消費(fèi)者提出的契約,這就是消費(fèi)者驅(qū)動(dòng)的契約。 3. 去數(shù)據(jù)共享模式 與SOA服務(wù)化對(duì)比,微服務(wù)是去ESB總線、去中心化及分布式的;而SOA還是以ESB為核心實(shí)現(xiàn)遺留系統(tǒng)的集成,以及基于Web Service為標(biāo)準(zhǔn)實(shí)現(xiàn)的通用的面向服務(wù)的架構(gòu)。在微服務(wù)領(lǐng)域,微服務(wù)之間的交互通過定義良好的接口來實(shí)現(xiàn),不允許使用共享數(shù)據(jù)來實(shí)現(xiàn)。 在實(shí)踐的過程中,有些方案的設(shè)計(jì)使用緩存或者數(shù)據(jù)庫作為兩個(gè)微服務(wù)之間的紐帶,在業(yè)務(wù)流程的處理過程中,為了處理簡(jiǎn)單,前一個(gè)服務(wù)將中間結(jié)果存入數(shù)據(jù)庫或者緩存,下一個(gè)服務(wù)從緩存或者數(shù)據(jù)庫中拿出數(shù)據(jù)繼續(xù)處理。處理流程如圖1-11所示。 這種交互流程的缺點(diǎn)如下。
因此,在設(shè)計(jì)微服務(wù)架構(gòu)時(shí),一定不要共享緩存和數(shù)據(jù)庫等資源,也不要使用總線模式,服務(wù)之間的通信和交互只能依賴定義良好的接口,通常使用RESTful樣式的API或者透明的RPC調(diào)用框架。 推薦一起學(xué)習(xí)《分布式服務(wù)架構(gòu):原理、設(shè)計(jì)與實(shí)戰(zhàn)》一書,它是一本不可多得的理論與實(shí)踐相結(jié)合的架構(gòu)秘籍,是作者多年工作經(jīng)驗(yàn)積累的結(jié)晶。京東購買請(qǐng)掃描下方二維碼。 如果你想成為優(yōu)秀的架構(gòu)師 在【云時(shí)代架構(gòu)】精品群免費(fèi)進(jìn)! 我在【云時(shí)代架構(gòu)】技術(shù)社區(qū),你在哪里? 還等什么,趕快加入【云時(shí)代架構(gòu)】技術(shù)社區(qū)! 請(qǐng)猛掃下面二維碼。 云時(shí)代架構(gòu)
|
|