豬齒魚 Choerodon 的數據初始化設計解析
數智化效能平台豬齒魚Choerodon 作為一個微服務框架,需要解決微服務數據初始化本身具有的問題和複雜性,同時也需要滿足框架本身特有的數據初始化需求,下面為大家介紹一下這方面的設計思想和實現。
微服務的數據初始化難題
先來看一下在微服務的數據初始化中常見的幾個問題。
▍1.1 表結構的初始化和可平滑升級
表結構的定義在資料庫初始化中是重中之重,它涉及到整個服務運行和利用資料庫實現功能的方式,一般來說表結構定義和升級涉及到以下操作:創建表,創建欄位,創建索引,修改索引,修改欄位,重命名表,刪除索引,刪除欄位,刪除表。這些操作如果都需要對多種資料庫進行兼容和可平滑升級,那麼複雜度就會突然增加,基本不可能像傳統應那樣通 SQL 腳本進行管理,而豬齒魚面臨的就是這種情況。
▍1.2 跨服務數據的自動初始化
在微服務架構中,不可避免的會出現需要將數據初始化到其他服務的場景,比如豬齒魚的大部分服務都需要初始化菜單數據到 IAM 服務,處理菜單列表的請求是由 IAM 服務處理的,然而對於微服務的部署而言,很多時候又不能運行初始化數據的時候連接多個數據源從而產生問題。而且微服務的部署可能不是全量的,存在這個部署不需要這個服務的情況,這種情況的初始化又需要修改初始化的腳本或者程式帶來複雜性。
▍1.3 繁瑣的編碼化數據的自動發現
數據的初始化中有一類數據是可以從程式碼或者文檔,或者其它地方收集提取出來的,並且這部分數據往往比較繁瑣和龐大,比如在豬齒魚中的許可權鑒定需要 URL 與 Controller,Method 的映射關係,這部分數據如果手工進行初始化會產生很大的工作量,並且在實際程式碼修改後可能初始化數據沒有更新產生問題。
豬齒魚的本服務數據的初始化
認識到這些問題後接下來再來介紹一下豬齒魚在多次迭代後對這些問題提出的解決方案。先來看對於本服務數據初始化的解決方案,這部分的具體實現可以參考開源程式碼://github.com/choerodon/choerodon-starters/tree/master/choerodon-liquibase
▍2.1 數據表結構的初始化
對於資料庫表結構的初始化豬齒魚採用 Liquibase 開源項目,具體為使用 Liquibase 的 Groovy DSL,增強了 Liquibase 的靈活性,並且 Liquibase 本身支援平滑升級和多資料庫支援解決了表結構初始化的問題。
▍2.2 本服務預置數據的初始化
對於一些預置數據,包括預置的用戶角色,以及自動化測試執行時候需要的預置數據,豬齒魚使用 Excel 來輔助初始化的數據,方便操作,填充,關聯。
豬齒魚的跨服務數據的初始化
下面再看一下豬齒魚關於跨服務數據初始化和自動發現數據的處理方式。
▍3.1 自動發現數據的初始化
服務啟動後通過管理服務訪問各個服務的通用介面從 ClassPath 中獲取數據通過分散式事務進行初始化。
▍3.2 跨服務預置數據的初始化
使用與本服務預置數據一樣格式的 Excel 進行填寫數據,編譯時將 Excel 轉化為 Json 數據,最終和自動發現數據一同通過分散式事務初始化。 其中編譯時將 Excel 生成 Json,並且通過 Maven 的依賴關係進行合併使用了豬齒魚 Maven 插件,具體程式碼參考://github.com/choerodon/choerodon-starters/tree/master/choerodon-maven-plugin
結語
豬齒魚數據初始化的方式從早期的 SQL 腳本,到 Liquibase,再加上為了滿足菜單初始化需要而設計的獨立 Python 初始化工具,在 0.17.0 版本中統一升級為 Liquibase Groovy + Excel 的形式,解決了目前遇到的所有問題。以上就是豬齒魚數據初始化的整個迭代過程和實現思路,謝謝大家。
本文由豬齒魚技術團隊原創,轉載請註明出處