議驅(qū)動(一))
協(xié)議驅(qū)動協(xié)議驅(qū)動設(shè)計圍繞三大核心原則落地適配輕量化、高迭代的開發(fā)場景。三大核心思想具體如下接口即協(xié)議獨立閉環(huán)每一個API接口對應(yīng)一套獨立協(xié)議各協(xié)議擁有專屬的入?yún)⒛P汀⒊鰠⒛P汀I(yè)務(wù)處理類業(yè)務(wù)邏輯完全閉環(huán)。協(xié)議扁平對等無相互依賴所有協(xié)議處于同一層級、地位平等無上下級、無優(yōu)先級區(qū)分禁止協(xié)議之間相互調(diào)用、耦合依賴。協(xié)議用完即棄迭代換新協(xié)議適配當前業(yè)務(wù)場景即可一旦出現(xiàn)場景不適配、大規(guī)模不兼容迭代不改造舊協(xié)議直接全新創(chuàng)建協(xié)議舊協(xié)議保留、按需廢棄。極度適配中小團隊敏捷迭代實現(xiàn)主動擁抱需求變化、核心業(yè)務(wù)保持恒定無需復(fù)雜 DDD 領(lǐng)域建模、無需高強度代碼評審適配工期緊、需求多變、無詳細前置設(shè)計的開發(fā)場景用輕量化架構(gòu)解決傳統(tǒng)分層架構(gòu)職責(zé)混亂、代碼失控的頑疾。哪里有敏捷開發(fā)只不過是把工期緊任務(wù)重并且沒有詳細設(shè)計加上邊做邊想甚至是先做出來再說這種開發(fā)流程美化一番好讓程序猿同學(xué)有種非常高大上的錯覺從而心甘情愿地多加班而已業(yè)務(wù)背景在遙遠的sevlet年代一個sevlet將業(yè)務(wù)邏輯處理、數(shù)據(jù)持久化包干。后來拆分成‘模型 - 視圖 - 控制器’三層又添加并細分‘Controller - Service - Dao’Controller負責(zé)請求接收、參數(shù)校驗、路由調(diào)度與響應(yīng)返回Service專注核心業(yè)務(wù)邏輯的編排與實現(xiàn)Dao負責(zé)數(shù)據(jù)庫交互、數(shù)據(jù)持久化操作。這套分層架構(gòu)雖實現(xiàn)了基礎(chǔ)職責(zé)拆分但在中小團隊、高頻迭代的業(yè)務(wù)場景中暴露了無法規(guī)避的短板Service層代碼臃腫膨脹隨著業(yè)務(wù)迭代迭代大量業(yè)務(wù)邏輯堆砌在Service類中多人協(xié)作開發(fā)時極易出現(xiàn)代碼沖突、分支合并問題文件體量持續(xù)失控。層級邊界混亂隔離失效受開發(fā)人員能力、規(guī)范落地不到位影響層級職責(zé)經(jīng)常被打破部分開發(fā)者會將業(yè)務(wù)邏輯寫入Controller層甚至直接在控制層通過Dao、JDBC操作數(shù)據(jù)庫即便項目已定義標準化入?yún)⒛P腿源嬖谕ㄟ^request.getParameter()手動獲取參數(shù)的不規(guī)范操作。架構(gòu)適配性有限大廠可通過領(lǐng)域驅(qū)動設(shè)計DDD、嚴格代碼評審、規(guī)范化研發(fā)流程保障代碼質(zhì)量、延長代碼生命周期。但絕大多數(shù)小微企業(yè)無專職代碼審核人員研發(fā)人員能力參差不齊傳統(tǒng)分層架構(gòu)的規(guī)范難以落地代碼冗余、耦合、混亂問題愈發(fā)嚴重維護成本極高。協(xié)議驅(qū)動設(shè)計正是針對中小團隊快速迭代、規(guī)范薄弱、業(yè)務(wù)多變的場景提出的輕量化破局方案。協(xié)議驅(qū)動核心思想深度解析1. 最小顆粒度協(xié)議拆分業(yè)務(wù)完全閉環(huán)協(xié)議對應(yīng)的API接口需拆分至最小業(yè)務(wù)顆粒以業(yè)務(wù)場景、功能單一為拆分依據(jù)即便同為Banner圖查詢接口若A、B兩處返回數(shù)據(jù)格式不同需拆分為兩個獨立協(xié)議新增、編輯類操作若業(yè)務(wù)邏輯、數(shù)據(jù)校驗規(guī)則不同可獨立拆分協(xié)議堅決杜絕“大一統(tǒng)接口”禁止一個接口承載頁面全部數(shù)據(jù)返回、多場景復(fù)合業(yè)務(wù)處理。同時每個協(xié)議的入?yún)⒛P汀⒊鰠⒛P汀I(yè)務(wù)處理類專屬獨享僅服務(wù)于當前協(xié)議業(yè)務(wù)物理層面將臃腫的Service大類按單一業(yè)務(wù)維度拆分為多個獨立協(xié)議處理類從根源解決代碼膨脹問題單一協(xié)議的代碼修改、迭代、Bug修復(fù)完全不會影響其他協(xié)議實現(xiàn)業(yè)務(wù)邏輯物理隔離問題定位精準高效所有與某一接口相關(guān)的問題僅局限于對應(yīng)協(xié)議的代碼范圍內(nèi)大幅降低排查成本。協(xié)議扁平解耦無狀態(tài)無依賴所有協(xié)議保持扁平、對等、無狀態(tài)特性不存在層級關(guān)系、優(yōu)先級差異和相互依賴調(diào)用。該設(shè)計的核心目的是極致解耦、強化單一職責(zé)即使刪除某一個協(xié)議的全部代碼也不會對系統(tǒng)內(nèi)其他協(xié)議、其他業(yè)務(wù)邏輯造成任何影響徹底規(guī)避跨業(yè)務(wù)耦合風(fēng)險。用完即棄契合開閉原則當業(yè)務(wù)出現(xiàn)大規(guī)模迭代新舊接口邏輯不兼容、無法通過簡單兼容改造適配時無需修改舊協(xié)議代碼直接全新開發(fā)一套新協(xié)議即可。新舊協(xié)議并行存在、各司其職完美契合軟件設(shè)計的開閉原則對修改關(guān)閉、對擴展開放。客戶端未升級場景持續(xù)調(diào)用舊協(xié)議保留原有業(yè)務(wù)邏輯客戶端已升級場景切換調(diào)用新協(xié)議執(zhí)行全新業(yè)務(wù)邏輯。堅決杜絕在同一個接口中堆砌大量版本兼容代碼避免代碼冗余、邏輯混亂。僅需特殊校驗是否存在“客戶端未升級但必須使用新協(xié)議”的特殊場景評估場景合理性與落地必要性即可。代碼復(fù)用與數(shù)據(jù)持久化落地方案協(xié)議扁平獨立、互不調(diào)用的設(shè)計可規(guī)避耦合問題但也衍生出核心問題多協(xié)議存在公共邏輯、重復(fù)代碼以及統(tǒng)一數(shù)據(jù)持久化如何處理核心解決方案為邏輯下沉、分層復(fù)用。協(xié)議驅(qū)動不強制限定 Model、Service、Dao 的固定架構(gòu)可與行業(yè)主流的數(shù)據(jù)驅(qū)動模式混用一張數(shù)據(jù)庫表對應(yīng)一套獨立的表模型Model、Dao操作類、Mapper映射文件、通用Service類。其中表對應(yīng)通用Service類主要承擔兩大核心職責(zé)實現(xiàn)代碼復(fù)用與能力下沉通用數(shù)據(jù)操作封裝封裝單表/關(guān)聯(lián)子表的通用增刪改查能力包含分頁查詢、新增、修改等基礎(chǔ)數(shù)據(jù)庫操作與具體業(yè)務(wù)場景解耦核心公共業(yè)務(wù)封裝沉淀多協(xié)議通用的核心業(yè)務(wù)邏輯如緩存管理、發(fā)送消息等避免重復(fù)編碼。通過該方式協(xié)議處理類僅專注于自身專屬業(yè)務(wù)邏輯通用數(shù)據(jù)庫操作、公共邏輯全部下沉至基礎(chǔ)Service層既保留協(xié)議的獨立性又解決了代碼復(fù)用問題。靈活適配原則規(guī)范服務(wù)于業(yè)務(wù)協(xié)議驅(qū)動的核心目標是簡化開發(fā)、降低維護成本而非固化刻板規(guī)則。若少量多個協(xié)議存在完全一致的入?yún)ⅰ⒊鰠⒛P颓覙I(yè)務(wù)處理邏輯高度重合允許直接復(fù)用模型與核心代碼無需強行拆分冗余代碼。所有架構(gòu)規(guī)范均為業(yè)務(wù)服務(wù)在不破壞核心解耦、獨立閉環(huán)的前提下可根據(jù)實際場景靈活適配兼顧架構(gòu)規(guī)范性與開發(fā)高效性。對應(yīng)實戰(zhàn)項目地址https://github.com/bugCats/cat-bcdt包括網(wǎng)址導(dǎo)航SQL版本管理SQL計劃任務(wù)Mysql代理數(shù)據(jù)庫賬號權(quán)限申請審批代碼生成web端日志查閱團隊日報禪道、Jenkins、Gitea、Gitlab消息集成等案例分析案例1最小顆粒協(xié)議拆分對應(yīng)獨立閉環(huán)思想商城首頁需要展示兩種Banner廣告首頁輪播Banner、彈窗推薦Banner。二者數(shù)據(jù)庫字段一致但前端渲染出參格式不同輪播Banner需返回圖片地址、跳轉(zhuǎn)鏈接、排序權(quán)重彈窗Banner僅需返回圖片地址、展示時長。傳統(tǒng)寫法容易合并為一個 getBanner() 大一統(tǒng)接口冗余字段多、迭代牽一發(fā)而動全身。協(xié)議驅(qū)動模式下直接拆分為 BannerHomeProtocol、BannerPopupProtocol 兩個獨立協(xié)議各自配備專屬入?yún)ⅰ⒊鰠⒑吞幚眍惡罄m(xù)僅修改彈窗Banner邏輯時完全不會影響首頁輪播業(yè)務(wù)。案例2協(xié)議扁平無依賴對應(yīng)對等解耦思想用戶中心包含「用戶登錄」「用戶信息查詢」「用戶手機號修改」三個接口對應(yīng)三套獨立協(xié)議。傳統(tǒng)Service架構(gòu)下三類用戶業(yè)務(wù)邏輯會堆砌在同一個UserService中修改手機號邏輯極易誤影響登錄、查詢功能多人開發(fā)也容易產(chǎn)生代碼沖突。而協(xié)議驅(qū)動模式下三個業(yè)務(wù)對應(yīng)三個扁平獨立協(xié)議互不依賴、互不調(diào)用。物理刪除用戶手機號修改協(xié)議的全部代碼登錄、用戶查詢功能完全不受影響真正實現(xiàn)協(xié)議之間徹底解耦、零耦合風(fēng)險。案例3協(xié)議用完即棄、版本迭代換新對應(yīng)開閉原則思想商城訂單接口迭代場景V1版本訂單接口僅支持普通實物訂單下單邏輯簡單、參數(shù)較少后續(xù)業(yè)務(wù)升級新增預(yù)售訂單、分期支付訂單且新增大量校驗字段、履約邏輯新舊邏輯完全不兼容。傳統(tǒng)開發(fā)寫法在原有訂單接口中新增大量if/else兼容判斷堆砌V1、V2兩套邏輯代碼臃腫晦澀后續(xù)迭代極易出Bug維護難度極大。協(xié)議驅(qū)動寫法不改動原有V1訂單協(xié)議代碼全新開發(fā)一套V2訂單協(xié)議。老版本APP調(diào)用舊協(xié)議保持原有下單邏輯穩(wěn)定新版本APP調(diào)用新協(xié)議適配全新訂單業(yè)務(wù)。無需兼容舊邏輯、不污染老代碼完美實現(xiàn)用完即扔、迭代擴展。案例4公共邏輯下沉復(fù)用對應(yīng)分層落地方案系統(tǒng)中「商品列表查詢」「商品詳情查詢」兩個獨立協(xié)議均需要查詢商品基礎(chǔ)數(shù)據(jù)、統(tǒng)一封裝商品狀態(tài)、過濾下架商品。按照協(xié)議規(guī)范兩個協(xié)議代碼獨立、不能相互調(diào)用。此時將商品基礎(chǔ)查詢、狀態(tài)過濾通用邏輯下沉至商品基礎(chǔ)Service層兩個協(xié)議分別調(diào)用Service公共能力自身僅保留各自專屬業(yè)務(wù)邏輯列表協(xié)議專注分頁、排序、精簡字段返回詳情協(xié)議專注參數(shù)校驗、完整數(shù)據(jù)組裝。既保證協(xié)議獨立解耦又避免大量重復(fù)代碼。案例5規(guī)范靈活適配、避免過度設(shè)計對應(yīng)靈活適配原則系統(tǒng)內(nèi)「獲取用戶基礎(chǔ)信息」「獲取用戶實名認證信息」兩個簡單接口入?yún)⒕鶠橛脩鬒D、出參均為基礎(chǔ)用戶字段無特殊差異化邏輯。無需強行拆分兩套模型、兩套處理類可直接復(fù)用同一套出入?yún)⒛P秃凸蔡幚磉壿嫛?協(xié)議驅(qū)動核心是解耦、提效而非機械刻板拆分在不破壞核心架構(gòu)思想的前提下可靈活復(fù)用代碼規(guī)避過度設(shè)計。