乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      微服務(wù)系列(四):微服務(wù)的交互模式

       xujin3 2018-02-22

      本節(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)系。

      • 提供者契約:是我們最常用的一種服務(wù)契約,顧名思義,提供者契約是以提供者為中心的,提供者提供了什么功能和消息格式,各消費(fèi)者都會(huì)無條件地遵守這些約定,不論消費(fèi)者實(shí)際需要多少功能,消費(fèi)者接受了提供者契約時(shí),都會(huì)根據(jù)服務(wù)提供者的規(guī)則來使用服務(wù)。

      • 消費(fèi)者契約:是對(duì)某個(gè)消費(fèi)者的需求進(jìn)行更為精確的描述,在一次具體的服務(wù)交互場(chǎng)景下,代表消費(fèi)者需要提供者提供功能中的哪部分?jǐn)?shù)據(jù)。消費(fèi)者契約可以被用來標(biāo)識(shí)現(xiàn)有的提供者契約,也可以用來發(fā)現(xiàn)一個(gè)尚未明確的提供者契約。

      • 消費(fèi)者驅(qū)動(dòng)的契約:代表服務(wù)提供者向其所有當(dāng)前消費(fèi)者承諾遵守的約束。一旦各消費(fèi)者把自己的具體期望告知提供者,則提供者無論在什么時(shí)間和場(chǎng)景下,都不應(yīng)該打破契約。

      在現(xiàn)實(shí)的服務(wù)交互設(shè)計(jì)中,上面這三種契約是同時(shí)存在的,筆者所在的支付平臺(tái)里,交易系統(tǒng)在完成一筆支付后,需要到賬務(wù)系統(tǒng)為商戶入賬,在這個(gè)過程中,服務(wù)契約表現(xiàn)如下。

      • 生產(chǎn)者契約:賬務(wù)系統(tǒng)提供Dubbo服務(wù)化接口,參數(shù)為商戶賬戶ID、入賬訂單號(hào)和入賬金額。

      • 消費(fèi)者契約:賬務(wù)系統(tǒng)返回DTO,包含商戶賬戶ID、入賬訂單號(hào)、入賬金額、入賬時(shí)間、賬務(wù)流水號(hào)、入賬狀態(tài)等,而交易系統(tǒng)只需使用其中的入賬訂單號(hào)和入賬狀態(tài)。

      • 消費(fèi)者驅(qū)動(dòng)的契約:為了保證資金安全,交易系統(tǒng)作為入賬的發(fā)起者向賬務(wù)提出要求,需要賬務(wù)做冪等和濾重處理,對(duì)重復(fù)的入賬請(qǐng)求進(jìn)行攔截;賬務(wù)系統(tǒng)在接受這個(gè)契約后,即使將來有任何改變,也不能打破這個(gè)限制,否則就會(huì)造成資金的損失,這在金融系統(tǒng)中是最嚴(yán)重的問題。

      服務(wù)之間的交互需要使用的三種服務(wù)契約如圖1-10所示。


      圖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所示。


      圖1-11


      這種交互流程的缺點(diǎn)如下。

      • 使得微服務(wù)之間的交互除了接口契約,還存在數(shù)據(jù)存儲(chǔ)契約。

      • 上游的數(shù)據(jù)格式發(fā)生變化時(shí),可能導(dǎo)致下游的處理邏輯出現(xiàn)問題。

      • 多個(gè)服務(wù)共享一個(gè)資源服務(wù),對(duì)資源服務(wù)的運(yùn)維難以劃清職責(zé)和界限。

      • 在做雙機(jī)房獨(dú)立部署時(shí),需要考慮服務(wù)和資源的路由情況,跨機(jī)房的服務(wù)調(diào)用不能使用獨(dú)立的資源部署模式,因此難以實(shí)現(xiàn)服務(wù)自治。

      因此,在設(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)


      做互聯(lián)網(wǎng)時(shí)代最適合的架構(gòu)

      開放、分享、協(xié)作

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多