日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
成為工程師-搭建系統(tǒng)先搭建框架

作為工程師,日常的工作基本上都是圍繞著【系統(tǒng)】展開(kāi)的?!敬罱ㄒ粋€(gè)系統(tǒng)】是工程師必須具備的最基礎(chǔ)能力。

從業(yè)至今,我自己負(fù)責(zé)過(guò)很多系統(tǒng),也看到過(guò)很多系統(tǒng)。有的系統(tǒng)搭建得非常優(yōu)雅,無(wú)論是可讀性還是擴(kuò)展性都非常好。說(shuō)白了就是代碼看起來(lái)清晰干凈,研發(fā)起來(lái)快捷且安全,排查問(wèn)題也容易定位。但還有一些系統(tǒng)你就是看上好幾遍代碼都捋不清邏輯,改造的時(shí)候更是無(wú)從下手。

一個(gè)系統(tǒng)存在復(fù)雜的業(yè)務(wù)邏輯是正常的,而一個(gè)優(yōu)雅的系統(tǒng)是能夠通過(guò)良好的結(jié)構(gòu)去管理這些復(fù)雜性。我把這個(gè)結(jié)構(gòu)稱之為【系統(tǒng)框架】。

搭建系統(tǒng)框架是系統(tǒng)建設(shè)的第一步,也是最重要一步。我們這篇文章就來(lái)聊聊如何搭建一個(gè)好的系統(tǒng)框架。

我們先看一個(gè)反例:

反例時(shí)間

假設(shè)我們有一個(gè)http接口,需要返回用戶的信息。用戶信息包括:用戶昵稱、用戶vip等級(jí)、用戶標(biāo)簽、用戶余額、余額歷史以來(lái)充值總額、用戶最貴一次消費(fèi)。

下面的代碼是一種典型的實(shí)現(xiàn)方式(可以看注釋來(lái)了解步驟):

很多同學(xué)看到這樣的代碼覺(jué)得已經(jīng)挺好了。有日志、有注釋、有異常處理,代碼也沒(méi)有擠在一堆。但真的是這樣嗎?

我認(rèn)為這樣的代碼確實(shí)反映了工程師一定的技術(shù)素養(yǎng),但起碼存在以下這些問(wèn)題:

【Q1】如果新增接口,所有的日志打印要冗余寫一遍,包括入口日志、出口日志、異常日志。

【Q2】如果新增接口,try-catch的異常處理邏輯也需要冗余重寫。

【Q3】如果新增一個(gè)只獲取用戶金額信息的接口,需要冗余復(fù)制上述代碼中和金額相關(guān)的部分。

【Q4】如果接口需要修改,返回新的信息,那就需要往這個(gè)代碼里添加新的業(yè)務(wù)邏輯。而這個(gè)類一旦有變化,就涉及對(duì)這個(gè)類的回歸驗(yàn)證。

【Q5】如果我要同時(shí)支持可以根據(jù)用戶昵稱來(lái)搜索用戶信息,那么我要新增一個(gè)基本完全一樣的接口(除了入?yún)⒉煌?/p>

(記住以上這些問(wèn)題,我們下面會(huì)逐一來(lái)解決)

所以,如果用發(fā)展的眼光(需求新增)去看這段代碼,你可以基本判斷以后會(huì)存在大量的邏輯冗余。

大量的冗余會(huì)帶來(lái)研發(fā)的低效、升級(jí)的遺漏、邏輯不一致的風(fēng)險(xiǎn)等等。

此外,不同工程師可能都有自己的編碼習(xí)慣,同樣是處理日志,異常,寫法可以迥然不同。

結(jié)合在大廠多年的經(jīng)驗(yàn),優(yōu)雅的系統(tǒng)會(huì)結(jié)合兩種設(shè)計(jì)方式來(lái)解決這類冗余的問(wèn)題。我們一起來(lái)看看。

一、模板模式

【模板模式】就是設(shè)計(jì)模式中的“模板方法模式”。模板方法模式的核心思想就是:統(tǒng)一算法框架,暴露算法要素給子類來(lái)實(shí)現(xiàn)。

看定義還是抽象了一些,我們直接看例子。

下圖就是一個(gè)定義了算法框架的抽象模板類:

可以看到,process方法里僅做了兩件事:

【1】實(shí)現(xiàn)了所有接口的共用邏輯。比如打日志、計(jì)算耗時(shí)、捕獲異常并處理。

【2】確定了步驟(步驟也稱之為算法框架)。比如先校驗(yàn)參數(shù),后執(zhí)行業(yè)務(wù)邏輯。

基于上面的模板,我們的服務(wù)只需要做如下實(shí)現(xiàn)就可以了:

下面我們根據(jù)【模板模式】的思想修改我們的反面案例,我們的代碼就變成了:

可以看到,通過(guò)模板模式,你起碼會(huì)有這樣幾個(gè)好處:

【1】每個(gè)接口都不用擔(dān)心忘了執(zhí)行必要的公共邏輯,例如打印日志、異常處理。

【2】不用擔(dān)心接口有遺漏步驟及搞錯(cuò)步驟順序,例如入?yún)⑿r?yàn)在執(zhí)行業(yè)務(wù)流程之前。

【3】接口只需要關(guān)心自己業(yè)務(wù)邏輯的實(shí)現(xiàn)即可。

【4】所有接口打印的日志及異常處理方式確保是一致的,方便監(jiān)控和定位問(wèn)題。

【5】如果需要增加一些公用的能力,例如埋點(diǎn)上報(bào)某個(gè)統(tǒng)計(jì)平臺(tái),只需要在框架中添加邏輯,所有接口都直接生效。

我們使用【模板模式】解決了業(yè)務(wù)無(wú)關(guān)邏輯的冗余問(wèn)題,也就是上述針對(duì)反面例子提出的問(wèn)題中的Q1、Q2,下一步我們要?jiǎng)邮纸鉀Q業(yè)務(wù)邏輯冗余的問(wèn)題,也就是針對(duì)問(wèn)題Q3、Q4、Q5。

二、流程引擎

流程引擎的核心思想是:將要執(zhí)行的邏輯看成是一個(gè)個(gè)步驟的串接,由統(tǒng)一的角色來(lái)管理步驟的執(zhí)行順序,這個(gè)角色就是流程引擎。

我們用兩張圖來(lái)對(duì)比下使用流程引擎和常規(guī)瀑布式編碼的不同。

1.流程式編碼 vs 瀑布式編碼

上圖分別展示了兩種編碼法方式【瀑布式編碼】和【流程式代碼】。

【瀑布式編碼】就是從上往下按照步驟把業(yè)務(wù)邏輯寫完。

【流程式編碼】是先把可以獨(dú)立的功能抽成一個(gè)個(gè)執(zhí)行器。不同的服務(wù)根據(jù)自己功能的需求來(lái)串接這些執(zhí)行器。

兩者對(duì)比,流程式編碼有這樣一些好處:

【避免冗余】:同樣的業(yè)務(wù)邏輯只有一份代碼。

【最小修改】:如果需要加一個(gè)環(huán)節(jié),只需要新增一個(gè)處理器,并且編排到流程中即可,對(duì)已有代碼沒(méi)有任何侵入。

【方便追蹤】:我們可以在每一個(gè)節(jié)點(diǎn)執(zhí)行完以后,在流程引擎中添加一些日志,以此來(lái)追蹤執(zhí)行過(guò)程。例如在哪里中斷了?哪個(gè)執(zhí)行器耗時(shí)最長(zhǎng)?

【利于分工】:每個(gè)處理器約定好職責(zé)就可以獨(dú)立開(kāi)發(fā),并且可以獨(dú)立測(cè)試。

【可讀性好】:流程式代碼往往在一處編輯所有的步驟,代碼可讀性佳??吹揭粋€(gè)流程由哪些節(jié)點(diǎn)組成,基本上就了解大概的邏輯了。

【靈活多變】:流程式編程還可以支持各個(gè)處理器以分支和循環(huán)的方式組合。

下面我們就來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的流程引擎,并用它來(lái)繼續(xù)改造上面的反例,以此來(lái)說(shuō)明【流程式編程】的思想和好處。

2.處理器設(shè)計(jì)

我們先看下處理器的實(shí)現(xiàn),處理器是被我們抽取出來(lái)處理一塊業(yè)務(wù)邏輯的單元。如下圖標(biāo)識(shí)

在反例里,我們可以抽取三個(gè)處理器?!居脩粜畔⑻幚砥鳌俊窘痤~處理器】【消費(fèi)記錄處理器】。處理器接口如下:

細(xì)心的同學(xué)可能會(huì)問(wèn),ProcessRequest和ProcessContext是什么?

【ProcessRequest】:對(duì)請(qǐng)求信息的封裝。例如用戶的userId、用戶的客戶端信息(IOS、安卓、以及對(duì)應(yīng)版本號(hào))、要求轉(zhuǎn)賬的金額、轉(zhuǎn)賬對(duì)象等。每個(gè)處理器都能夠獲得這些信息,根據(jù)自己的需要去使用。ProcessRequest中所有的值,原則上不允許被修改,以免原始請(qǐng)求信息被污染。

【ProcessContext】:流程執(zhí)行的上下文,用于存放整個(gè)流程執(zhí)行過(guò)程中的數(shù)據(jù)。在所有執(zhí)行器處理完以后,結(jié)果組裝器可以從ProcessContext中獲取到各種結(jié)果數(shù)據(jù),構(gòu)造返回結(jié)果。

接著我們基于Processor接口,實(shí)現(xiàn)三個(gè)具體的處理器:

我們處理器就搞定了,等著流程引擎來(lái)喚起他們吧!

3.流程引擎設(shè)計(jì)

下面我們來(lái)看流程引擎的設(shè)計(jì),如下圖標(biāo)識(shí),可以把這些箭頭的控制理解為流程引擎。流程引擎的核心作用就是控制處理器按照指定順序執(zhí)行:

下面是流程引擎接口:

流程引擎只有一個(gè)start接口用來(lái)啟動(dòng)流程。

以下是流程引擎抽象類。抽象類除了實(shí)現(xiàn)對(duì)處理器執(zhí)行的控制外,還可以包括日志打印、異常處理等操作。

那一個(gè)流程引擎需要執(zhí)行哪些處理器呢?這由子類決定,子類通過(guò)實(shí)現(xiàn)getProcessors()抽象方法來(lái)指定使用的處理器。你看,這里又有模板模式了是不。

下面看下我們具體的引擎子類是怎樣的:

可以看到,引擎子類實(shí)現(xiàn)getProcessors()方法即可。此方法就是告訴流程引擎具體要執(zhí)行的執(zhí)行器列表及執(zhí)行順序。

如果你走讀代碼到這里,看到list里放的三個(gè)處理器名稱,你基本上就知道“用戶查詢接口”提供了怎樣的功能。這就是良好的可讀性。

試想,如果有一天,一個(gè)流程中需要新增一個(gè)邏輯,我們可以包裝一個(gè)新的處理器,然后添加到上圖中的processorList中即可。

每個(gè)接口都可以實(shí)現(xiàn)一個(gè)如上截圖的引擎子類,用以編排需要執(zhí)行的處理器。

4.主入口的改造

當(dāng)引入流程引擎后,我們的主入口(controller)就可以改造成如下這樣(我們附上和之前兩個(gè)版本的對(duì)比圖):

你可以很明顯的看到在改造之后,由于業(yè)務(wù)邏輯被內(nèi)聚到一個(gè)個(gè)處理器中,入口處的代碼變得簡(jiǎn)單清晰。同時(shí)你再也不用害怕每次業(yè)務(wù)需求都要改這個(gè)類,從而變得的膨脹不堪。

5.流程引擎設(shè)計(jì)一覽

我們已經(jīng)看到了整個(gè)流程引擎的實(shí)現(xiàn)過(guò)程。最后我們?cè)儆靡粡堫悎D來(lái)一覽整個(gè)設(shè)計(jì),相信會(huì)幫助你更好地了解這種設(shè)計(jì)方法:

今日總結(jié)

今天,我們正式進(jìn)入到【成為工程師】的細(xì)節(jié)內(nèi)容。我們提到,一個(gè)工程師最基礎(chǔ)的能力就是搭建系統(tǒng)。而一個(gè)系統(tǒng)要搭建得好,首先就要有一個(gè)好的系統(tǒng)框架。

我們先是通過(guò)一個(gè)反例來(lái)說(shuō)明了典型的瀑布式編碼存在的問(wèn)題。繼而講了通過(guò)模板模式和流程引擎兩種設(shè)計(jì)方式來(lái)優(yōu)化瀑布式設(shè)計(jì)。以此讓系統(tǒng)的擴(kuò)展變得”容易、安全且規(guī)范“。

對(duì)于流程引擎,我們只是給出了一種最最基礎(chǔ)的實(shí)現(xiàn)方式而已,但是對(duì)于很多系統(tǒng)來(lái)說(shuō),這么設(shè)計(jì)已經(jīng)足夠了。事實(shí)上,真正強(qiáng)大的流程引擎還包括【分支循環(huán)】【異步化】【可視化界面管理】等各種高階功能,你可以自己做一些了解。

不過(guò),流程引擎的選擇需要結(jié)合實(shí)際情況,不然也會(huì)引入額外的復(fù)雜度。

建議你收藏這篇文章,當(dāng)你碰到系統(tǒng)設(shè)計(jì)問(wèn)題的時(shí)候,可以回頭來(lái)看看,相信可以幫助到你。

下一章我們會(huì)接著講系統(tǒng)設(shè)計(jì)方面的問(wèn)題,來(lái)講講一個(gè)系統(tǒng)要如何分層。

加油吧,未來(lái)的架構(gòu)師們!

本文轉(zhuǎn)載自微信公眾號(hào)「 CodingBetterLife」,作者「 趙志強(qiáng) 」,可以通過(guò)以下二維碼關(guān)注。

轉(zhuǎn)載本文請(qǐng)聯(lián)系「 CodingBetterLife」公眾號(hào)。


網(wǎng)頁(yè)名稱:成為工程師-搭建系統(tǒng)先搭建框架
文章源于:http://m.5511xx.com/article/dpicode.html