Stories

Detail Return Return

開源之夏經驗分享|Koupleless 社區黃興抗:在開源中培養工程思維 - Stories Detail

開源之夏經驗分享|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 包中:

  1. Launcher—作為整個工具的統一入口
  2. ApplicationPropertiesModifier—用於掃描並修改應用配置
  3. SlimmingConfiguration—負責模塊瘦身和依賴管理
  4. 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. 工程思維

項目讓我開始從更全面的角度看問題:功能的實現只是第一步,如何保證工具的可維護性、擴展性,甚至用户體驗,都是需要考慮的重要因素。

user avatar laoshidediannaozhuo Avatar metaxk Avatar tiandetuoba Avatar renzhendebaowenbei Avatar coderdd Avatar automq Avatar
Favorites 6 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.