关于java:开源架构治理平台-ArchGuard专治分布式场景下各种不服

5次阅读

共计 2455 个字符,预计需要花费 7 分钟才能阅读完成。

过来的 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 代码剖析引擎(https://github.com/modernizing/chapi)。Chapi 基于 Antlr 实现的语法分析,反对支流的编程语言:TypeScript/JavaScript、Kotlin、Java、C# 等等。如下表所示:

Features/LanguagesJavaPythonGoKotlinTypeScriptCC#ScalaC++
http api decl🆕🆕🆕🆕🆕🆕
syntax parse🆕🆕🆕
function call🆕
arch/package
real world validate

因为是动态代码剖析,所以有些内容并不是十分精确。

再联合 ArchGuard Scanner(https://github.com/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

正文完
 0