開源之夏經驗分享|Koupleless 社區黃興抗:在開源中培養工程思維
文|黃興抗
電子信息工程專業
Koupleless 社區貢獻者
就讀于南昌師范學院,電子信息工程專業的大三學生。
本文 2634 字,預計閱讀 7? 分鐘?
今天 SOFAStack 邀請到了開源之夏 2024 Koupleless 社區的中選學生黃興抗同學!在本項目中,他參與完成了?存量應用自動改造成模塊?。希望他分享的這段經歷,能讓更多人了解到 Koupleless 開源社區,感受開源的魅力~
?項目鏈接?:https://summer-ospp.ac.cn/org/prodetail/2495a0376?lang=zh&list=pro
項目信息
?項目名稱?:存量應用自動改造成模塊
?項目導師?:趙真靈
?項目背景?:在參與 Koupleless 社區項目之前,我就在社區文章中了解到,當前企業在向云原生轉型的過程中往往面臨著一個重要痛點——?存量應用改造成本高?。特別是對于大量已經運行的 SpringBoot/SOFABoot 應用,「如何低成本地實現模塊化改造」成為一個急需解決的問題。
?項目目的?:本項目的核心目標是建設存量應用的自動化模塊改造工具,使得應用能夠實現傳統應用向模塊化的低成本升級,兼顧代碼兼容性,同時支持獨立啟動與合并部署。
技術方案設計
? 整體架構
為了實現目標,我們通過 <span>arkctl</span>
命令行工具提供簡單易用的入口,將核心邏輯封裝在一個包含以下 4 個主要組件的 JAR 包中:
- Launcher—作為整個工具的統一入口
- ApplicationPropertiesModifier—用于掃描并修改應用配置
- SlimmingConfiguration—負責模塊瘦身和依賴管理
- PomModifier—專門處理 Maven 配置相關的邏輯
? 關鍵技術點
1. 配置文件自動化處理
自動掃描和修改配置文件,支持多環境配置合并,確保改造過程安全、可回滾。
2. POM 文件智能改造?
自動添加必要的依賴和插件,實現版本兼容檢測和適配。
3. 模塊瘦身方案
實現依賴隔離,優化模塊體積,保證改造后的應用在運行時的兼容性。
模塊改造的核心要素?
1. 模塊打包插件的引入
POM 文件中的關鍵配置如下:
<plugin>
<groupId>com.alipay.sofa</groupId>
<artifactId>sofa-ark-maven-plugin</artifactId>
<configuration>
<skipArkExecutable>true</skipArkExecutable>
<declaredMode>true</declaredMode>
</configuration>
</plugin>
Q:為什么需要引入模塊打包插件?
傳統的 Spring Boot 應用打包后是一個可獨立運行的 JAR,sofa-ark-maven-plugin 能夠將應用打包成符合模塊規范的格式,模塊化部署需要特殊的類加載隔離機制,通過 declaredMode 實現精確的類隔離,避免多模塊間的沖突。
2. 模塊瘦身的必要性
模塊瘦身配置示例:
slimming.excludeGroupIds=org.springframework,org.apache.commons
slimming.excludeArtifactIds=commons-lang,commons-io
Q:為什么需要模塊瘦身?
基座已包含大量公共依賴,模塊無需重復打包。重復依賴會導致類加載沖突,模塊體積過大影響啟動性能和資源利用,通過瘦身可以優化模塊大小,提高部署效率。
3. 配置文件改造的意義
配置文件處理的核心邏輯如下:
public static void modifyApplicationProperties(String directoryPath, String applicationName) {
Properties props = new Properties();
props.setProperty("spring.application.name", applicationName);
}
Q:為什么需要改造配置文件?
模塊需要獨立的應用名稱和上下文路徑,避免多模塊間的配置沖突,確保模塊能夠在合并部署環境中正確運行,支持模塊的動態部署和熱更新。
項目實現思路
針對傳統的存量應用手動改造成模塊的方式,對其相關步驟進行拆解和分析后,可感知到三個挑戰:配置文件改造、依賴管理和構建適配。
- 配置文件改造?方面,挑戰主要在于配置文件分散在不同目錄、多環境*(如開發、測試、生產)*配置的復雜性,以及可能存在的配置沖突。為了解決這些問題,我們通過遞歸掃描定位所有配置文件,利用 Java Properties API 確保讀寫的安全性,同時采用追加寫入的方式,避免覆蓋已有配置內容。
- 依賴管理方面,我們需要處理模塊與基座依賴的重復問題、版本沖突的風險,以及模塊體積過大導致加載性能下降的情況。針對這些問題,我們設計了預設排除規則,精確分析依賴關系,添加必要依賴,并將有沖突的模塊默認調整為經過測試的穩定版本。此外,我們在配置文件中增加了黑白名單規則,以實現模塊瘦身。
- 構建適配方面,主要難點在于多模塊項目復雜的依賴關系以及構建效率的優化。我們通過
<span>declaredMode</span>
實現類加載隔離,統一管理版本號,并合理配置構建參數,優化插件的執行順序,減少了不必要的構建步驟。
開源之夏個人隨訪
? 自我介紹
大家好,我是?黃興抗?,目前就讀于南昌師范學院電子信息工程專業,大三學生。雖然我的專業和計算機軟件領域并不完全對口,但我對軟件開發也頗感興趣,因此也十分向往接觸云原生技術、微服務架構等前沿技術領域。接觸開源是大二下學期時開始,自那之后我就經常關注開源社區的技術動態。
參與該項目的原因?
選擇 SOFAStack 社區主要有基于以下幾點的考慮:
1. 技術積累
SOFAStack 作為螞蟻集團開源的金融級云原生架構,擁有豐富的企業級實踐經驗。社區項目涵蓋了微服務、云原生等熱門技術領域,與我未來想從事的就業發展方向高度契合。
2. 社區氛圍
SOFAStack 社區有著完善的新人引導機制,倉庫所有者也會為新人提供適合入手的 issue 作為開始。使得我在相關課題正式開發之前,就可以對其中的模塊瘦身白名單實現的相關 issue 做一定貢獻,讓我能夠切身感受到解決問題過程中完善的反饋機制。同時社區維護者積極響應,使我能夠及時獲得技術指導。
3. 項目價值
Koupleless 項目致力于解決企業實際痛點,具有明確的商業價值。自動化改造工具的開發也能夠幫助我積累工程化經驗。此外,項目涉及多個技術領域,有助于拓展技術視野。
?如何克服項目過程中的困難與挑戰
在開發過程中少不了各種大大小小的困難與挑戰,其中不僅有代碼實現部分,也有許多非代碼要求的項目流程,如文檔編寫、工作流的設計、測試用例等工作。這些實際面向企業的開發流程規范,讓尚未就業的我時常感到困惑和阻礙。在這一情況下,導師給到我很多指導和建議,如參考一些優秀的活躍社區,這讓我收獲頗多。
在項目開發的初期階段,導師會細心引導我深入了解項目的愿景、業務背景以及代碼的整體架構,幫助我整體緊抓課題的方向,為后續開發奠定了堅實的基礎。
在實際開發過程中,每當我遇到困難或卡點時,導師總是耐心地為我提供具體的建議和可行的改進方向,幫助我快速找到解決問題的思路。此外,社區還定期舉辦雙周例會,大家在會上同步開發進展、交流心得,針對開發中遇到的難題展開討論,并集思廣益尋找高效的解決方案。這種機制不僅增強了團隊協作,也讓我更好地在學習中成長。
最讓我印象深刻的挑戰之一,是如何處理各種不同項目的配置文件差異和版本兼容性問題。針對前者,我采用了遞歸掃描的方式,并實現了智能合并策略,確保改造過程不會破壞原有配置。針對后者,面對不同版本的 Spring Boot 和 SOFABoot 應用,需要確保工具的通用性,最終通過實現版本檢測和適配機制解決了這個問題。
有哪些收獲
1. 技術積累
通過這個項目,我鍛煉了編碼能力,更重要的是學會了如何設計一個自動化工具來解決實際問題。尤其是在處理配置文件、管理依賴等方面積累了寶貴經驗。
2. 開源精神
參與社區讓我深刻體會到開源的協作精神。從社區成員的熱情幫助到積極的反饋機制,都讓我在解決問題的同時感受到了團隊合作的力量。
3. 工程思維
項目讓我開始從更全面的角度看問題:功能的實現只是第一步,如何保證工具的可維護性、擴展性,甚至用戶體驗,都是需要考慮的重要因素。