項目框架劃分

項目框架

文件結構樹

  1. /:根目錄

    1. README.md
      • 項目說明,環境搭建、配置以及編譯,啓動命令
    2. Rakefile
      • 編譯內容配置,引入所有配置項、lib等

根目錄下文件內容分佈

  • 一般包含依賴包的配置信息
  • log的配置信息
  • 各個類的路由配置……
  • 版本控制相關文件(比如pom、.git……)

屬於globally的配置信息

  1. /app:組織業務邏輯(main.java)

    1. /clients:外部服務交互類
    2. /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)放繼承、多態過的支持各種獨立邏輯的類

  1. /bin:項目啓動命令

    1. 。。。正常啓動文件、debug啓動文件……
  2. /builds/0 編譯結果目錄略,Java裏面叫target

  3. /config:配置文件

    1. /initializers:外部服務交互初始化文件 #-》放app裏會不會好點?
    2. /keys:本地key文件: #-》放配置中心裏會不會好點?
    3. /locales: 國際化文本信息
    4. database.yml: db配置

所有配置文件的信息,基礎配置

  • DB參數,如編碼,超時策略等
  • 系統初始化定數(線程池初始化大小、過期時間……等有少量修改需求的數據)
  • 外部環境交互參數,數據源類型等
  1. /db:數據庫相關信息,表結構定義,建表語句,DB初始化的sql文件等

  2. /doc:項目相關詳細文檔,數據描述,流程、時序圖等,最好存放在公司內部/公共的網盤裏

  3. /lib:項目的外部依賴,如不能上傳公有服務器的內部jar包等

  4. /test:(optional)在這裏叫/spec,UT、Integration test文件等,文件結構要和/app一致

  5. /vendor:lls裏常見的外部依賴包

  6. /resource:通用資源路徑,在Java Spring裏默認配置文件放這裏,同時還會放置包括前端頁面在內的不影響後臺服務啓動的資源

包邊界

每個服務需要有自己的職責範圍,就像每個人都要有自己的職責範圍一樣,這樣的好處在於一方面每個人的責任清晰可查,不會出現不必要的越俎代庖的行爲,另一方面責任到人(文件/服務)也可以在有需要的時候儘快找到對應的責任人

每個業務模塊都需要一套獨立的代碼邏輯

ControllerValidatorValidatorServiceDaoService請求合法性請求不合法請求合法性請求合法調用對應處理邏輯入口調用自身業務模塊處理邏輯以及相關業務邏輯各種分支及驗證邏輯讀寫外部數據源組織數據並返回ControllerValidatorValidatorServiceDaoService
  1. xxHandler/controller,只做程序出入口,可以將限流埋點等代碼放在mainController做前置切片的處理

    • 每個業務線需要自己獨立的controller,如billcontroller、productioncontroller
    • 每個controller應對自己業務線的數據處理
  2. validator,只被相關controller調用做請求合法性驗證,可以輸出日誌但理論上只返回true/false,不做任何業務邏輯處理

    • 一般遵循fail fast的思想,遇到不合法的請求,記錄並直接返回(異常等)
    • 如果是表單驗證,或需要對所有錯誤進行捕獲時也可以走完所有的check邏輯再返回所有錯誤信息
    • 分爲basicCheck,businessCheck和relationCheck,每個業務模塊繼承並重寫相應的驗證邏輯
    • 只做input參數、請求的校驗,分支的邏輯判斷應寫在service層
  3. service,固化業務流程,包含各種分支,在業務邏輯不明確或變動頻率較大時,建議使用流程引擎類似組件進行動態配置

    • 主要流程分支圖(if-else樹及case-when-then樹等)
    • 業務處理的邏輯片段,某種分支中最小的,不可分割的業務流程
    • (optional)在分支中可以完成所有的數據處理,包括外部依賴的使用時,可以直接在分支處理結束時return,而不需要走完整個流程判斷
    • 作爲程序總線,調用包括dao、client等組件進行數據訪問、處理、整合等
  4. dao,外部數據交互

    • 主要用於外部數據持久化系統的訪問
    • 負責包括數據源、鏈接池的初始化,事務處理等
    • 只做數據源交互用的數據組織,組裝DSL命令、結果集和model的組裝等
  5. config,配置讀取包

    • 一般用於讀取本地配置文件、交互遠程配置中心等,然後將對應配置的KV信息寫進當前運行內存裏
    • Java裏多用@PreConstruct/@PostConstruct等修飾,或者在類加載的時候做高優先級加載
  6. init,程序初始化包,包括類加載等內容,Java的main函數一般放這裏

    • 但是習慣上Spring的XXApplication會放在根目錄
  7. Bean/Module/Model……

    • 程序內部的數據結構定義,lls裏放在vendor/protos和model裏面了
    • 內容一般爲結構定義,包括各字段數據類型等
    • 少數項目會有包括validate標籤、接口說明標籤等
    • 通用對象裏可以考慮放置靜態枚舉值,但是不建議這樣使用
  8. common/utils……

    • 公共組件包,裏面一般放置包括加密解密、時間運算、字符串、集合、Map等的處理類等
    • 放置不涉及業務邏輯的公共處理邏輯
  9. constants

    • 放置系統定數
    • 幾乎不會有變動的可以考慮固化成XXConstants文件,比如報錯消息、連接池大小、超時時間等
    • 有可能有變動的可以通過異步任務去DB或者其他外部數據源異步同步
  10. 異步工具類

    • 放置異步工具
    • 線程池(如果存在)相關代碼
    • 爲了防止高併發產生的瞬時大量線程的創建,還是建議針對不同的業務使用相互獨立的線程池

程序啓動及調用

程序的開發是爲了數據處理,簡化手工操作

  1. 程序的啓動方法

    1. 。。。
  2. 本地swagger調試

  3. UT/IT 測試入口

  4. 外部調用方式

。。。

編譯和部署

  1. 背景知識

    • git相關
    • 編譯和打包命令
    • 發佈系統
  2. 發佈和部署手順

    1. 本地運行xx命令(e.g. mvn clean instll -U)

    2. git上傳解決衝突

    3. 登陸xx系統進行如下操作

      1. 。。。
    4. 登陸xx系統進行如下驗證

      1. 。。。
    5. 登陸xx系統進行如下監控

      1. 。。。
  3. 發佈成功驗證點

    1. 。。。
  4. 發佈失敗回滾手順

    1. 。。。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章