想象一下,你是一位庞大且繁忙城市的管理者,这座城市完全由无数微小的、独立的社区组成。每个社区(一个微服务)都由不同的团队建造,使用不同的建筑材料(编程语言)、不同的蓝图(配置)以及不同的风格。虽然这使得城市在构建时非常灵活且快速,但也使得理解整个城市变得异常困难。如果一个社区更改了它的水管系统,会对另一个社区的电网产生什么影响?通常,城市规划者(开发者)会逐渐失去对全局的掌控,而旧的地图(文档)也会变得过时。
本文介绍了一个名为 ModARO 的新工具,它旨在通过观察建筑本身来自动重绘城市地图。以下是其工作原理的简单解释:
1. 问题所在:“一刀切”的困境
想象你有一个机器人,它可以通过阅读蓝图来了解一座房子是如何建造的。
- 问题: 在微服务世界中,每座房子都不一样。一座是用木头(Java)造的,一座是用钢材(Python)造的,还有一座是用玻璃(Go)造的。一个被编程为阅读木头蓝图的机器人,在面对钢材蓝图时就会失效。
- 复杂性: 此外,这些社区往往散落在不同的城市(独立的代代码仓库)中。你不能只派一个机器人去观察整个城市;你必须向每个社区分别派遣一个机器人,然后尝试将它们的报告缝合在一起。
2. 解决方案:ModARO(模块化乐高套装)
作者创建了 ModARO,它就像是一个用于构建绘图机器人的通用乐高套装。与其为特定的城市建造一个巨大的、僵化的机器人,不如构建许多细小的、可互换的提取器(Extractors)(即乐高积木)。
- 提取器: 这些是专门的小型脚本。一个脚本知道如何阅读“木头”蓝图(Java 文件),另一个知道“钢材”(Python),还有一个知道如何阅读“城市规划法”(Docker 配置文件)。
- 共享语言(模型): 为了让这些不同的脚本相互沟通,它们都会将发现的结果记录在一个共享笔记本(架构模型)中。
- 类比: 想象“木头”机器人发现了一扇门,并在笔记本中写下“在位置 X 发现门”。“钢材”机器人不需要知道“木头”机器人是如何找到门的;它只需阅读笔记本,看到“门在 X”,然后添加自己的笔记:“门是锁着的”。
- 因为它们都遵循相同的笔记本格式,所以即使你以后把“木头”机器人换成“竹子”机器人,系统的其余部分仍能正常运行而不发生崩溃。
3. “分布式”的魔力
论文强调了一个独特的功能:分布式架构重构。
- 旧方法: 要绘制整个城市的地图,你必须把每个社区的所有蓝图收集到一个巨大的房间里,进行分类,然后绘制地图。这很慢,并且破坏了社区的“独立性”。
- ModARO 的方法: 你向社区 A 发送一个机器人。它绘制出属于自己的部分地图并保存。你向社区 B 发送一个机器人。它绘制出属于自己的部分。稍后,当城市准备好部署时,你只需合并这两个局部地图。
- “追溯链接”: 有时社区 A 会说:“我连接到社区 B”,但它还不知道 B 的地址。ModARO 允许社区 A 写下一个“占位符笔记”(一个链接),写道:“连接到任何名为‘B’的对象”。一旦所有地图合并,系统会自动找到“B”并将点与点连接起来。
4. 它奏效了吗?(测试)
研究人员通过两种方式测试了这个系统:
测试 A:“现实世界”挑战(10 个开源项目)
他们选取了 10 个不同的开源微服务项目(规模大小不一,使用不同的语言),并要求 ModARO 仅根据提供的代码和文档来重建它们的地图。
- 结果: 它奏效了!ModARO 成功地从多种技术中提取了架构细节(例如哪些服务相互通信、它们使用什么语言以及数据库的位置)。
- 局限性: 它无法读取“读心术”类的信息(例如,如果代码中没有明确写出,它无法理解某个服务在高级层面上“做什么”),也无法处理那些需要人类直觉才能解码的复杂、动态代码中的信息。
测试 B:人类测试(8 名行业开发者)
他们邀请 8 名专业软件开发者使用 ModARO,并将其与现有的工具 ReSSA 进行对比。
- 结论: 开发者们更倾向于使用 ModARO。
- 原因: 他们发现 ModARO 更易于使用,因为它感觉就像是在编写他们熟悉的普通代码,而另一个工具则感觉像是在解一些令人困惑的单行谜题。
- 不足之处: 他们仍然觉得使用“正则表达式”(一种搜索文本模式的方法)来查找特定代码有些困难。他们希望有更智能的工具能更好地理解代码结构,但他们非常喜欢 ModARO 的整体灵活性。
总结
ModARO 是一个让开发者能够构建小型、可复用的“侦察兵”来探索复杂软件系统不同部分的工具。这些侦察兵将他们的发现记录在一个共享笔记本中,从而使系统能够自动拼凑出完整的架构地图,即使该系统分布在不同的文件夹中或使用了多种不同的编程语言。它让保持“城市地图”实时更新变得更加容易、快速,且不易出现人为错误。
技术摘要:ModARO —— 一种用于分布式微服务代码库架构重构的模块化方法
1. 问题陈述
微服务架构在可扩展性和独立开发方面提供了诸多优势,但也引入了显著的架构复杂性。开发者往往难以洞察单个服务的变更如何影响整个系统。由于“架构漂移”(即快速开发进度超过文档更新速度)以及多仓库设置(服务被拆分到独立的各个代码库中)的普遍存在,这一挑战变得更加严峻。
现有的自动架构重构方法面临两个主要局限性:
- 缺乏复用性: 重构代码通常与特定的技术栈(语言、库、部署工具)和项目规范紧密耦合,导致其难以在不同项目中复用。
- 无法处理分布式系统: 大多数方法假设可以访问单体代码库。当微服务被拆分为多个独立的仓库时,在单个仓库上运行的重构工具无法看到完整的系统,而将结果进行中心化聚合则会抵消分布式 CI/CD 流水线的优势。
2. 方法论:ModARO 方法
作者提出了 ModARO(MODular Architecture Reconstruction Orchestrator,模块化架构重构编排器),这是一个旨在通过模块化、技术无关的工作流,从制品(源代码、配置文件)中重构架构的静态分析框架。
核心组件
- 共享架构模型: ModARO 使用一个递归的、基于 JSON 的模型来表示系统。所有提取的信息都作为“模型实体”(例如微服务、HTTP 请求)存储在这个共享结构中。提取器之间不直接通信;它们通过读取和写入该模型来进行操作。这种设计解耦了提取器,使得在遵循约定的模式(Schema)前提下,可以更换或更新提取器而不影响其他部分。
- 提取器(Extractors): 这些是模块化的代码单元(在本研究中实现为 JavaScript 函数),它们接收一个模型实体作为输入,分析特定的制品,并修改该实体以存储提取的数据。
- 无状态设计: 提取器没有全局状态;其行为完全由输入的实体和被分析的代码仓库定义。
- 模式注册: 每个提取器都会注册一个定义其接受的模型实体结构的 JSON Schema(例如,要求包含一个
$path 字段)。这确保了在提取器运行前,数据已被填充。
- 重构算法: 一个管理执行流的递归编排器:
- 它创建一个顶层模型实体。
- 它将此实体传递给模式匹配的提取器。
- 提取器可能会创建新的子实体(例如,识别出一个微服务并为其创建一个新实体)。
- 算法会递归地触发针对这些新实体的提取器。
- 它进行多次迭代(Passes),以处理一个提取器的输出成为另一个提取器输入的依赖关系。
- 它在检测到冲突修改时会报错,以确保数据的完整性。
分布式架构重构
ModARO 通过两种机制解决了多仓库挑战:
- 独立执行: 每个微服务仓库都可以被单独重构。其输出是一个针对该特定服务的局部模型。
- 模型聚合: 一个单独的算法将来自不同仓库的局部模型合并为一个单一的架构视图。它执行字段的递归并集操作,合并唯一信息,并将冲突(例如,同一字段具有不同的值)标记为错误。
- 追溯性链接(Retroactive Linking): 为了在不知道目标详细信息的情况下定义关系(例如,服务 A 调用服务 B),ModARO 使用了“链接”。链接定义了目标的模式(例如,“一个名为 'X' 的微服务”)。聚合后,系统通过在组合模型中搜索匹配该模式的实体来解析这些链接。
3. 主要贡献
- 模块化提取框架: 一种允许编写任何技术的提取器,并在不同项目间复用,且独立于周围技术栈的设计。
- 分布式重构工作流: 一种能够跨多个仓库进行重构的新颖方法,其输出随后进行聚合,支持微服务的“松耦合”原则。
- 追溯性链接: 一种基于模式匹配而非硬编码标识符来定义服务间关系的机制,能够适应异步的代码变更。
- 实证验证:
- 案例研究: 应用于 10 个开源微服务项目(规模从 2 万到 110 万行代码不等),涵盖多种语言(Java、Python、Go 等)和技术(Docker、Kubernetes、Spring 等)。
- 用户研究: 与最先进的基准工具(ReSSA)进行对比,由 8 名行业从业者进行评估。
4. 结果
案例研究发现 (RQ1-RQ3)
- 重构能力: ModARO 成功地从所有 10 个项目中提取了广泛的架构信息(服务名称、依赖关系、语言、端点)。提取特定数据的失败归因于静态分析固有的局限性(例如,动态字符串构建)或文档说明不清晰,而非 ModARO 方法本身的缺陷。
- 复用性: 在开发的 71 个提取器中,有 44 个(62%)可以在不同项目间复用。剩下的 27 个项目特定提取器是由于独特的项目规范、自定义目录结构或需要收集项目特定元数据所必需的。作者指出,能够轻松创建这些自定义提取器是一种优势,而非弱点。
- 分布式支持: 提取器可以在无需修改的情况下,成功应用于单体仓库(Mono-repo)和多仓库(Multi-repo)环境。聚合算法成功合并了来自不同仓库的模型,且追溯性链接得到了正确解析,尽管研究指出在复杂场景下(例如,远程仓库中的域存储在环境变量中时),需要确保链接模式是可追溯解析的。
用户研究发现 (RQ4)
- 感知有用性与易用性: 从业者评价 ModARO 比 ReSSA 基准工具更有用且更易于使用。
- 主要优势: 参与者更倾向于 ModARO 基于代码的工作流(JavaScript),而非 ReSSA 基于配置的工作流(带有字符串回调的 JSON)。他们认为更好的工具支持(语法高亮、类型提示)以及在“真实代码”中处理数据的能力是主要的易用性因素。
- 挑战: 两种方法在数据过滤和从代码中提取数据方面都被认为具有相似的难度。参与者表达了对比正则表达式更高级的解析能力的渴望,这表明将结构化解析器(如 ReSSA 中的解析器)集成到 Modulo 的模块化框架中将是有益的。
- 混合方法: 一个由 ModARO 编排 ReSSA 分析器的混合版本获得了最高评分,这表明将 ModARO 的模块化与高级解析能力相结合是一个充满前景的方向。
5. 意义与主张
论文声称 ModARO 成功证明了实现模块化和分布式架构重构的可行路径。其意义在于:
- 解耦技术与逻辑: 通过使用共享模型和基于模式的注册,ModARO 允许开发者组装针对其特定技术栈定制的提取器,而无需重写核心逻辑。
- 支持现代工作流: 它使将架构重构集成到单个微服务仓库的 CI/CD 流水线中成为可能,从而在不需要全局视角的情况下,实现“持续文档化”和一致性检查。
- 实际效用: 用户研究表明,该方法不仅在理论上是成立的,而且在实践中对于行业从业者也是可用的,它提供了比现有静态分析工具更直观的界面。
作者谦虚地承认,虽然该方法支持广泛的技术,但用于测试的模型特定模式仍是一个原型,需要进一步开发以实现广泛的工业应用。他们还指出,目前对正则表达式进行代码解析的依赖是一个局限性,未来的工作可以通过集成更复杂的解析 API 来解决。
每周获取最佳 computer science 论文。
受到斯坦福、剑桥和法国科学院研究人员的信赖。
请查收邮箱确认订阅。
出了点问题,再试一次?
无垃圾邮件,随时退订。