开源之夏经验分享|Koupleless 社区黄兴抗:在开源中培养工程思维

简介: 黄兴抗是南昌师范学院电子信息工程专业的大三学生,同时也是Koupleless社区的贡献者。在开源之夏2024项目中,他参与了“存量应用自动改造成模块”的开发,旨在解决企业云原生转型中的存量应用改造难题。通过自动化工具,实现了传统应用向模块化的低成本升级,兼顾代码兼容性与独立启动功能。项目链接:[点击这里](https://summer-ospp.ac.cn/org/prodetail/2495a0376?lang=zh&list=pro)。简介字数:238个字符。

文|黄兴抗

电子信息工程专业

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. 工程思维

项目让我开始从更全面的角度看问题:功能的实现只是第一步,如何保证工具的可维护性、扩展性,甚至用户体验,都是需要考虑的重要因素。

相关文章
|
6月前
|
Cloud Native 测试技术 Go
开源之夏经验分享|MOSN 社区韦鑫:做自己认为很酷的事
韦鑫是南京航空航天大学计算机科学与技术学院研三学生,研究方向为分布式系统。作为HTNN社区贡献者,他参与了开源之夏2024 MOSN社区项目,负责将Sentinel-golang流量控制能力集成到MOSN on Envoy(MoE)生态中。通过该项目,韦鑫不仅提升了对服务网格和云原生网关的理解,还学会了如何开发HTNN插件,并深刻体会到严格的单元测试、集成测试及CI/CD对项目的重要性。他的经历展示了积极参与开源项目的价值,鼓励更多人勇敢尝试并投身于开源社区。
开源之夏经验分享|MOSN 社区韦鑫:做自己认为很酷的事
|
6月前
|
Cloud Native Java 中间件
如何在一个基座上安装更多的 Koupleless 模块?
本文由蚂蚁集团技术工程师梁栎鹏撰写,深入探讨了Koupleless模块瘦身的原理、原则及实践方法。Koupleless是云原生领域的开源项目,旨在通过模块化隔离与共享提升效率、降低成本。文章介绍了三种模块瘦身方式:复用基座类、对象及清理资源,重点讲解了自动瘦身和配置文件瘦身的具体实现,并强调了确保瘦身正确性的关键步骤。通过这些方法,可以显著减少模块体积,提高部署效率,降低资源消耗。文中还展示了实际案例的效果对比,证明了模块瘦身的有效性。欢迎读者深入了解并参与Koupleless的共建。
如何在一个基座上安装更多的 Koupleless 模块?
|
移动开发 Java API
大疆无人机对接
本文介绍了大疆无人机对接第三方云平台的方案,包括设备对接和CloudAPI对接两种方式,重点讨论了CloudAPI对接。CloudAPI对接方案通过DJI Pilot 2或大疆机场将无人机与第三方云平台连接,实现低门槛接入,无需重复开发APP。方案优势在于让开发者更专注于业务开发,而非无人机功能适配。文章详细阐述了对接流程,包括环境准备、申请APPKey、对接流程、直播功能及获取无人机实时数据等内容,并提供了丰富的接口说明和技术支持资源。
6424 4
大疆无人机对接
|
5月前
|
SQL 运维 Java
蚂蚁 Flink 实时计算编译任务 Koupleless 架构改造
本文介绍了对Flink实时计算编译任务的Koupleless架构改造。为解决进程模型带来的响应慢、资源消耗大等问题,团队将进程模型改为线程模型,并借助Koupleless的类加载隔离能力实现版本和包的隔离。通过动态装配Plugin及其Classpath,以及Biz运行时仅对依赖Plugin可见的设计,大幅优化了编译任务的性能。结果表明,新架构使编译耗时降低50%,吞吐量提升5倍以上。
蚂蚁 Flink 实时计算编译任务 Koupleless 架构改造
|
6月前
|
Apache 数据库 开发者
喜报!Apache Seata (incubating) 荣获 2024 开源创新榜单“年度开源项目”!
12月18日,Apache Seata 在北京举行的2024开源创新榜单发布活动中荣获“年度开源项目”。该榜单由中国科协等权威机构主办,经过严格评审,Seata 凭借卓越的技术实力和社区贡献脱颖而出。Seata 是一款分布式事务解决方案,自2019年开源以来,已在GitHub收获超25.4k star,广泛应用于各领域企业,支持主流数据库和RPC框架。未来,Seata 将继续推动技术进步,共建开放、包容的社区生态。
喜报!Apache Seata (incubating) 荣获 2024 开源创新榜单“年度开源项目”!
|
设计模式 监控 Java
深入理解Spring Cloud中的断路器模式
深入理解Spring Cloud中的断路器模式
|
运维 自然语言处理 Cloud Native
SOFAStack 的下一个五年
下一个五年,让我们保持初心,一起把 SOFAStack 社区建设得更开放、更有趣!
SOFAStack 的下一个五年
|
消息中间件 缓存 Java
Kafka介绍
Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。 Kafka是一种高吞吐量的分布式发布订阅消息系统,作为消息中间件来说都起到了系统间解耦、异步、削峰等作用,同时又提供了Kafka streaming插件包在应用端实现实时在线流处理,它可以收集并处理用户在网站中的所有动作流数据以及物联网设备的采样信息
282 0
|
JavaScript 前端开发 API
【Vue3学习笔记】Vue3入门学习
本笔记跟随Bilibili尚硅谷张天禹讲师的Vue全家桶课程学习,非常适合不了解Vue3的同学们入门观看!Vue2笔记共三篇 Vue3笔记一篇
1071 1
|
存储 分布式计算 监控
分布式数据库HBase的基本概念和架构之基本架构的Region Server
分布式数据库HBase是一个开源的分布式数据库系统,是Apache Hadoop生态系统的重要组成部分。
498 0

热门文章

最新文章