开源之夏经验分享|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 包中:
- 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. 工程思维
项目让我开始从更全面的角度看问题:功能的实现只是第一步,如何保证工具的可维护性、扩展性,甚至用户体验,都是需要考虑的重要因素。
相关文章:
开源之夏经验分享|Koupleless 社区黄兴抗:在开源中培养工程思维
开源之夏经验分享|Koupleless 社区黄兴抗:在开源中培养工程思维 文|黄兴抗 电子信息工程专业 Koupleless 社区贡献者 就读于南昌师范学院,电子信息工程专业的大三学生。 本文 2634 字,预计阅读 7 分钟 今天 SOFAStack 邀…...
体验开源openeuler openharmony stratovirt模拟器
文档 openeuler社区面向数字基础设施的开源操作系统 openharmony社区 OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目, 目标是面向全场景、全连接、全智能时代、基于开源的方式,搭建一个智能终端设备操作系统…...
【AI实践】基于TensorFlow/Keras的CNN(卷积神经网络)简单实现:手写数字识别的工程实践
深度神经网络系列文章 【AI深度学习网络】卷积神经网络(CNN)入门指南:从生物启发的原理到现代架构演进【AI实践】基于TensorFlow/Keras的CNN(卷积神经网络)简单实现:手写数字识别的工程实践 引言 在深度…...
深入探讨AI-Ops架构 第一讲 - 运维的进化历程以及未来发展趋势
首先,让我们一起回顾运维的进化之路,然后再深入探讨AI-Ops架构的细节。 运维的进化历程 1. AI 大范围普及前的运维状态 (传统运维) 在AI技术尚未广泛渗透到运维领域之前,我们称之为传统运维,其主要特点是: 人工驱动…...
2025年全球生成式AI消费应用发展趋势报告
原文链接:The Top 100 Gen AI Consumer Apps - 4th Edition | Andreessen Horowitz 核心要点:本报告由a16z发布,深度解析了2025年全球生成式AI消费应用的发展格局,揭示了技术迭代与商业化加速的双重趋势。 报告显示,A…...
VBA 列方向合并单元格,左侧范围大于右侧范围
实现功能如下: excel指定行列范围内的所有单元格 规则1:每一列的连续相同的值合并单元格 规则2:每一列的第一个非空单元格与其下方的所有空白单元格合并单元 规则3:优先左侧列合并单元格,合并后,右侧的单元…...
设计AI芯片架构的入门 研究生入行数字芯片设计、验证的项目 opentitan
前言 这几年芯片设计行业在国内像坐过山车。时而高亢,时而低潮。最近又因为AI的热潮开始high起来。到底芯片行业的规律是如何? 我谈谈自己观点:芯片设计是“劳动密集型”行业。 “EDA和工具高度标准化和代工厂的工艺标准化之后,芯…...
【弹性计算】异构计算云服务和 AI 加速器(二):适用场景
异构计算云服务和 AI 加速器(二):适用场景 1.图形处理2.视频处理3.计算4.人工智能 异构计算 目前已经被广泛地应用于生产和生活当中,主要应用场景如下图所示。 1.图形处理 GPU 云服务器在传统的图形处理领域具有强大的优势&…...
JVM常用概念之移动GC和局部性
问题 非移动GC一定比移动GC好吗? 基础知识 移动GC和非移动GC 移动GC 在进行垃圾回收时,为了减少碎片而移动对象来顺利完成垃圾回收的GC。 Serial GC 在单线程环境下,它在标记-清除(Mark-Sweep)算法的基础上进行…...
微服务保护:Sentinel
home | Sentinelhttps://sentinelguard.io/zh-cn/ 微服务保护的方案有很多,比如: 请求限流 线程隔离 服务熔断 服务故障最重要原因,就是并发太高!解决了这个问题,就能避免大部分故障。当然,接口的并发…...
使用Wireshark截取并解密摄像头画面
在物联网(IoT)设备普及的今天,安全摄像头等智能设备在追求便捷的同时,往往忽视了数据传输过程中的加密保护。很多摄像头默认通过 HTTP 协议传输数据,而非加密的 HTTPS,从而给潜在攻击者留下了可乘之机。本文…...
IDEA 基础配置: maven配置 | 服务窗口配置
文章目录 IDEA版本与MAVEN版本对应关系maven配置镜像源插件idea打开服务工具窗口IDEA中的一些常见问题及其解决方案IDEA版本与MAVEN版本对应关系 查找发布时间在IDEA版本之前的dea2021可以使用maven3.8以及以前的版本 比如我是idea2021.2.2 ,需要将 maven 退到 apache-maven-3.…...
20250-3-8 树的存储结构
一、树的逻辑结构回顾 树:一个分支结点可以有多课子树 如果按照二叉树的存储来实现树的存储,则只依靠数组下标,无法反映结点之间的逻辑关系。 二、双亲表示法(顺序存储) 1.因此:我们可以用链式存储的方法&…...
Visual-RFT视觉强化微调:用「试错学习」教会AI看图说话
📜 文献卡 英文题目: Visual-RFT: Visual Reinforcement Fine-Tuning;作者: Ziyu Liu; Zeyi Sun; Yuhang Zang; Xiaoyi Dong; Yuhang Cao; Haodong Duan; Dahua Lin; Jiaqi WangDOI: 10.48550/arXiv.2503.01785摘要翻译: 像OpenAI o1这样的大型推理模型中的强化微调…...
PDF处理控件Aspose.PDF,如何实现企业级PDF处理
PDF处理为何成为开发者的“隐形雷区”? “手动调整200页PDF目录耗时3天,扫描件文字识别错误导致数据混乱,跨平台渲染格式崩坏引发客户投诉……” 作为开发者,你是否也在为PDF处理的复杂细节消耗大量精力?Aspose.PDF凭…...
DeepSeek-R1本地化部署(Mac)
一、下载 Ollama 本地化部署需要用到 Ollama,它能支持很多大模型。官方网站:https://ollama.com/ 点击 Download 即可,支持macOS,Linux 和 Windows;我下载的是 mac 版本,要求macOS 11 Big Sur or later,Ol…...
Swift Package Manager (SPM) 创建并集成本地库
在macOS 项目中,使用 Swift Package Manager (SPM) 创建并集成本地库的完整步骤。 创建一个macos应用程序,选择 swift、oc、swiftui都可以。 创建好应用之后,开始创建SPM本地库。 打开终端app,进入项目根目录,逐次输…...
分布式锁—6.Redisson的同步器组件
大纲 1.Redisson的分布式锁简单总结 2.Redisson的Semaphore简介 3.Redisson的Semaphore源码剖析 4.Redisson的CountDownLatch简介 5.Redisson的CountDownLatch源码剖析 1.Redisson的分布式锁简单总结 (1)可重入锁RedissonLock (2)公平锁RedissonFairLock (3)联锁MultiL…...
文献分享: ConstBERT固定数目向量编码文档
😂图放这了,大道至简的 idea \text{idea} idea不愧是 ECIR \text{ECIR} ECIR 👉原论文 1. ConstBERT \textbf{1. ConstBERT} 1. ConstBERT的原理 1️⃣模型的改进点:相较于 ColBERT \text{ColBERT} ColBERT为每个 Token \text{Tok…...
如何使用SSH命令安全连接并转发端口到远程服务器
ssh -p 22546 rootconnect.westc.gpuhub.com d6IS/mQKq/iG ssh -CNgv -L 6006:127.0.0.1:6006 rootconnect.westc.gpuhub.com -p 22546 第一条命令:用于登录远程服务器,进行交互式操作。第二条命令:用于建立 SSH 隧道,进行端口转…...
SolidWorks 转 PDF3D 技术详解
在现代工程设计与制造流程中,不同软件间的数据交互与格式转换至关重要。将 SolidWorks 模型转换为 PDF3D 格式,能有效解决模型展示、数据共享以及跨平台协作等问题。本文将深入探讨 SolidWorks 转 PDF3D 的技术原理、操作流程及相关注意事项,…...
9.2 EvictionManager源码解读
本节重点总结 : evictionManager初始化了两个相同的manager对象 evictionManager做本机驱逐pod的判定和厨房evictionAdmitHandler用来kubelet创建Pod前进依据本机的资源压力进行准入检查 evictionManager判断内存驱逐阈值有两种方法 第一种使用内核的memcg的通知机制ÿ…...
考研数一非数竞赛复习之Stolz定理求解数列极限
在非数类大学生数学竞赛中,Stolz定理作为一种强大的工具,经常被用来解决和式数列极限的问题,也被誉为离散版的’洛必达’方法,它提供了一种简洁而有效的方法,使得原本复杂繁琐的极限计算过程变得直观明了。本文&#x…...
整理一下高级设施农业栽培学这门课程的所有知识点
整理一下高级设施农业栽培学这门课程的所有知识点 以下是高级设施农业栽培学这门课程从入门到精通需要学习的知识点: 一、设施农业概述 设施农业的概念与发展历程 了解设施农业的定义、特点及作用,掌握其发展历程、现状与未来趋势。熟悉国内外设施农业…...
2025最新软件测试面试八股文(含答案+文档)
1、请试着比较一下黑盒测试、白盒测试、单元测试、集成测试、系统测试、验收测试的区别与联系。 参考答案: 黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。 白盒测试:已知产品的内部工作过程…...
系统架构设计师—系统架构设计篇—基于体系结构的软件开发方法
文章目录 概述基于体系结构的开发模型-ABSDM体系结构需求体系结构设计体系结构文档化体系结构复审体系结构实现体系结构演化 概述 基于体系结构(架构)的软件设计(Architecture-Based Software Design,ABSD)方法。 AB…...
求最大公约数【C/C++】
大家好啊,欢迎来到本博客( •̀ ω •́ )✧,我将带领大家详细的了解最大公约数的思想与解法。 一、什么是公约数 公约数,也称为公因数,是指两个或多个整数共有的因数。具体来说,如果一个整数能被两个或多个整数整除&…...
Transformer 代码剖析16 - BLEU分数(pytorch实现)
一、BLEU算法全景图 #mermaid-svg-uwjb5mQ2KAC6Rqbp {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-uwjb5mQ2KAC6Rqbp .error-icon{fill:#552222;}#mermaid-svg-uwjb5mQ2KAC6Rqbp .error-text{fill:#552222;stroke:…...
手机屏幕摔不显示了,如何用其他屏幕临时显示,用来导出资料或者清理手机
首先准备一个拓展坞 然后 插入一个外接的U盘 插入鼠标 插入有数字小键盘区的键盘 然后准备一根高清线,一端链接电脑显示器,一端插入拓展坞 把拓展坞的连接线,插入手机充电口(可能会需要转接头) 然后确保手机开机 按下键盘…...
labelimg标注的xml标签转换为yolo格式标签
本文不生产技术,只做技术的搬运工!!! 前言 在yolo训练时,我们需要对图像进行标注,而使用labelimg标注时如果直接选择输出yolo格式的数据集,则原始数据的很多信息无法被保存,因此一版…...
Linux云计算SRE-第十七周
1. 做三个节点的redis集群。 1、编辑redis节点node0(10.0.0.100)、node1(10.0.0.110)、node2(10.0.0.120)的安装脚本 [rootnode0 ~]# vim install_redis.sh#!/bin/bash # 指定脚本解释器为bashREDIS_VERSIONredis-7.2.7 # 定义Redis的版本号PASSWORD123456 # 设置Redis的访问…...
K8S学习之基础十八:k8s的灰度发布和金丝雀部署
灰度发布 逐步扩大新版本的发布范围,从少量用户逐步扩展到全体用户。 特点是分阶段发布、持续监控、逐步扩展 适合需要逐步验证和降低风险的更新 金丝雀部署 将新版本先部署到一小部分用户或服务器,观察其表现,再决定是否全面推广。 特点&…...
WSL with NVIDIA Container Toolkit
一、wsl 下安装 docker 会提示安装 docekr 桌面版,所以直接安装 docker 桌面版本即可 二、安装 NVIDIA Container Toolkit NVIDIA Container Toolkit仓库 https://github.com/NVIDIA/nvidia-container-toolkitgithub.com/NVIDIA/nvidia-container-toolkit 安装…...
PAT线上考试 真题/注意细节(甲/乙级)
闲谈 从此以后!参加竞赛! 都要为自己留够足够的时间练习! 都要为自己留够足够的时间练习! 都要为自己留够足够的时间练习! 重要的事情说三遍,毕竟这只是我参加各种竞赛的开始! \(ÿ…...
springcloud sentinel教程
QPS(Queries Per Second)即每秒查询率 TPS,每秒处理的事务数目 PV(page view)即页面浏览量 UV 访问数(Unique Visitor)指独立访客访问数 一、初识Sentinel 什么是雪崩问题? 微服务之间相…...
摄相机标定的基本原理
【相机标定的基本原理与经验分享】https://www.bilibili.com/video/BV1eE411c7kr?vd_source7c2b5de7032bf3907543a7675013ce3a 相机模型: 定义: 内参:就像相机的“眼睛”。它描述了相机内部的特性,比如焦距(镜头的放…...
HJ C++11 Day2
Initializer Lists 对于一个类P class P{P(int a, int b){cout << "P(int, int), a" << a << ", b " << b << endl;}P(initializer_list<int> initlist){cout << "P(initializer_list<int>), val…...
在 ASP.NET Core 中启用 Brotli 和 Gzip 响应压缩
在本文中,我们将探讨如何在 ASP.NET Core 应用程序中启用响应压缩,重点介绍 Brotli 和 Gzip 算法以及如何验证压缩是否有效。 什么是响应压缩? 响应压缩通过使用Brotli 或 Gzip等算法来最小化 HTTP 响应的大小。这些算法在传输文本资产&#…...
leetcode69.x 的平方根
题目: 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。…...
第11章 web应用程序安全(网络安全防御实战--蓝军武器库)
网络安全防御实战--蓝军武器库是2020年出版的,已经过去3年时间了,最近利用闲暇时间,抓紧吸收,总的来说,第11章开始学习利用web应用程序安全,主要讲信息收集、dns以及burpsuite,现在的资产测绘也…...
flac、kgg、kgma格式音频转换MP3
1. 选择需要转换的音频文件 2. 下载闪电音频格式转换器 闪电音频格式转换器-全面覆盖常见音乐格式_音频合并分割_音频压缩 3. 买会员有点贵,也没必要,偶尔转换一次的,就去闲鱼买,两天会员9块钱。 4. 闲鱼卖家给兑换码,…...
macos 程序 运行
sudo xattr -r -d com.apple.quarantine [/Applications/Name]使用stow 管理配置文件...
基于YOLO11深度学习的电瓶车进电梯检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
HTML5 表单属性
HTML5 表单属性 引言 HTML5作为新一代的网页标准,带来了许多新的特性和改进。在表单处理方面,HTML5引入了一系列新的表单属性,这些属性使得表单的创建和使用更加灵活和强大。本文将详细介绍HTML5表单属性,包括其功能、使用方法和注意事项。 一、HTML5表单属性概述 HTML…...
从0开始,手搓Tomcat
一、什么是Tomcat Tomcat 是一款开源的、轻量级的 Web 服务器,它不仅能够提供 HTTP 服务,还能够运行 Java Servlet 和 JavaServer Pages(JSP)。对于许多开发者来说,理解 Tomcat 的目录结构以及如何在该结构中组织应用…...
数列分块入门2
题目描述 给出一个长为 n n n 的数列,以及 n n n 个操作,操作涉及区间加法,询问区间内小于某个值 x x x 的元素个数。 输入格式 第一行输入一个数字 n n n。 第二行输入 n n n 个数字,第 i i i 个数字为 a i a_i ai&a…...
【ThreeJS Basics 06】Camera
文章目录 Camera 相机PerspectiveCamera 透视相机正交相机用鼠标控制相机大幅度转动(可以看到后面) 控制组件FlyControls 飞行组件控制FirstPersonControls 第一人称控制PointerLockControls 指针锁定控制OrbitControls 轨道控制TrackballControls 轨迹球…...
postman接口请求中的 Raw是什么
前言 在现代的网络开发中,API 的使用已经成为数据交换的核心方式之一。然而,在与 API 打交道时,关于如何发送请求体(body)内容类型的问题常常困扰着开发者们,尤其是“raw”和“json”这两个术语之间的区别…...
docker1
前言 技术架构 单机架构 应用数据分离架构 应用服务集群架构 读写分离/主从分离架构 写入主的时候,要同步Mysql从的数据才可以 冷热分离架构 写的时候要写入主和缓存数据库 读的时候先去缓存看有没有,没有的话就去从数据库读数据 主要就是看这个数据是…...
RocketMQ延迟消息深度解析:原理、实践与性能调优
RocketMQ延迟消息深度解析:原理、实践与性能调优 编程相关书籍分享:https://blog.csdn.net/weixin_47763579/article/details/145855793 DeepSeek使用技巧pdf资料分享:https://blog.csdn.net/weixin_47763579/article/details/145884039 一、…...