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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/896918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ollama存在安全风险的情况通报及解决方案

据清华大学网络空间测绘联合研究中心分析&#xff0c;开源跨平台大模型工具Ollama默认配置存在未授权访问与模型窃取等安全隐患。鉴于目前DeepSeek等大模型的研究部署和应用非常广泛&#xff0c;多数用户使用Ollama私有化部署且未修改默认配置&#xff0c;存在数据泄露、算力盗…

线代[9]|线性代数主要内容及其发展简史(任广千《线性代数的几何意义》的附录1)

文章目录 向量行列式矩阵线性方程组二次型 向量 向量又称为矢量&#xff0c;最初应用与物理学。很多物理量如力、速度、位移以及电场强度、磁感应强度等等都是向量。大约公元前350年前&#xff0c;古希腊著名学者亚里士多德就知道了力可以表示成向量&#xff0c;两个力的组合作…

H20半精度推理报错:Floating point exception (core dumped)

Nvidia H20 显卡在执行bf16&#xff0c;f16推理时程序异常中断 时间是 2025年3月4日 课题组新到的8卡H20服务器在使用过程中&#xff0c;torch加载模型进行bf16的推理时&#xff0c;出现Floating point exception (core dumped)错误 当时一头雾水&#xff0c;后来苦苦寻找&…

服务是否设置为开机自启动

在 Linux 系统中&#xff0c;可以通过以下几种方法检查服务是否设置为开机自启动&#xff1a; 方法 1&#xff1a;使用 systemctl 命令&#xff08;适用于 systemd 系统&#xff09; systemctl 是 systemd 系统的命令行工具&#xff0c;用于管理系统服务。以下是具体步骤&…

QT——基于 QListWidget 和 QStackedWidget 的页面切换

Qt 练习题&#xff1a;基于 QListWidget 和 QStackedWidget 的页面切换 Qt 练习题&#xff1a;基于 QListWidget 和 QStackedWidget 的页面切换 题目描述&#xff1a; 请使用 Qt 设计一个窗口&#xff0c;其中包含一个 QListWidget 和一个 QStackedWidget。要求实现以下功能&a…

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例2: 分页和排序

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例2: 分页和排序📚前言📚页面效果📚指令…

C语言文件操作学习笔记:从基础到实践

在C语言的知识体系中&#xff0c;文件操作是极为关键的一环&#xff0c;它赋予了程序存储和读取外部数据的能力&#xff0c;对于开发各类实用程序至关重要。近期&#xff0c;借助课程的学习&#xff0c;我对C语言文件操作进行了系统且深入的学习&#xff0c;下面将我的学习心得…

VLM-E2E:通过多模态驾驶员注意融合增强端到端自动驾驶

25年2月来自香港科大广州分校、理想汽车和厦门大学的论文“VLM-E2E: Enhancing End-to-End Autonomous Driving with Multimodal Driver Attention Fusion”。 人类驾驶员能够利用丰富的注意语义&#xff0c;熟练地应对复杂场景&#xff0c;但当前的自动驾驶系统难以复制这种能…

第十天-字符串:编程世界的文本基石

在编程的广阔领域中&#xff0c;字符串是极为重要的数据类型&#xff0c;它就像一座桥梁&#xff0c;连接着人类的自然语言和计算机能够理解与处理的数字信息。下面&#xff0c;让我们深入探索字符串的世界。 一、字符串简介 字符串是由零个或多个字符组成的有序序列&#xff…

《基于HarmonyOS NEXT API 12+,搭建新闻创作智能写作引擎》

在信息爆炸的时代&#xff0c;新闻行业对于内容生产的效率和质量有着极高的要求。AI技术的发展为新闻创作带来了新的变革契机&#xff0c;借助AI智能写作助手&#xff0c;新闻工作者可以快速生成新闻稿件的初稿&#xff0c;大大提高创作效率。本文将基于HarmonyOS NEXT API 12及…

基于STM32的环境监测系统(自制蓝牙APP)

目录 项目概述 实物图 演示视频 概述 硬件模块 原理图以及PCB 0.96寸OLED屏幕&#xff08;SSD1306&#xff09; CubeMX配置 初始化代码 MQ-2烟雾传感器 CubeMX配置 初始化代码 DHT11温湿度模块 驱动代码 HC-05蓝牙模块 CubeMX配置 ​编辑 空闲中断回调函数 有…

linux离线安装ollama并部署deepseek-r1模型 指南

这篇文章主要分为两部分&#xff1a; (1)离线环境下如何部署Ollama&#xff1b; (2)在离线环境下如何配置大模型&#xff0c;其中这一步又分为&#xff1a;  1)部署完整的deepseek大模型&#xff0c;如&#xff1a;deepseek-r1:32B;  2)部署蒸馏版模型&#xff0c;如&#xf…

坐标变换介绍与机器人九点标定的原理

【备注】本文的C#代码在下面链接中可以下载:Opencv的C#九点标定代码资源-CSDN文库 https://download.csdn.net/download/qq_34047402/90452336 一、坐标变换的介绍 1.绕原点旋转的坐标变换 一个点(x,y)绕原点旋转u度,其旋转后的坐标(x1,y1)如何计算? 2.绕任意点的坐标变…

大语言模型 智能助手——既能生成自然语言回复,又能在必要时调用外部工具获取实时数据

示例代码&#xff1a; import json from langgraph.graph import Graph, END,StateGraph from langchain_core.utils.function_calling import convert_to_openai_function from langchain_community.tools.openweathermap import OpenWeatherMapQueryRun from langchain_core…

FPGA学习(一)——DE2-115开发板编程入级

FPGA学习&#xff08;一&#xff09;——DE2-115开发板编程入级 一、实验目的 通过 1 位全加器的详细设计&#xff0c;深入掌握原理图输入以及 Verilog 的两种设计方法&#xff0c;熟悉 Quartus II 13.0 软件的使用流程&#xff0c;以及在 Intel DE2-115 开发板上的硬件测试过…

中间件专栏之MySQL篇——MySQL事务原理、锁机制分析

MySQL的事务性也是其重要特性之一。 什么是事务&#xff1a;事务的本质是并发控制的单元&#xff0c;是用户定义的一个操作序列。这些操作要么都做&#xff0c;要么都不做&#xff0c;是 一个不可分割的工作单位。 目的&#xff1a;事务的目的在于将数据库从一种一致性状态转…

机器学习的三个基本要素

机器学习的基本要素包括模型、学习准则&#xff08;策略&#xff09;和优化算法三个部分。机器学习方法之间的不同&#xff0c;主要来自其模型、学习准则&#xff08;策略&#xff09;、优化算法的不同。 模型 机器学习首要考虑的问题是学习什么样的模型&#xff08;Model&am…

集成方案 | Docusign 能与哪些应用程序集成?

如何实现 Docusign 与多种系统平台之间的高效集成&#xff1f; 在企业跨境签约场景中&#xff0c;员工常常需要在电子签系统与办公应用&#xff08;如钉钉、企业微信&#xff09;、CRM、ERP 等系统之间来回切换&#xff0c;手动上传合同、下载签署文件并同步数据。这种繁琐的操…

2025华为OD机试真题目录【E卷+A卷+B卷+C卷+D卷】持续收录中...

摘要 本专栏提供2025最新最全的华为OD机试真题库&#xff08;EABCD卷&#xff09;&#xff0c;包括100分和200分题型。题目包含题目描述、输入描述、用例、备注和解题思路、多种语言解法&#xff08;Java/JS/Py/C/C&#xff09;。希望小伙伴们认真学习、顺利通过。 声明 本专…

广域互联网关键技术详解(GRE/LSTP/IPsec/NAT/SAC/SPR)

《广域互联网关键技术详解》属于博主的“广域网”专栏&#xff0c;若想成为HCIE&#xff0c;对于广域网相关的知识需要非常了解&#xff0c;更多关于广域网的内容博主会更新在“广域网”专栏里&#xff0c;请持续关注&#xff01; 一.前言 广域互联技术纷杂多样&#xff0c;不…