当前位置: 首页 > article >正文

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

开源之夏经验分享|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. 工程思维

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

相关文章:

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

开源之夏经验分享&#xff5c;Koupleless 社区黄兴抗&#xff1a;在开源中培养工程思维 文|黄兴抗 电子信息工程专业 Koupleless 社区贡献者 就读于南昌师范学院&#xff0c;电子信息工程专业的大三学生。 本文 2634 字&#xff0c;预计阅读 7​ 分钟​ 今天 SOFAStack 邀…...

健康养生:开启活力人生的钥匙

在快节奏的现代生活中&#xff0c;健康养生已成为我们追求美好生活的关键。它不仅关乎身体的强健&#xff0c;更与心灵的宁静息息相关。 合理饮食是健康养生的基石。多吃蔬菜、水果&#xff0c;它们富含维生素与矿物质&#xff0c;为身体提供充足养分。全谷物食品也是不错的选…...

HTTP 与 HTTPS 协议:从基础到安全强化

引言 互联网的消息是如何传递的&#xff1f; 是在路由器上不断进行跳转 IP的目的是在寻址 HTTP 协议&#xff1a;互联网的基石 定义 HTTP&#xff08;英文&#xff1a;HyperText Transfer Protocol&#xff0c;缩写&#xff1a;HTTP&#xff09;&#xff0c;即超文本传输协…...

项目工坊|Python驱动淘宝信息爬虫

目录 前言 1 完整代码 2 代码解读 2.1 导入模块 2.2 定义 TaoBao 类 2.3 search_infor_price_from_web 方法 2.3.1 获取下载路径 2.3.2 设置浏览器选项 2.3.3 反爬虫处理 2.3.4 启动浏览器 2.3.5 修改浏览器属性 2.3.6 设置下载行为 2.3.7 打开淘宝登录页面 2.3.…...

SQLite Alter 命令详解

SQLite Alter 命令详解 SQLite 是一种轻量级的数据库&#xff0c;广泛用于各种嵌入式系统、移动应用和小型项目。SQLite 的ALTER TABLE命令用于修改已存在的表结构&#xff0c;包括添加、删除或修改列&#xff0c;以及重命名表等操作。本文将详细解析SQLite的ALTER TABLE命令&…...

【Linux】冯诺依曼体系结构-操作系统

一.冯诺依曼体系结构 我们所使用的计算机&#xff0c;如笔记本等都是按照冯诺依曼来设计的&#xff1a; 截止目前&#xff0c;我们所知道的计算机都是由一个一个的硬件组装起来的&#xff0c;这些硬件又由于功能的不同被分为了输入设备&#xff0c;输出设备&#xff0c;存储器…...

mapbox进阶,使用点类型geojson加载symbol符号图层,用于标注带图标的注记,且文字居中在图标内,图标大小自适应文字

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;mapbox 从入门到精通 文章目录 一、&#x1f340;前言1.1 ☘️mapboxgl.Map 地图对象…...

布隆过滤器(附带位图讲解)

提到位图&#xff0c;我们首先想到的应该是它的两面定义&#xff1a; 位图图像&#xff08;bitmap&#xff09;&#xff0c;亦称为点阵图或栅格图像&#xff0c;是由称作像素&#xff08;图片元素&#xff09;的单个点组成的。位图是指内存中连续的二进制位&#xff0c;用于对…...

【芯片设计】AI偏车载芯片前端设计工程师面试记录·20250304

【芯片前端设计面试经验专栏介绍】 专栏聚焦数字芯片前端设计核心技术与面试方法论,涵盖架构设计、RTL开发、验证方法学、低功耗设计、时序收敛等高频考点,深入解析行业头部企业的面试真题与设计场景。内容包含但不限于: 知识点系统梳理 :从Verilog/SV语法陷阱、FSM设计模式…...

2024北京理工大学计算机复试上机真题

2024北京理工大学计算机复试上机真题 2024北京理工大学计算机考研复试上机真题 在线评测&#xff1a;https://app2098.acapp.acwing.com.cn/ 等腰梯形 题目描述 请输入高度h&#xff0c;输入一个高为h&#xff0c;上底边长为h的等腰梯形&#xff08;例如h4&#xff0c;图形…...

CC++的内存管理

目录 1、C/C内存划分 C语言的动态内存管理 malloc calloc realloc free C的动态内存管理 new和delete operator new函数和operator delete函数 new和delete的原理 new T[N]原理 delete[]的原理 1、C/C内存划分 1、栈&#xff1a;存有非静态局部变量、函数参数、返回…...

Redis是什么?如何使用Redis进行缓存操作?

Redis&#xff08;Remote Dictionary Server&#xff09;是一款高性能的内存键值存储系统&#xff0c;广泛用于缓存、消息队列、会话存储和实时数据处理等场景。它基于内存存储&#xff0c;支持多种数据结构&#xff0c;如字符串、列表、集合、有序集合和哈希表等&#xff0c;具…...

【商城实战(2)】商城架构设计:从底层逻辑到技术实现

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…...

USB 模块 全面解析(一)

本文是我整理的一些 USB 的学习心得&#xff0c;希望能对大家有所帮助。 文章目录 前言&#x1f352; USB 基本概述&#x1f352; USB 结构框架&#x1f349;硬件框架&#x1f349; 软件框架 &#x1f352; USB 电气信号&#x1f349; USB 硬件线路&#x1f349; 信号电平&…...

xr-frame 3D Marker识别,扬州古牌坊 3D识别技术稳定调研

目录 识别物体规范 3D Marker 识别目标文件 map 生成 生成任务状态解析 服务耗时&#xff1a; 对传入的视频有如下要求&#xff1a; 对传入的视频建议&#xff1a; 识别物体规范 为提高Marker质量&#xff0c;保证算法识别效果&#xff0c;可参考Marker规范文档 Marker规…...

拆一拆吉利普及高阶智驾的盲盒

吉利银河后续所有的全新和改款车型都会搭载千里浩瀚不同级别的智驾系统&#xff1b; 既然银河都标配了&#xff0c;定位更高的领克大概率也会全系标配&#xff1b; 加上极氪从去年下半年就是全系标配。 这样一来&#xff0c;就是吉利版的「全民智驾」。 一、 「千里浩瀚」&a…...

2024四川大学计算机考研复试上机真题

2024四川大学计算机考研复试上机真题 2024四川大学计算机考研复试机试真题 历年四川大学计算机考研复试机试真题 在线评测&#xff1a;https://app2098.acapp.acwing.com.cn/ 分数求和 题目描述 有一分数序列&#xff1a; 2/1 3/2 5/3 8/5 13/8 21/13… 求出这个数列的前 …...

解锁高效编程:深度剖析C++11核心语法与标准库实战精要

目录 一、引言 二、核心语法革新 &#xff08;一&#xff09;类型推导系统 1. 统一初始化语法 2. initializer_list 机制 &#xff08;三&#xff09;函数增强 1. Lambda表达式 2. 可变参数模版 3. 数对象包装和参数绑定 &#xff08;四&#xff09;内存管理 1. 右值引用与…...

基于提示驱动的潜在领域泛化的医学图像分类方法(Python实现代码和数据分析)

摘要 医学图像分析中的深度学习模型易受数据集伪影偏差、相机差异、成像设备差异等导致的分布偏移影响&#xff0c;导致在真实临床环境中诊断不可靠。领域泛化&#xff08;Domain Generalization, DG&#xff09;方法旨在通过多领域训练提升模型在未知领域的性能&#xff0c;但…...

深度学习-大白话解释循环神经网络RNN

目录 一、RNN的思想 二、RNN的基本结构 网络架构 ​关键点 三、RNN的前向传播 四、RNN的挑战:梯度爆炸和梯度消失 问题分析 ​示例推导 五、LSTM:RNN的改进 核心组件 ​网络架构 3. LSTM 的工作流程 4. 数学公式总结 5. LSTM 的优缺点 ​优点 ​缺点 6. LSTM 的…...

Spring统一格式返回

目录 一&#xff1a;统一结果返回 1&#xff1a;统一结果返回写法 2&#xff1a;String类型报错问题 解决方法 二&#xff1a;统一异常返回 统一异常返回写法 三&#xff1a;总结 同志们&#xff0c;今天咱来讲一讲统一格式返回啊&#xff0c;也是好久没有讲过统一格式返…...

IPOIB 驱动中的发送完成处理机制

1. ipoib_napi_add_rss 函数 ipoib_napi_add_rss 函数的主要作用是为 InfiniBand 设备的每个接收队列和发送队列添加 NAPI 结构,并注册相应的轮询函数。NAPI(New API)是一种网络接口卡(NIC)的轮询机制,用于高效处理网络数据包,避免频繁的中断处理开销。 static void i…...

BambuStudio学习笔记:format格式化输出

# Slic3r::format 字符串格式化工具说明## 概述本头文件提供了基于 boost::format 的 C 字符串格式化工具封装&#xff0c;旨在简化多参数格式化操作&#xff0c;支持类似 C20 std::format 的调用语法。## 核心设计目标- **简化调用语法**&#xff1a;替代 boost::format 的链式…...

软件测试基础:功能测试知识总结

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、测试项目启动与研读需求文档 &#xff08;一&#xff09; 组建测试团队 1、测试团队中的角色 2、测试团队的基本责任 尽早地发现软件程序、系统或产品中…...

wheel_legged_genesis 开源项目复现与问题记录

Reinforcement learning of wheel-legged robots based on Genesis System Requirements Ubuntu 20.04/22.04/24.04 python > 3.10 开始配置环境&#xff01; 点击releases后进入&#xff0c;下载对应最新版本的代码&#xff1a; 将下载后的代码包解压到你的自定义路径下&…...

【金融量化】Ptrade中如何量化策略的交易持久化?

交易持久化是指在实际交易中交易相关的数据&#xff08;如订单信息、持仓状态、策略参数等&#xff09;保存到本地或远程存储中&#xff0c;以便在程序重启、系统崩溃或网络中断后能够恢复交易状态&#xff0c;确保策略的连续性和稳定性。以下是如何在策略中实现交易持久化的方…...

qt实践教学(编写一个代码生成工具)持续更新至完成———

前言&#xff1a; 我的想法是搭建一个和STM32cubemux类似的图形化代码生成工具&#xff0c;可以把我平时用到的代码整合一下全部放入这个软件中&#xff0c;做一个我自己专门的代码生成工具&#xff0c;我初步的想法是在下拉选框中拉取需要配置的功能&#xff0c;然后就弹出对…...

设置 CursorRules 规则

为什么要设置CursorRules&#xff1f; 设置 CursorRules 可以帮助优化代码生成和开发流程&#xff0c;提升工作效率。具体的好处包括&#xff1a; 1、自动化代码生成 &#xff1a;通过定义规则&#xff0c;Cursor 可以根据你的开发需求自动生成符合规定的代码模板&#xff0c…...

AI 芯片全解析:定义、市场趋势与主流芯片对比

1. 引言&#xff1a;什么是 AI 芯片&#xff1f; 随着人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;AI 计算的需求不断增长&#xff0c;从云计算到边缘计算&#xff0c;AI 芯片成为推动智能化时代的核心动力。那么&#xff0c;什么样的芯片才算 AI 芯片&#xff…...

Axure高保真Element框架元件库

点击下载《Axure高保真Element框架元件库》 原型效果&#xff1a;https://axhub.im/ax9/9da2109b9c68749a/#g1 摘要 本文详细阐述了在 Axure 环境下打造的一套高度还原 Element 框架的组件元件集。通过对 Element 框架组件的深入剖析&#xff0c;结合 Axure 的强大功能&#…...