从单体架构到微服务:利用图技术提高代码质量

挑战

金融服务公司需要尖端的计算基础设施。将先锋现有的基于 Java 的单体系统重构为众多微服务,需要洞察所有组件及其依赖关系。先锋的一些遗留 Java 档案 (jar) 包含 300 万到 400 万行代码。

此外,先锋面临着技术债务。需要修剪死代码,而影响评估非常困难。

“管理代码至关重要,”先锋软件架构师 John Lavin 说。“通常,重点在于功能交付、上市时间以及尽快推出产品。但如果您不方便管理代码,那么这些都无法实现。”

该团队首先尝试在桌面工具中可视化 jar 依赖关系。尝试加载所有 jar 会导致工具崩溃,因为该工具并非为先锋的规模而设计。

将包含一百万行代码的 jar 重构为微服务,需要管理大量活动部件。为了解决这个问题,该团队首先开始在电子表格中管理服务,该电子表格是在一年内编译的。

“我们有很多处于不同状态的不同服务。我们尝试尽可能地在电子表格中对这些服务进行分组并记录依赖关系。但这实际上无法长期奏效,”Lavin 说。

先锋需要在图中对所有服务及其依赖关系进行建模,以进行影响分析,从而显示如果特定服务出现故障,将影响多少其他服务。使用运行时捕获依赖关系的 API 网关不适用于先锋,因为关键服务只在一年中的特定时间调用,并且会被忽略。

解决方案

该团队需要一个灵活的解决方案,能够扩展到前所未有的规模。“我们意识到,我们的模块和服务管理实际上是一个图问题,”Lavin 说。先锋采用了 Neo4j,因为它具有可扩展性和灵活性。

该团队从一个简单的图数据模型开始,在他们运行构建时自动添加 jar 依赖关系。然后,他们将所有现有代码工件及其依赖关系添加到图中。

利用图分析,该团队开始根据最佳实践评估代码并推导出指标。接下来,他们从架构电子表格中添加信息,以丰富其模式。

团队构建了工具来可视化关系并实施最佳实践,例如限制服务间调用的数量以降低风险。根据从图形中得出的指标,代码质量评分卡能够促进从管理层到开发人员的整个业务的协作。

下载案例研究