搭建一個(gè)java項(xiàng)目的腳手架總結(jié)
最近一個(gè)月在公司經(jīng)歷了兩個(gè)項(xiàng)目的從零到一的過程备埃,都涉及到了從最初的只有需求篓足,沒有代碼倉庫的情況未状。一般情況下,迫于時(shí)間壓力蜕径,我們一直都期望在一個(gè)比較完善項(xiàng)目上做小的修改两踏,但是,往往天不隨人愿兜喻,這里我整理一下一個(gè)新項(xiàng)目搭建的普遍方法梦染,作為后續(xù)的工作之用,從而提高效率朴皆。
1.reade.md
編寫readme文檔帕识,其如要內(nèi)容需要包括,但不限于如下內(nèi)容:
- 項(xiàng)目簡介:用一兩句話簡單描述該項(xiàng)目所實(shí)現(xiàn)的業(yè)務(wù)功能遂铡;
- 技術(shù)選型:列出項(xiàng)目的技術(shù)棧肮疗,包括語言、框架和中間件等扒接;
- 本地構(gòu)建:列出本地開發(fā)過程中所用到的工具命令伪货;
- 領(lǐng)域模型:核心的領(lǐng)域概念,比如對于示例電商系統(tǒng)來說有Order钾怔、Product等碱呼;
- 測試策略:自動(dòng)化測試如何分類,哪些必須寫測試宗侦,哪些沒有必要寫測試愚臀;
- 技術(shù)架構(gòu):技術(shù)架構(gòu)圖;
- 部署架構(gòu):部署架構(gòu)圖凝垛;
- 外部依賴:項(xiàng)目運(yùn)行時(shí)所依賴的外部集成方懊悯,比如訂單系統(tǒng)會依賴于會員系統(tǒng);
- 環(huán)境信息:各個(gè)環(huán)境的訪問方式梦皮,數(shù)據(jù)庫連接等炭分;
- 編碼實(shí)踐:統(tǒng)一的編碼實(shí)踐,比如異常處理原則剑肯、分頁封裝等捧毛;
- FAQ:開發(fā)過程中常見問題的解答。
注意:readme文檔让网,一定要持續(xù)更新呀忧,否則,會造成文檔和代碼的不一致
2.便攜的腳本
盡可能多的提供自動(dòng)化腳本溃睹,能夠也能降低新人的上手難度和恐懼感而账,使其更加自信
- 打開idea
- 本地運(yùn)行
- 本地構(gòu)建
3.代碼分布
經(jīng)過查看網(wǎng)上的相關(guān)資料,關(guān)于代碼結(jié)構(gòu)因篇,我在考慮是否可以可以放棄按照controller泞辐,service笔横,dao,entity的分包方式咐吼,而采用按照業(yè)務(wù)分包的方式(如business1吹缔,business2)。
- 1.前者是按照技術(shù)的方式分包锯茄,后者是按照業(yè)務(wù)的方式分包
- 2.前者會導(dǎo)致業(yè)務(wù)代碼比較分散厢塘,后者能保證同業(yè)務(wù)內(nèi)的代碼盡可能的聚合
- 3.在代碼的日常維護(hù)修改中,前者的修改往往也會比較分散肌幽,而后者往往能夠聚合在一起
- 4.當(dāng)項(xiàng)目需要進(jìn)行拆分的時(shí)候晚碾,前者的耦合會比較緊密,拆分可能會比較困難喂急,而后者可能會比較容易
4.自動(dòng)化測試
4.1 自動(dòng)化測試的分類
- 單元測試(src/test/java):核心的領(lǐng)域模型迄薄,包括領(lǐng)域?qū)ο?比如Order類),F(xiàn)actory類煮岁,領(lǐng)域服務(wù)類等;
- 組件測試(src/componentTest/java):不適合寫單元測試但是又必須測試的類涣易,比如Repository類画机,在有些項(xiàng)目中,這種類型測試也被稱為集成測試新症;
- API測試(src/apiTest/java):模擬客戶端測試各個(gè)API接口步氏,需要啟動(dòng)程序。
5.日志處理
關(guān)于日志記錄重點(diǎn)需要考慮兩個(gè)問題:
- 鏈路追蹤徒爹,比如MDC(Mapped Diagnostic Context)
- 多節(jié)點(diǎn)下荚醒,日志集中記錄,使用elk達(dá)到es中
6.異常處理
異常處理需要考慮的問題:
- 格式統(tǒng)一
- 上下文和結(jié)構(gòu)化信息
- 異常的唯一標(biāo)識
7.定時(shí)任務(wù)
定時(shí)任務(wù)主要考慮的問題是分布式鎖隆嗅,可以使用的技術(shù)包括Shedlock界阁、Redis、ZooKeeper和Hazelcast等的分布式鎖實(shí)現(xiàn)機(jī)制
8.編碼風(fēng)格
google胖喳、alibaba泡躯、唯品會
9.靜態(tài)代碼檢查
- Checkstyle:用于檢查代碼格式,規(guī)范編碼風(fēng)格
- Spotbugs:Findbugs的繼承者(用過)
- Dependency check:OWASP提供的Java類庫安全性檢查
- Sonar:用于代碼持續(xù)改進(jìn)的跟蹤(用過)
- 健康檢查
健康檢查的主要作用:
- 初步檢查程序是否運(yùn)行正常
- 負(fù)載均衡軟件會通過一個(gè)健康檢查URL判斷節(jié)點(diǎn)的可達(dá)性
11.接口文檔
swagger
12.數(shù)據(jù)庫遷移
flyway
13.多環(huán)境(profile)
- local:用于開發(fā)者本地開發(fā)
- ci:用于持續(xù)集成
- dev:用于前端開發(fā)聯(lián)調(diào)
- qa:用于測試人員
- uat:類生產(chǎn)環(huán)境丽焊,用于功能驗(yàn)收(有時(shí)也稱為staging環(huán)境)
- prod:正式的生產(chǎn)環(huán)境
14.跨域處理(CORS)
前后端應(yīng)用分別部署在兩個(gè)不同的域名下是较剃,需要進(jìn)行跨域處理
- 常用的第三方庫
- Guava:來自Google的常用類庫
- Apache Commons:來自Apache的常用類庫
- Mockito:主要用于單元測試的mock
- DBUnit:測試中管理數(shù)據(jù)庫測試數(shù)據(jù)
- Rest Assured:用于Rest API測試
- Jackson 2:Json數(shù)據(jù)的序列化和反序列化
- jjwt:Jwt token認(rèn)證(暫時(shí)未使用過)
- Lombok:自動(dòng)生成常見Java代碼,比如equals()方法技健,getter和setter等写穴;
- Feign:聲明式Rest客戶端
- Tika:用于準(zhǔn)確檢測文件類型(暫時(shí)未使用過)
- itext:生成Pdf文件等(暫時(shí)未使用過)
- zxing:生成二維碼
- Xstream:比Jaxb更輕量級的XML處理庫(暫時(shí)未使用過)