写点什么

国内首个开源架构治理平台 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:546087

评论

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

fil价格走势分析?fil为什么会大涨?

区块链 分布式存储 IPFS fil价格走势 fil大涨

测试开发之系统篇-Docker常用操作

禅道项目管理

Docker 容器 测试开发

vue入门:定制自定义指令和过滤器

小鲍侃java

8月日更

netty系列之:内置的Frame detection

程序那些事

Java Netty 程序那些事

【LeetCode】反转字符串中的元音字母Java题解

Albert

算法 LeetCode 8月日更

fil为什么会暴涨?fil暴涨还会持续吗?

区块链 分布式存储 IPFS fil币价行情 fil币会大涨吗?

【Flutter 专题】63 图解 Flutter 集成极光 JPush 小结

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 8月日更

你真的了解二叉树吗?(树形结构基础篇)

有道技术团队

技术 二叉树 网易

用手机写代码:基于Serverless的在线编程能力探索

刘宇

抖音快手短视频询盘系统开发

Android SDK 启动退出方案演进

神策技术社区

大前端 后端 代码 数据采集

缓存 | Redis 缓存避坑指南

RadonDB

数据库 redis

20张图带你了解JVM运行时数据区(上)

阿Q说代码

JVM 8月日更 pc寄存器 虚拟机栈 本地方法栈

从源码角度解析线程池中顶层接口和抽象类

华为云开发者联盟

Java 线程 软件开发 高并发 线程池

李欲晓:加强关键信息基础设施安全保护的法治基石

郑州埃文科技

基于Serverless架构的社区文章管理小工具

刘宇

web技术分享| 实现WebRTC多个对等连接

anyRTC开发者

音视频 WebRTC JavaScrip web技术分享

手撸二叉树之第二小的节点

HelloWorld杰少

数据结构与算法 8月日更

开发一个分布式IM(即时通信)系统!

小傅哥

Netty DDD 小傅哥 即时通信

Swift 实现聚光灯动效

fuyoufang

swift 8月日更

神策数据微信小程序 SDK 架构解析

神策技术社区

大前端 后端 数据 代码 数据采集

抖音快手短视频SEO营销系统软件开发价格

抖音快手短视频平台获客系统开发内容

SpringApplication启动run了啥

Rubble

8月日更

JNI 提示

Changing Lin

8月日更

一文带你了解NB-IoT标准演进与产业发展

华为云开发者联盟

物联网 IoT NB-IoT

抖音快手短视频SEO系统开发

接口文档生成工具 一键生成文档 ApiPost

CodeNongXiaoW

项目管理 大前端 测试 后端 接口管理工具

LeetCode题解:27. 移除元素,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

接口测试的时候如何一键获取cookie,并在其他接口引用

与风逐梦

软件测试 接口测试 Cookie

前端基础四之JavaScriptDOM与事件

ベ布小禅

8月日更

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