引言
Fineract 是 Apache Foundation 認證的開源金融應用平臺,近年因社區貢獻量激增與功能複雜度提升,其單體架構已無法滿足穩定性與可擴展性需求。為應對開發者經驗不足、功能耦合嚴重及客製化限制等問題,Fineract 開始推動模組化改革。本文探討其模組化進展、技術挑戰與未來方向,並分析其在 Apache Foundation 框架下的實踐價值。
模組化動機
Fineract 的模組化改革源於四大核心需求:
- 社區成長與貢獻增加:過去兩年貢獻量成長數倍,每年釋出4個版本,但開發流程因經驗不足而顯不穩定。
- 開發者體驗問題:單體架構導致跨功能依賴,開發者易重複使用不相關工具類,造成功能耦合。
- 穩定性需求:社區亟需穩定代碼基準,模組化可提升版本維護與功能隔離。
- 客製化挑戰:原有架構限制客製化靈活性,需建立標準化模組化框架。
技術架構與實踐
分層結構與技術選項
Fineract 的模組化採用分層設計,核心技術選項包括:
- REST API 層:初期使用 JAX-RS,後改用 Spring Boot JSON 序列化,但因資料結構複雜需手動處理。
- CQRS 模式:分離讀取與寫入請求,支援獨立擴展(寫入實例/讀取實例)。
- 資料層:
- 初期使用 Hibernate,後因 Apache Foundation 許可問題切換至 OpenJPA,最終採用 EclipseLink。
- 部分功能直接使用原生 SQL,導致資料庫依賴性問題,後支援 PostgreSQL。
- 服務層:使用 Spring @Service 註解,包含業務邏輯與資料庫存取(Repository)。
模組化實踐案例
- 報告引擎模組:因 GPL 授權問題獨立為模組,提供獨立 JAR 檔案,並修改 Fineract 資料參數以支援外部模組。
- Fineract 客戶端模組:標準化 API 客戶端,透過 OpenAPI 描述符生成機器可讀文件,並開發 Code Generator 工具。
- 核心模組拆分:試圖建立核心模組(Core Module)與其他功能模組,但仍有跨模組依賴問題。
技術挑戰與解決方案
JSON 序列化與資料層問題
- JSON 序列化耦合:手動處理 JSON 序列化/反序列化導致業務邏輯層與通訊協議耦合,未來可能切換至 gRPC。
- 資料層複雜性:混合 JPA 與手動 SQL,需解決資料庫獨立性與查詢生成工具(如 QueryDSL、JQ)的整合。
模組化結構設計
模組包結構包含:
API
:REST 資源類(入口點)。
Data
:資料傳輸物件(DTOs)、服務介面與實現(業務邏輯)。
Domain
:資料庫與 Java 對象映射。
Repository
:資料庫存取層。
現存問題:資料層與服務層耦合,需重新設計以實現真正的模組化。
未來展望與優化方向
- Spring Modulith 框架:結合單體與模組化特性,作為模組化設計參考。
- 模組化標準化:
- 進一步拆分核心模組與功能模組,減少跨模組依賴。
- 透過 OpenAPI 生成客戶端工具,提升 API 使用效率。
- 技術優化:
- 採用 QueryDSL 或 JQ 等工具,解決手動 SQL 與 JPA 混合使用的問題。
- 提升資料庫獨立性,支援多種資料庫(如 PostgreSQL)。
當前狀態與社區進展
- 模組化進展:已實現報告引擎與客戶端模組,但核心架構仍為單體。
- 版本控制:支援最多 3 個次要版本,確保穩定性;版本釋出頻率提升,但開發者瓶頸仍需改善。
- 架構改進:逐步拆分 Gradle 模組,減少單體代碼耦合;探討完全移除 JPA 的可能性,採用更靈活的資料庫操作方式。
技術債與依賴問題
- 領域邊界模糊:貸款、用戶等實體資料存在跨模組依賴(如貸款與用戶表的關聯)。
- 測試與建構挑戰:測試用例數量龐大(約 900+),但建構過程串行執行,反饋循環耗時(1 小時以上)。
- 資料庫層問題:手動撰寫 SQL 語句時未考慮資料隔離,導致跨模組 JOIN 操作;缺乏靜態檢查機制。
自訂模組與解決方案
- 自訂模組設計:建議將自訂功能分離至獨立目錄,避免與上游專案混在一起;提供自動化工具(如 Gradle 配置、Liquibase 腳本、Docker 映像打包)。
- 模組替換機制:移除原服務介面的
@Service
註解,改用 Java 配置實現條件載入,允許完全替換或擴充原功能。
安全模組化與未來方向
- 安全模組進展:當前使用 Spring Security,權限、角色資訊儲存於資料庫;計畫整合 Spring Authorization Server,使 Fineract 成為獨立 ID 服務,支援外部服務(如 Keycloak)。
- 其他改進:移除非必要模組(如基礎設施配置模組),改用 Kubernetes 等配置管理工具;引入 ArcUnit 等工具進行架構檢查。
總結
Fineract 的模組化改革在提升穩定性與可擴展性方面已取得初步成果,但領域邊界模糊、資料耦合與技術債仍是主要挑戰。未來需持續拆分核心模組,強化資料隔離,並透過 Spring Modulith 等框架優化設計。開發者應遵循領域邊界規則,避免混入非相關資料,以確保模組化目標的達成。