1. 程式人生 > >Choerodon豬齒魚的資料初始化設計解析

Choerodon豬齒魚的資料初始化設計解析

Choerodon豬齒魚作為一個微服務框架需要解決微服務資料初始化本身具有的問題和複雜性,同時也需要滿足框架本身特有的資料初始化需求,下面為大家介紹一下這方面的設計思想和實現。

微服務的資料初始化難題

先來看一下在微服務的資料初始化中常見的幾個問題。

▍1.1 表結構的初始化和可平滑升級

表結構的定義在資料庫初始化中是重中之重,它涉及到整個服務執行和利用資料庫實現功能的方式,一般來說表結構定義和升級涉及到以下操作:建立表,建立欄位,建立索引,修改索引,修改欄位,重命名錶,刪除索引,刪除欄位,刪除表。這些操作如果都需要對多種資料庫進行相容和可平滑升級,那麼複雜度就會突然增加,基本不可能像傳統應那樣通SQL指令碼進行管理,而豬齒魚面臨的就是這種情況。

▍1.2 跨服務資料的自動初始化

在微服務架構中,不可避免的會出現需要將資料初始化到其他服務的場景,比如豬齒魚的大部分服務都需要初始化選單資料到IAM服務,處理選單列表的請求是由IAM服務處理的,然而對於微服務的部署而言,很多時候又不能執行初始化資料的時候連線多個數據源從而產生問題。而且微服務的部署可能不是全量的,存在這個部署不需要這個服務的情況,這種情況的初始化又需要修改初始化的指令碼或者程式帶來複雜性。

▍1.3 繁瑣的編碼化資料的自動發現

資料的初始化中有一類資料是可以從程式碼或者文件,或者其它地方收集提取出來的,並且這部分資料往往比較繁瑣和龐大,比如在豬齒魚中的許可權鑑定需要URL與Controller,Method的對映關係,這部分資料如果手工進行初始化會產生很大的工作量,並且在實際程式碼修改後可能初始化資料沒有更新產生問題。

豬齒魚的本服務資料的初始化

認識到這些問題後接下來再來介紹一下豬齒魚在多次迭代後對這些問題提出的解決方案。先來看對於本服務資料初始化的解決方案,這部分的具體實現可以參考開原始碼:https://github.com/choerodon/choerodon-starters/tree/master/choerodon-liquibase

▍2.1 資料表結構的初始化

對於資料庫表結構的初始化豬齒魚採用Liquibase開源專案,具體為使用Liquibase的Groovy DSL,增強了Liquibase的靈活性,並且Liquibase本身支援平滑升級和多資料庫支援解決了表結構初始化的問題。

▍2.2 本服務預置資料的初始化

對於一些預置資料,包括預置的使用者角色,以及自動化測試執行時候需要的預置資料,豬齒魚使用Excel來輔助初始化的資料,方便操作,填充,關聯。

豬齒魚的跨服務資料的初始化

下面再看一下豬齒魚關於跨服務資料初始化和自動發現數據的處理方式。

▍3.1 自動發現數據的初始化

服務啟動後通過管理服務訪問各個服務的通用介面從ClassPath中獲取資料通過分散式事務進行初始化。

具體程式碼參考:https://github.com/choerodon/manager-service/blob/master/src/main/java/io/choerodon/manager/api/eventhandler/EurekaEventObserver.java

▍3.2 跨服務預置資料的初始化

使用與本服務預置資料一樣格式的Excel進行填寫資料,編譯時將Excel轉化為Json資料,最終和自動發現數據一同通過分散式事務初始化。 其中編譯時將Excel生成Json,並且通過Maven的依賴關係進行合併使用了豬齒魚Maven外掛,具體程式碼參考:https://github.com/choerodon/choerodon-starters/tree/master/choerodon-maven-plugin

結語

豬齒魚資料初始化的方式從早期的SQL指令碼,到Liquibase,再加上為了滿足選單初始化需要而設計的獨立Python初始化工具,在0.17.0版本中統一升級為Liquibase Groovy + Excel 的形式,解決了目前遇到的所有問題。以上就是豬齒魚資料初始化的整個迭代過程和實現思路,謝謝大家。

更多Choerodon豬齒魚微服務相關文章▼

關於Choerodon豬齒魚

Choerodon豬齒魚開源多雲整合平臺,是基於開源技術Kubernetes,Istio,knative,Gitlab,Spring Cloud來實現本地和雲端環境的整合,實現企業多雲/混合雲應用環境的一致性。平臺通過提供精益敏捷、持續交付、容器環境、微服務、DevOps等能力來幫助組織團隊來完成軟體的生命週期管理,從而更快、更頻繁地交付更穩定的軟體。

大家也可以通過以下社群途徑瞭解豬齒魚的最新動態、產品特性,以及參與社群貢獻: