3.5 實(shí)現(xiàn)業(yè)務(wù)與技術(shù)的分離


我們在3.1章節(jié)中講到了需求功能拆分為業(yè)務(wù)功能和數(shù)據(jù)功能,業(yè)務(wù)功能的核心是業(yè)務(wù)模型。
那么在這個架構(gòu)中,還存在哪些技術(shù)問題呢?先梳理一下相關(guān)的技術(shù)點(diǎn):
1. 角色管理
? 經(jīng)常有人問,角色管理與模型如何交互??
? 角色管理中的角色權(quán)限劃分以及對應(yīng)代碼上的角色權(quán)限約定,他是數(shù)據(jù)角色權(quán)限模型下的角色功能,我們在做業(yè)務(wù)建模的時候,需要將角色權(quán)限模型和我們的業(yè)務(wù)模型分開設(shè)計,角色權(quán)限管理關(guān)注的是什么用戶在什么條件下可以訪問什么資源的問題,業(yè)務(wù)模型是系統(tǒng)本身的業(yè)務(wù)流程過程,不要將其合并在一起建模。
權(quán)限通常劃分為功能權(quán)限和數(shù)據(jù)權(quán)限:
功能權(quán)限是指誰可以訪問這個功能
? ? ? ?針對功能權(quán)限,我們可以采用SpringBoot Security框架來解決,依賴權(quán)限注解來實(shí)現(xiàn)。
數(shù)據(jù)權(quán)限是指誰可以訪問這些數(shù)據(jù)
? ? ? ? 數(shù)據(jù)權(quán)限,是對數(shù)據(jù)訪問層的權(quán)限,這個可以開發(fā)一個數(shù)據(jù)權(quán)限的框架,根據(jù)用戶的數(shù)據(jù)權(quán)限查詢相關(guān)的數(shù)據(jù),然后返回數(shù)據(jù),再就是通過數(shù)據(jù)的攔截器,就是數(shù)據(jù)的查詢是完整的查詢,然后根據(jù)用戶的權(quán)限適配返回的數(shù)據(jù)結(jié)構(gòu)。
2. 數(shù)據(jù)處理
? ?數(shù)據(jù)處理可以分為多種技術(shù),1是模型的持久化、2是數(shù)據(jù)轉(zhuǎn)化為模型、3是數(shù)據(jù)緩存、4數(shù)據(jù)同步
1. 模型的持久化
? ? ? 模型的持久化就是將模型產(chǎn)生的數(shù)據(jù)實(shí)現(xiàn)保存的邏輯,對于建議將業(yè)務(wù)模型和數(shù)據(jù)模型分離,然后通過數(shù)據(jù)模型和業(yè)務(wù)模型的適配完成對數(shù)據(jù)模型的數(shù)據(jù)填充,然后在通過數(shù)據(jù)模型的ORM等相關(guān)的框架完成對數(shù)據(jù)的存儲。
? ? ? 這里我們會看到經(jīng)??吹叫枰獙ο笞鲛D(zhuǎn)化Convert處理,有人感覺會比較多余,讓本來就簡單的業(yè)務(wù)變個復(fù)雜。從而讓人產(chǎn)生一個讓本來簡單的事情,變得復(fù)雜化的感覺。
? ? ? ?我來談一下為什么這樣處理。如果不講業(yè)務(wù)模型和數(shù)據(jù)模型分離開,那么我們的業(yè)務(wù)模型將會受限于數(shù)據(jù)持久化的技術(shù)過程影響, 這樣會污染業(yè)務(wù)模型的純凈度,會讓我們的業(yè)務(wù)模型在未來的變化過程中受限于技術(shù),因此我們需要將其分離開。我們可以尋找更簡化的技術(shù)方案,或者自己開發(fā)一些模型方來來解決這個問題。
如下為3.2章節(jié)的代碼:
? ?2. 數(shù)據(jù)轉(zhuǎn)化為模型
? ? ? 數(shù)據(jù)轉(zhuǎn)化為模型,是將存儲在持久化的數(shù)據(jù)轉(zhuǎn)化為模型的過程,上述代碼中的 ?public static User convert(UserEntity userEntity)
?就是做這件事情的。也是由于我們的業(yè)務(wù)模型和數(shù)據(jù)模型分離,所以需要有這一步的操作,如果你有更加的技術(shù)方式,也可以直接將數(shù)據(jù)轉(zhuǎn)化為模型對象。
? ? 3. 數(shù)據(jù)緩存
? ?數(shù)據(jù)緩存我們可能采用redis、ES等相關(guān)的技術(shù)方案,站在業(yè)務(wù)模型的角度,其實(shí)數(shù)據(jù)緩存也是一種數(shù)據(jù)持久化的方式,只是持久化的地方不同罷了。
? ?
? ?4.數(shù)據(jù)同步
? ?數(shù)據(jù)同步我們根據(jù)技術(shù)的特別分為主動同步和被動同步兩種不同的數(shù)據(jù)同步方式。?
?? 主動同步:我們?yōu)榱四承?shù)據(jù)的查詢方便會選擇性的將部分?jǐn)?shù)據(jù)同步在多個地方存儲,為了方便查詢,這時候我們就可以在數(shù)據(jù)持久化的過程中對需要通過同步的數(shù)據(jù),做同步的處理,實(shí)現(xiàn)數(shù)據(jù)多地的存儲。?
?? 被動同步:例如為了提升系統(tǒng)的效率,我們將系統(tǒng)的數(shù)據(jù)庫設(shè)置為讀寫分離,那么這樣的機(jī)制下數(shù)據(jù)的同步可能是依靠數(shù)據(jù)庫層面的技術(shù)或中間價來實(shí)現(xiàn)的。這樣的過程對于我們技術(shù)層面的影響不大。
3.統(tǒng)計分析
? ?數(shù)據(jù)的統(tǒng)計功能是很多業(yè)務(wù)系統(tǒng)中所必要的功能模塊,統(tǒng)計功能通常也是多變的,我們將數(shù)據(jù)的統(tǒng)計優(yōu)化,數(shù)據(jù)查詢,數(shù)據(jù)呈現(xiàn)轉(zhuǎn)化等技術(shù)都作為統(tǒng)計分析技術(shù),這些都與采用的技術(shù)的相關(guān)性非常高。
? ? ? 為了提升數(shù)據(jù)統(tǒng)計分析能力,我們可能會采用多種方式來應(yīng)對,我們主要以數(shù)據(jù)存儲角度來分析,咱不考慮數(shù)據(jù)的使用層面,數(shù)據(jù)使用層面就是結(jié)合相關(guān)的數(shù)據(jù)呈現(xiàn)機(jī)制來設(shè)計相關(guān)的存儲方案。
建立緩存或者搜索引擎
通過數(shù)據(jù)的冗余同步實(shí)現(xiàn)數(shù)據(jù)的快速查詢
通過動態(tài)的數(shù)據(jù)存儲攔截器實(shí)現(xiàn)靈活的數(shù)據(jù)查詢優(yōu)化機(jī)制
4. 事務(wù)管理
? 業(yè)務(wù)模型的事務(wù),該如何處理?這個也是很多人比較關(guān)注的問題。業(yè)務(wù)模型根據(jù)服務(wù)的性質(zhì)也是區(qū)分為普通的單服務(wù)事務(wù)和分布式事務(wù)等不同的場景技術(shù)來解決。對于單服務(wù)的事務(wù),我們依舊可以采用spring的本地事務(wù)來支持,同樣也可以采用分布式事務(wù)。若采用分布式事務(wù)時,則更推薦采用分布式事務(wù)消息中間件來解決,當(dāng)然也可以采用分布式事務(wù)框架。
? 對于單體服務(wù)的本地事務(wù)方案,相信大家都在項目中使用過,這里就不再贅述了。
? 為什么針對分布式系統(tǒng)采用消息事務(wù)方案呢?
我們將數(shù)據(jù)的持久化層更改為消息事件模型是更容易操作的。
消息事務(wù)本身是流式數(shù)據(jù),流式數(shù)據(jù)將更方面未來的數(shù)據(jù)處理與數(shù)據(jù)分析。
現(xiàn)有的消息中間件,已經(jīng)做了很成熟的事務(wù)的解決方案
總結(jié)

? ? ? ?業(yè)務(wù)與技術(shù)分析,就是一種通過空間換時間的方式。在上述提到的四個方面處處都體現(xiàn)了這樣的設(shè)計理念。
? ?將業(yè)務(wù)與數(shù)據(jù)之間的強(qiáng)綁定模式,分割成了業(yè)務(wù)-流-數(shù)據(jù)的分離架構(gòu),實(shí)現(xiàn)以事件流為載體的新模式,邁向事件驅(qū)動開發(fā)。