一個(gè)地圖小程序的后端項(xiàng)目
?很久沒(méi)寫(xiě)文章了,做這個(gè)項(xiàng)目的目的-利用業(yè)余時(shí)間沉淀技術(shù)經(jīng)驗(yàn),準(zhǔn)備一個(gè)好用的腳手架,同時(shí)嘗試一些在工作中想用但是沒(méi)機(jī)會(huì)用的技術(shù)
Gi tHub地址: ? https://github.com/mapcoding-cn/preferential-map ( 查看原文,歡迎star)
技術(shù)方面的簡(jiǎn)單介紹
在這個(gè)項(xiàng)目使用了DDD分層架構(gòu)提供服務(wù),拆箱即用
主要組件:Spring boot + mybatis plus + mysql + wechat
數(shù)據(jù)庫(kù)技術(shù): mysql使用了空間索引 全文索引 JSON類(lèi)型等
腳手架中踐行的架構(gòu)理念
領(lǐng)域模型
-
app: 項(xiàng)目入口和構(gòu)建,配置文件和資源,不侵入業(yè)務(wù)
-
test: 單元測(cè)試和非正式代碼入口,不打包,不上線(xiàn)[新增]
-
web: 展示層,發(fā)布web接口,處理業(yè)務(wù)無(wú)關(guān)的請(qǐng)求入?yún)⒑彤惓?=controller+VO),不侵入業(yè)務(wù)
-
biz: 應(yīng)用層,for具體應(yīng)用的業(yè)務(wù)邏輯,應(yīng)對(duì)業(yè)務(wù)易變性,避免非核心邏輯污染core層(BO DTO)
-
業(yè)務(wù)流程編排和集成
-
入出參轉(zhuǎn)換,接口適配
-
安全認(rèn)證,權(quán)限控制
-
切面功能如日志攔截
-
應(yīng)用級(jí)異常的處理
-
調(diào)度job入口(不含業(yè)務(wù)邏輯)
-
消息訂閱入口(不含業(yè)務(wù)邏輯)
-
流程引擎功能(不含業(yè)務(wù)邏輯)
-
業(yè)務(wù)報(bào)警功能
-
業(yè)務(wù)統(tǒng)計(jì)分析功能
-
其他和業(yè)務(wù)運(yùn)行無(wú)關(guān)的模塊
-
怎么寫(xiě)應(yīng)用層?有以下幾個(gè)原則,看下是否符合
-
-
core: 核心領(lǐng)域?qū)?針對(duì)核心業(yè)務(wù)抽象建模,反映基本業(yè)務(wù)現(xiàn)實(shí),需保持一定程度的穩(wěn)定性(BO DTO)
-
和biz的區(qū)別,只關(guān)心核心業(yè)務(wù)
-
業(yè)務(wù)無(wú)關(guān)的附著功能剝離到應(yīng)用層實(shí)現(xiàn)
-
-
infras: 基礎(chǔ)設(shè)施層,封裝項(xiàng)目的基礎(chǔ)能力,工具性的,業(yè)務(wù)無(wú)關(guān)的
-
util:靜態(tài)工具類(lèi),封裝通用工具,如HttpUtils DateUtils.
-
enum 枚舉類(lèi)
-
constant 常量類(lèi)
-
exception 異常類(lèi)
-
annotion 注解類(lèi)
-
model: 公用的bean,各領(lǐng)域?qū)ο蠓诺礁鲗永锩嫒?shí)現(xiàn)
-
config: 全局的工具性配置在放在這里
-
infras-dal:數(shù)據(jù)訪(fǎng)問(wèn)層,封裝數(shù)據(jù)庫(kù) redis等數(shù)據(jù)能力,(=dao層+DO),禁止做任何業(yè)務(wù)加工
-
infras-facade:對(duì)外接口層,定義對(duì)外接口,一般是rpc調(diào)用的二方包
-
infras-integration:對(duì)內(nèi)客戶(hù)端層,對(duì)引用外部服務(wù)進(jìn)行統(tǒng)一封裝,做接口防腐和適配
-
infras-common:
-
eg
開(kāi)發(fā)一個(gè)查詢(xún)接口,對(duì)地理對(duì)象進(jìn)行檢索,基本數(shù)據(jù)模型為點(diǎn)集
-
web: 發(fā)布接口/query,進(jìn)行入?yún)⑿r?yàn) 錯(cuò)誤碼處理 封裝VO,調(diào)用biz層,這是展示層
-
biz: 點(diǎn)和線(xiàn)是不同類(lèi)型要素,Point/Line,調(diào)用core層查詢(xún)并分別處理為Point/Line,這是應(yīng)用層
-
core: 封裝點(diǎn)集查詢(xún)邏輯,調(diào)用dal層,用數(shù)據(jù)庫(kù)或緩存,建立查詢(xún)索引等,這是核心業(yè)務(wù)層
-
infras基礎(chǔ)設(shè)施能力
-
dal: mybatis支持的數(shù)據(jù)訪(fǎng)問(wèn)層,僅做工具性查詢(xún),關(guān)注sql,redis指令等,這是數(shù)據(jù)訪(fǎng)問(wèn)層
-
facade: 對(duì)外接口模型,有業(yè)務(wù)依賴(lài)Rpc服務(wù),這里寫(xiě)接口,交由biz層實(shí)現(xiàn),發(fā)布為二方庫(kù)
-
integration: core查詢(xún)依賴(lài)web服務(wù)做關(guān)聯(lián),這里封裝客戶(hù)端服務(wù),以保持對(duì)內(nèi)服務(wù)的穩(wěn)定
-
common: utils enum constant
-
-
app:業(yè)務(wù)邏輯開(kāi)發(fā)完成后,在這里打包,發(fā)布
-
test:寫(xiě)單元測(cè)試和非正式代碼,后續(xù)會(huì)要求代碼覆蓋率
命名規(guī)范
-
app: 只有啟動(dòng)類(lèi)Application
-
test: 除集成類(lèi)測(cè)試,單元測(cè)試類(lèi)命名=原始類(lèi)+Test后綴
-
web: 后綴controller
-
biz: 后綴Manager
-
core: 后綴service
-
dal: 后綴Mapper,實(shí)體類(lèi)DO和數(shù)據(jù)庫(kù)表一一對(duì)應(yīng)
-
facade: 后綴facade
-
integration : 后綴client
-
model: DTO數(shù)據(jù)傳輸性質(zhì)如序列化 BO業(yè)務(wù)封裝對(duì)象最常見(jiàn) VO面向顯示層的屬性輸出
-
util: 后綴utils
-
enum: 后綴enum
-
constant: Property等,不做強(qiáng)制約束,做到見(jiàn)名知意
-
exception: 后綴Exception Error
開(kāi)發(fā)規(guī)范
-
業(yè)務(wù)邏輯只發(fā)生在biz層和core層,禁止在其他層里面出現(xiàn)任何業(yè)務(wù)邏輯
-
各模塊內(nèi)保持單一職責(zé),按照業(yè)務(wù)或職責(zé)劃分package
-
禁止在業(yè)務(wù)中直接引用外部服務(wù),必須在integration中處理成client,并處理異常情況
-
禁止core依賴(lài)biz層,web依賴(lài)dal層
-
禁止更改各個(gè)model的原始依賴(lài)順序,如發(fā)現(xiàn)無(wú)法引用,請(qǐng)考慮依賴(lài)的合理性
-
請(qǐng)保持dal層sql或指令的簡(jiǎn)潔性,不推薦寫(xiě)復(fù)雜sql或在sql中實(shí)現(xiàn)業(yè)務(wù)邏輯,要短平快
-
統(tǒng)一在父pom里面處理依賴(lài)
-
常量類(lèi)使用接口或者枚舉
日志規(guī)范
-
日志分級(jí),error/other,分別輸出到不同文件
-
禁止error到處飛,線(xiàn)上新增error日志必須高度敏感,做好監(jiān)控
-
系統(tǒng)的入口和出口,以及關(guān)鍵位置必須有日志輸出,不要怕日志打的多
-
線(xiàn)上禁止輸出debug
-
輸出日志需帶trace信息
異常規(guī)范
-
內(nèi)部異常類(lèi)統(tǒng)一繼承自UnimapException,對(duì)可感知業(yè)務(wù)異常進(jìn)行封裝
-
異常根據(jù)嚴(yán)重程度分級(jí) ERROR WARNING,其中ERROR會(huì)攔截輸出到error日志中
-
對(duì)外異常進(jìn)行分類(lèi),定義錯(cuò)誤碼體系
-
建議將受檢異常轉(zhuǎn)為非受檢異常
Git規(guī)范
-
主分支 master 主分支的合并應(yīng)該在預(yù)發(fā)通過(guò)后,禁止直接提交master
-
功能分支 feature-*-#version 開(kāi)發(fā)分支,在開(kāi)發(fā)階段使用,禁止提交不可編譯運(yùn)行的代碼
-
發(fā)布版本 release-*-#version 測(cè)試和預(yù)發(fā)分支,提交QA的相對(duì)穩(wěn)定版本
-
緊急修復(fù)分支 bugfix-*-#version 緊急修復(fù)線(xiàn)上bug
-
如無(wú)明確的版本計(jì)劃,version建議為上線(xiàn)的日期
-
編碼為utf8,換行符為\r LF,禁止Tab
URL規(guī)范
-
全部小寫(xiě),單詞間用-中劃線(xiàn)分割
-
讀請(qǐng)求為get,寫(xiě)請(qǐng)求為post
-
對(duì)外進(jìn)行Response統(tǒng)一封裝
-
建議rest風(fēng)格,參數(shù)小于等于3個(gè)
