項目框架
文件結構樹
-
/:根目錄
- README.md
- 項目說明,環境搭建、配置以及編譯,啓動命令
- Rakefile
- 編譯內容配置,引入所有配置項、lib等
- README.md
根目錄下文件內容分佈
- 一般包含依賴包的配置信息
- log的配置信息
- 各個類的路由配置……
- 版本控制相關文件(比如pom、.git……)
屬於globally的配置信息
-
/app:組織業務邏輯(main.java)
- /clients:外部服務交互類
- /controller/handler:服務的出入口
每一個包的內容相互獨立,協同工作,高內聚低耦合
- 服務自己的轉發控制類(filter/interrupter)
- 包含程序出入口(handler/controller)
- 程序dateflow處理包(service)
- 程序本身的初始化/靜態啓動(init)
- 程序配置載入及初始化(config)
- 數據model(modole/module/……)
- 公共方法(common/utils……)
- 公共系統定數、靜態變量(xxConstants)可以放一起也可以拆開按不同業務分別命名
- validate相關組件
- db交互(dao data access object),二級可以分層,比如mysqlDao,oracleDao……
- 緩存交互
- ……各種外部系統的交互包
- 異步工作類
每個包建議第一層interface,第二層(/impl)放繼承、多態過的支持各種獨立邏輯的類
-
/bin:項目啓動命令
- 。。。正常啓動文件、debug啓動文件……
-
/builds/0 編譯結果目錄略,Java裏面叫target
-
/config:配置文件
- /initializers:外部服務交互初始化文件 #-》放app裏會不會好點?
- /keys:本地key文件: #-》放配置中心裏會不會好點?
- /locales: 國際化文本信息
- database.yml: db配置
- …
所有配置文件的信息,基礎配置
- DB參數,如編碼,超時策略等
- 系統初始化定數(線程池初始化大小、過期時間……等有少量修改需求的數據)
- 外部環境交互參數,數據源類型等
-
/db:數據庫相關信息,表結構定義,建表語句,DB初始化的sql文件等
-
/doc:項目相關詳細文檔,數據描述,流程、時序圖等,最好存放在公司內部/公共的網盤裏
-
/lib:項目的外部依賴,如不能上傳公有服務器的內部jar包等
-
/test:(optional)在這裏叫/spec,UT、Integration test文件等,文件結構要和/app一致
-
/vendor:lls裏常見的外部依賴包
-
/resource:通用資源路徑,在Java Spring裏默認配置文件放這裏,同時還會放置包括前端頁面在內的不影響後臺服務啓動的資源
包邊界
每個服務需要有自己的職責範圍,就像每個人都要有自己的職責範圍一樣,這樣的好處在於一方面每個人的責任清晰可查,不會出現不必要的越俎代庖的行爲,另一方面責任到人(文件/服務)也可以在有需要的時候儘快找到對應的責任人
每個業務模塊都需要一套獨立的代碼邏輯
-
xxHandler/controller,只做程序出入口,可以將限流埋點等代碼放在mainController做前置切片的處理
- 每個業務線需要自己獨立的controller,如billcontroller、productioncontroller
- 每個controller應對自己業務線的數據處理
-
validator,只被相關controller調用做請求合法性驗證,可以輸出日誌但理論上只返回true/false,不做任何業務邏輯處理
- 一般遵循fail fast的思想,遇到不合法的請求,記錄並直接返回(異常等)
- 如果是表單驗證,或需要對所有錯誤進行捕獲時也可以走完所有的check邏輯再返回所有錯誤信息
- 分爲basicCheck,businessCheck和relationCheck,每個業務模塊繼承並重寫相應的驗證邏輯
- 只做input參數、請求的校驗,分支的邏輯判斷應寫在service層
-
service,固化業務流程,包含各種分支,在業務邏輯不明確或變動頻率較大時,建議使用流程引擎類似組件進行動態配置
- 主要流程分支圖(if-else樹及case-when-then樹等)
- 業務處理的邏輯片段,某種分支中最小的,不可分割的業務流程
- (optional)在分支中可以完成所有的數據處理,包括外部依賴的使用時,可以直接在分支處理結束時return,而不需要走完整個流程判斷
- 作爲程序總線,調用包括dao、client等組件進行數據訪問、處理、整合等
-
dao,外部數據交互
- 主要用於外部數據持久化系統的訪問
- 負責包括數據源、鏈接池的初始化,事務處理等
- 只做數據源交互用的數據組織,組裝DSL命令、結果集和model的組裝等
-
config,配置讀取包
- 一般用於讀取本地配置文件、交互遠程配置中心等,然後將對應配置的KV信息寫進當前運行內存裏
- Java裏多用@PreConstruct/@PostConstruct等修飾,或者在類加載的時候做高優先級加載
-
init,程序初始化包,包括類加載等內容,Java的main函數一般放這裏
- 但是習慣上Spring的XXApplication會放在根目錄
-
Bean/Module/Model……
- 程序內部的數據結構定義,lls裏放在vendor/protos和model裏面了
- 內容一般爲結構定義,包括各字段數據類型等
- 少數項目會有包括validate標籤、接口說明標籤等
- 通用對象裏可以考慮放置靜態枚舉值,但是不建議這樣使用
-
common/utils……
- 公共組件包,裏面一般放置包括加密解密、時間運算、字符串、集合、Map等的處理類等
- 放置不涉及業務邏輯的公共處理邏輯
-
constants
- 放置系統定數
- 幾乎不會有變動的可以考慮固化成XXConstants文件,比如報錯消息、連接池大小、超時時間等
- 有可能有變動的可以通過異步任務去DB或者其他外部數據源異步同步
-
異步工具類
- 放置異步工具
- 線程池(如果存在)相關代碼
- 爲了防止高併發產生的瞬時大量線程的創建,還是建議針對不同的業務使用相互獨立的線程池
程序啓動及調用
程序的開發是爲了數據處理,簡化手工操作
-
程序的啓動方法
- 。。。
-
本地swagger調試
-
UT/IT 測試入口
-
外部調用方式
。。。
編譯和部署
-
背景知識
- git相關
- 編譯和打包命令
- 發佈系統
-
發佈和部署手順
-
本地運行xx命令(e.g. mvn clean instll -U)
-
git上傳解決衝突
-
登陸xx系統進行如下操作
- 。。。
-
登陸xx系統進行如下驗證
- 。。。
-
登陸xx系統進行如下監控
- 。。。
-
-
發佈成功驗證點
- 。。。
-
發佈失敗回滾手順
- 。。。