想象你经营着一家庞大且高科技的餐厅,每道菜都由不同的厨师团队(即你的微服务)负责准备。这些团队独立工作,彼此传递食材和订单。当一切运行顺畅时,顾客会感到满意。但有时厨房会变得混乱:厨师们可能囤积食材、与错误的人交谈,或使用过时的食谱。在科技领域,我们将这些不良习惯称为"代码异味"。它们并不总是立即导致餐厅烧毁,但会使后续问题难以修复,并拖慢整体效率。
问题在于,现有的用于发现这些“异味”的工具,就像递给经理一份用秘密代码编写的 500 页电子表格。其中充满了数据,但没人知道该如何处理。
于是,“异味文档(SmellDoc)”登场了。
将 SmellDoc 想象为一个功能强大且可交互的仪表盘,餐厅经理能够真正理解它。它构建在一个名为"Elastic Stack"的系统之上(这就像餐厅用于追踪每一项活动的中枢神经系统)。以下是其工作原理,采用简单的类比说明:
1. 新耳目(数据采集)
通常,餐厅的监控系统仅追踪诸如“烤箱是否过热?”或“水管是否流水?”等大事。SmellDoc 增加了两个新工具:
- 业务间谍(自定义业务收集器): 这是一个潜伏在厨房内部的小间谍。它不仅仅监视炉灶,还会倾听厨师们的对话。它追踪业务细节,例如“汤品团队向香料团队索要盐的次数有多少?”这能更清晰地呈现各团队实际如何协作。
- 数据整理员(重新集成收集器): 餐厅从摄像头、传感器和订单票据中产生海量杂乱的数据。该工具如同一位超级高效的图书管理员。它将所有杂乱无章、形态各异的数据进行整理,放入整齐的文件柜中,以便轻松检索。
2. 侦探团队(检测)
SmellDoc 拥有一支侦探团队,专门寻找24 种特定的不良习惯(例如试图包揽过多工作的“贪婪厨师”,或从不与人交流的“孤独厨师”)。
- 静态侦探: 这位侦探在烹饪开始前查看蓝图和食谱书。他们检查厨房布局是否设计不当。
- 运行时侦探: 这位侦探在厨房繁忙时进行观察。他们查看厨师们是否真正遵守规则,或者是否陷入交通拥堵。
- 知识库: 团队拥有一本包含84 种不同不良习惯的庞大百科全书,他们知道如何识别这些习惯。他们利用这本百科全书来标记 24 种最常见且最危险的异味。
3. 控制室(可视化)
这是最精彩的部分。SmellDoc 不是给经理一份电子表格,而是直接接入餐厅的主控屏幕(称为Kibana)。
- “异味地图”: 它展示了一幅色彩斑斓的厨房地图。如果某个团队做错了事,该区域就会亮起红灯。
- “历史书”: 你可以回溯时间,查看不良习惯何时开始。“无 API 版本控制”这种异味(就像使用了与食材不匹配的食谱)是昨天开始的,还是上个月开始的?
- “行动计划”: 它不仅仅说“出问题了”。它会告诉你哪里出了问题、什么出了问题,并清晰地展示它如何影响餐厅的速度。
证据(案例研究)
作者在名为“物业管理云”的真实开源餐厅系统上测试了这套系统。他们安装了 SmellDoc 并观察其运作。
- 结果: 该系统成功识别出了不良习惯。例如,它发现一个特定团队("cloud-user-service")缺少“版本控制”规则,并且没有适当的“网关”来管理流量。
- 益处: 由于结果在仪表盘上清晰可视化,操作人员能够立即发现问题并加以修复,从而保持餐厅顺畅运行。
简而言之: SmellDoc 将复杂软件系统中那些令人困惑、不可见的“代码异味”,转化为屏幕上清晰、多彩的画面,帮助管理者在问题演变成灾难之前将其修复。
技术摘要:SmellDoc
问题陈述
尽管微服务已成为云原生和 DevOps 环境中的主导架构范式,但它们容易受到“微服务坏味道”(MBSs)的影响。这些设计和开发反模式会显著降低系统的可维护性、可扩展性和性能,并增加缺陷发生的可能性。
现有的检测工具面临两个主要局限:
- 输出晦涩:许多现有工具(例如 MARS)以不可读的 JSON 格式输出结果,阻碍了即时解读。
- 缺乏运行时集成:虽然某些工具(例如 MAIG、µFRESHENER)能在拓扑图中可视化坏味道,但它们未能有效地与运行时可观测性集成。这种脱节使得运维人员难以理解特定坏味道如何影响系统运行时行为,或难以及时采取纠正措施。
现有的可观测性解决方案(如 Prometheus 和 OpenTelemetry)存在缺口:Prometheus 缺乏原生链路追踪支持,而 OpenTelemetry 需要外部可视化工具。Elastic Stack 提供了集链路追踪、依赖分析和 Kibana 可视化于一体的统一解决方案,但缺乏原生的 MBS 检测能力。
方法论
作者提出了 SmellDoc,这是一个作为 Kibana 插件构建的定制框架,用于扩展 Elastic Stack。该系统将 MBS 检测、知识库和系统健康监控集成到一个单一的可观测性仪表板中。其架构分为三个明确的步骤:
1. 配置与数据捕获
SmellDoc 通过一个自定义组件增强了原生的 elastic-apm-agent:
- 自定义业务收集器(CBC):使用 Elastic APM SDK 和 Byte Buddy 实现,该代理拦截 Spring 服务方法,通过 Micrometer 记录调用指标。它捕获标准系统级运行时数据中不可用的业务级指标(例如服务级调用频率)。
- 部署:原生 APM 代理和 CBC 与微服务一同启动(例如在 Kubernetes Pod 中),为 APM 服务器收集链路追踪和指标数据。
2. 数据收集与集成
再集成收集器(RIC) 充当中央聚合点:
- 它定期从 Elasticsearch 检索运行时数据。
- 它过滤冗余记录,并集成三类数据:
- 外部指标:链路追踪链接、SQL 调用和跨服务依赖。
- 内部指标:JVM 级别的 CPU、内存和垃圾回收(GC)数据。
- 业务指标:由 CBC 捕获的调用频率。
- RIC 将这种异构数据标准化,并以统一索引将其存储回 Elasticsearch,以支持下游检测。
3. 检测与可视化
检测流水线结合了静态分析和运行时分析:
- 静态分析组件:源自 MBST 框架,该组件提取服务元数据、拓扑结构和细粒度特征。它应用基于规则的检查来检测 12 种架构级坏味道(例如 ESB 使用、微服务贪婪)。
- MBSD 组件:该组件获取静态结果,并结合来自 Elasticsearch 的运行时数据,以检测 12 种运行时坏味道。
- 总覆盖率:该系统支持包含 84 种 MBS 类型 的知识库,并主动检测涵盖架构、运行时和性能类别的 24 种代表性坏味道。
可视化(MBSD 插件):
结果通过三个交互式标签页在 Kibana 中进行可视化:
- 坏味道知识库:提供每种坏味道类型的标准化定义和历史记录。
- 监控:提供 Kubernetes 部署的系统级视图,显示服务和实例的关键绩效指标(KPI)。
- 检测:显示当前分布、统计信息、算法状态(在线/离线)以及可视化趋势。它允许运维人员将特定坏味道与原生 Elastic 指标和链路追踪进行关联。
主要贡献
- 框架设计:SmellDoc 的设计与实现,这是一个扩展 Elastic Stack 的 Kibana 插件,集成了 MBS 检测、知识管理和健康监控。
- 增强的检测能力:集成了涵盖 84 种 MBS 类型的知识库,并实现了混合检测方法(静态 + 运行时),利用通过自定义代理(CBC 和 RIC)收集的细粒度特征。
- 验证:在基准微服务系统上执行案例研究,以证明该框架的有效性和可用性。
结果与案例研究
作者使用开源的 Property Management Cloud(物业管理云)系统验证了 SmellDoc,该系统基于 Spring Cloud 实现并部署在 Kubernetes 集群上。
- 检测性能:在特定的测试场景中,系统执行了 29 次 MBS 检测,成功识别出 11 个坏味道实例。
- 可视化效用:该工具成功可视化了检测到的坏味道分布(例如
cloud-user-service 中的“无 API 版本控制”和“无 API 网关”),使用将坏味道按主要和次要类型分类的双环饼图。
- 运维工作流:该系统使运维人员能够查看系统级概览,通过图表和 JSON 检查每个服务的历史,并将坏味道发生情况与系统运行时历史中的特定时间窗口进行关联。
意义
本文声称,SmellDoc 解决了静态坏味道检测与运行时可观测性之间的关键缺口。通过将坏味道检测直接嵌入 Elastic 可观测性仪表板,该框架:
- 增强运行时可观测性:它允许运维人员将抽象的架构反模式与具体的运行时指标和链路追踪进行关联。
- 加速故障排查:它提供可操作的见解,使运维人员能够更快地识别性能或可维护性问题的根本原因。
- 维持服务质量(QoS):通过促进及时重构和修复坏味道,该系统有助于在微服务环境中维持高 QoS。
作者得出结论,将坏味道检测集成到标准可观测性工作流中,是改善云原生系统可维护性和可靠性的可行策略。
每周获取最佳 computer science 论文。
受到斯坦福、剑桥和法国科学院研究人员的信赖。
请查收邮箱确认订阅。
出了点问题,再试一次?
无垃圾邮件,随时退订。