写点什么

国内首个开源架构治理平台 ArchGuard,专治分布式场景下各种不服

  • 2022-04-02
  • 本文字数:2371 字

    阅读完需:约 8 分钟

国内首个开源架构治理平台 ArchGuard,专治分布式场景下各种不服

过去的 10 年间,软件的架构发生了巨大的变化,从早先流行的单体 MVC 架构,变成了所谓的 5:5 开,即分布式 vs 单体。只是呢,有大量的软件开发人员,无法看到系统的全貌,又或者是从单体的思维转变过来。于是,哪怕是在使用了微服务的情况下,但是实现的却又是一个一个的单体,只是它们变成了“分布式的单体”。


架构治理变成一个急待解决的问题。

我们所面临的挑战


作为一个架构师或者是软件开发人员,在架构治理上,我们面对的诸多挑战有:


  • 设计与实现不匹配。设计的软件架构与真正实施后的架构,存在着巨大的差异。而这个差异,往往需要编码上线、乃至一段时间之后才能发现

  • 没有规范/不遵守规范。作为一个资深的开发人员,我们制定了一系列的规范,但是没有多少团队人员愿意遵守

  • 代码量巨大,难以识别问题。一个由十几个或者几十个微服务创建的系统,往往难以快速发现它们之间错综复杂的关系

  • 架构模型的每个层级都可能出错。如服务间 API 耦合、代码间耦合、数据库耦合等等

  • 架构师、开发人员自身缺乏丰富的经验。知道有问题,但是说不出来哪有问题,也不知道如何改进


因此,我们需要一个平台/工具,来帮助我们解决这些问题。所以,结合我们过去的一系列软件开发和重构经验,我们(Thoughtworks 的咨询师们)从 2020 年(疫情开始的时候)开始了架构治理平台 ArchGuard 的开发。


如今呢,它开源了,GitHub:https://github.com/archguard/archguard

它能做点什么?


ArchGuard 按照流行的 C4 架构模型进行分层化的分析。即在 System Context(上下文), Container(容器), Component(部件), Code(代码)四个不同的架构视图上,它们是不同的抽象级别,对应于不同的受众,如团队内开发人员关心代码内的依赖,架构师关心组件、窗口间的依赖。



而在最后的实现形式上,它们是以代码库和文档的形式存在的。ArchGuard 是基于代码的静态分析工具,未来也将基于设计提供这方面的功能。


在 ArchGuard 中,我们需要先创建一系列的系统组件,即要配置好对应的语言和 GitHub 地址,就可以对代码进行扫描。

组件/模块


在组件视图内,我们可以看到单个项目的总体情况,根据对应的代码提交历史,不稳定代码模块:



API 声明和使用情况等:



并通过体量维度、耦合维度、内聚维度、冗余维度、测试维度五大维度对架构进行评估,以及一系列的指标来分析系统的情况:



系统依赖分析:服务地图


注意:这种依赖分析方式,依赖于团队开发人员拥有统一的编码规范。


而针对于微服务来说,ArchGuard 可以自动化地分析不同服务之间的依赖关系,并将这种依赖关系可视化出来:



PS:由于 ArchGuard 过去是微服务架构,合并成单体之后,存在自己调用自己的情况。


同时,系统能帮你自动分析哪些 API 是使用的,哪些 API 是未被使用的(有些 API 暂时分析不到):



当前,ArchGuard 可以支持 Spring、RestTemplate、Axios、UMI-Request 等几种有限的 API 调用识别。

数据库依赖分析:数据库地图


注意:这种依赖分析方式,依赖于团队开发人员拥有统一的编码规范。


针对于数据库间的依赖问题,ArchGuard 可以解析代码中的 SQL 调用,并尝试性将这种依赖关系与不同的微服务相匹配,进而分析哪些服务在数据库层是耦合的。由于存在不统一的编码规范,所以有些情况下,我们并没有识别出代码中的数据库表:



通过这种依赖关系,我们可以查看代码中最经常使用的表。再结合我们在代码分析中的功能,就可以查看数据库的调用地图(前端实现中)。

代码分析


对于开发团队来说,它们可以在 ArchGuard 上查看项目的模块、包、类、方法之间的依赖关系:



通过上面的 LoginModuleRepository 就能匹配到数据库对应的结果。

变更影响分析(开发中)


我们正在实现的一个功能是,通过分析和配置系统潜在的代码修改点,进而通过依赖关系,分析出变更的影响范围。它即能帮助架构师分析需求的影响,又能帮助测试人员更精准地测试系统中的内容。

ArchGuard 是如何达成上述功能的?


ArchGuard 内置两个代码分析引擎:Bytecode 分析 + 源码分析。


  • Bytecode 分析。顾名思义,就是通过分析 JVM 中的字节码,从而分析出代码中的依赖关系

  • 源码分析。即通过分析生成编译语言的语法树,产出特定的数据结构


源码分析主要是静态分析,结合先前在重构自动化开源组织 Modernizing 下开源的 Chapi 代码分析引擎。Chapi 基于 Antlr 实现的语法分析,支持主流的编程语言:TypeScript/JavaScript、Kotlin、Java、C# 等等。如下表所示:



由于是静态代码分析,所以有些内容并不是非常准确。


再结合 ArchGuard Scanner 中的几个扫描工具将数据流入数据库中:


  • scan_git,分析 Git 提交历史、行数、语言等基础信息

  • scan_jacoco,分析代码测试覆盖率

  • scan_bytecode,字节码分析

  • scan_sourcecode,源码分析(包含 HTTP API 分析、数据库分析)

  • scan_test_badsmell,测试代码坏味道

  • collector_ci,收集 CI/CD 中的历史记录

其它


欢迎加入 ArchGuard 的开发中来,GitHub:https://github.com/archguard/archguard

作者简介


Phodal,Thouhgtworks 技术专家。长期活跃于开源软件社区 GitHub,目前专注于编程语言、云研发、架构治理。


黄雨青,Thouhgtworks 架构师。金融行业数字化转型亲历者,致力于以平台架构为核心、架构治理为抓手,构建能够赋能业务的数字化企业架构。


在今年 5 月 12-14 日举办的 QCon 全球软件开发大会(北京站)中,Phodal 和黄雨青老师将带来题为《组织级架构治理的正确落地方式》的精彩分享,他们会现场分析对 ArchGuard 的思考和长远规划,对架构治理感兴趣的你一定不要错过。该议题所在的「云原生微服务架构新趋势」专题,还有来自字节跳动和腾讯的老师,将分别就《微服务从 PaaS 到 Serverless 的演进》和《面向异构技术栈和基础设施的服务治理标准化》进行分享。此外,基础设施运维、大规模集群调度、云原生架构变革、面向资效平衡的架构设计、业务架构等多个热门专题讲师即将集结完毕,点击此处立刻查看详细内容。

2022-04-02 16:546479

评论

发布
暂无评论
发现更多内容

成为你向往的那只独角兽 - 《独角兽项目》出版在即

京东科技开发者

DevOps

一文读懂Apache Flume概念、使用和原理

大数据技术指南

大数据 28天写作 3月日更

智慧组工党建系统-数字赋能组织工作

13530558032

【LeetCode】基本计算器Java题解

Albert

算法 LeetCode 28天写作 3月日更

uni-app 和 flutter 的区别

anyRTC开发者

flutter uni-app WebRTC 跨平台

超震撼数据可视化工具

不脱发的程序猿

大数据 数据分析 数据可视化 28天写作 3月日更

二十张图让你一分钟全面学习数仓建设之路

初学大数据

大数据 数据仓库

一个PHPer的Golang之路

万俊峰Kevin

php 微服务 Go 语言

CloudQuery v1.3.4 版本更新

BinTools图尔兹

oracle 运维 编辑器 sql 数据库管理工具

波场环球系统开发|波场环球软件APP开发

系统开发

DDR4看这一篇就够了

Kevin Z

翻云覆雨——前景理论之隔离效应

Justin

心理学 28天写作 游戏设计

《精通比特币》学习笔记(第六章)

棉花糖

区块链 学习 3月日更

带你轻松理解数据结构之Map

蛙人

JavaScript 大前端

android开发板!Android开发你需要了解的那些事,大牛最佳总结

欢喜学安卓

android 程序员 面试 移动开发

密码学系列之:内容嗅探

程序那些事

加密解密 密码学 程序那些事 内容嗅探

寻找被遗忘的勇气(十)

Changing Lin

3月日更

区块链赋能农产品溯源,农产品质量安全追溯

13530558032

如何使用jsDelivr+Github 实现免费CDN加速?

xiezhr

CDN jsDelivr CDN CDN加速 jsDeliver

在CentOS上安装MySQL,并使用DataGrip远程管理

pyfn2030

centos SSH MySQ datagrip

美团优选大数据开发岗面试真题-附答案详细解析

五分钟学大数据

大数据 面试 28天写作 3月日更

大作业(一)

cc

熬夜重构了IDEA插件Toolkit(整合程序员常用的工具箱),更加便捷

Silently9527

Java 程序员 idea插件

垃圾代码和优质代码的区别?

xcbeyond

Java 优化代码 3月日更

手写的第一个 Java 应用程序,执行的时候发生了什么?

白色蜗牛

Java

Webpack 基石 tapable 揭秘

vivo互联网技术

大前端 webpack 流程管理 tapable

Markdown中的图标为什么不是图片却可以以图片方式显示

happlyfox

28天写作 3月日更

电子产品如何使用IAP方式升级程序

不脱发的程序猿

嵌入式 iap 28天写作 3月日更 产品升级

所见即搜,3分钟教你搭建一个服装搜索系统!

华为云开发者联盟

框架 深度学习框架 mindspore Jina 服装搜索系统

android开发教程!写给安卓软件工程师的3条建议,一线互联网公司面经总结

欢喜学安卓

android 程序员 面试 移动开发

一杯茶的功夫,上手Redis持久化机制

老崔说架构

redis 缓存 aof

国内首个开源架构治理平台 ArchGuard,专治分布式场景下各种不服_架构_Phodal_InfoQ精选文章