Itara:将分布式系统拓扑作为显式的可执行层
Itara是一个开源项目,旨在将分布式系统的拓扑结构(组件、连接、传输方式、故障处理)从代码中分离出来,作为一个独立的、显式的、可验证且可执行的层。它通过一个启动时读取的配置文件和语言特定的接线代理实现,允许通过更改配置文件来改变组件之间的通信方式,而无需修改代码。项目提供Java和Rust的参考实现,并计划支持更多语言。工具生态包括验证、可视化等CLI命令。核心优势包括:将拓扑作为一等公民、可增量采用、跨语言支持、以及通过四个关键事件实现全面的可观测性。
Itara 是一个旨在将分布式系统拓扑结构提升为显式、可声明、可验证且可执行层的开源项目。在传统的分布式系统中,拓扑——即哪些组件存在、它们如何连接、使用什么传输方式、如何处理故障——被分散在代码库中,作为实现决策的副产品。Itara 通过引入一个专门的配置层解决了这一问题。
系统的核心是一个名为“接线代理”(wiring agent)的组件,它在应用启动前读取一个 YAML 配置文件,解析所有连接,并将组件连接起来。一旦准备就绪,接线代理便退出,应用以全速运行,没有任何中间代理或运行时决策。这个配置文件是系统拓扑的权威表示,描述了节点、组件和连接。例如,一个简单的配置文件可以定义两个节点“gatewayNode”和“calculatorNode”,并指定它们之间的传输方式为“direct”或“http”。
Itara 的工具生态系统使拓扑层安全且易于管理。CLI 工具包含“itara inspect”用于可视化拓扑图,“itara verify”用于在部署前捕获配置错误。此外,每个组件通过一个 .itara 元数据文件声明其标识、版本、API 契约和能力,工具链在编写时即可验证兼容性,防止不正确的拓扑被静默部署。
项目的核心设计原则是“拓扑是一等公民”。组件只声明其接口,不声明如何被调用——这由配置文件决定。接线代理在启动时读取配置,准备好所有连接,然后退出。这样,代码保持不变,而通信方式可以通过更改配置文件来切换,无需修改代码、重新部署或编写迁移脚本。
Itara 设计为可增量采用。一个组件只需三个要素即可参与:一个 API 工件(接口)、一个激活器(工厂方法)和一个配置文件条目。唯一引入的依赖是核心库(如 itara-common)。业务逻辑本身不需要任何 Itara 导入。即使只在一个服务边界上采用 Itara,也能获得该连接的结构可观测性和显式的拓扑声明。
项目提供了 Java 和 Rust 的参考实现,并计划支持 Go、Python 和 C++。不同语言实现的组件可以参与同一个拓扑图,并生成相同的分布式跟踪。在可观测性方面,Itara 将可观测性视为一等公民。每次组件调用都会产生四个事件:CALL_SENT(调用方侧)、CALL_RECEIVED(被调用方侧)、RETURN_SENT(被调用方侧)和 RETURN_RECEIVED(调用方侧)。这些事件的位置允许直接测量传输开销(序列化、网络延迟等),而无需编写监控代码。插件可以发出自定义跨度,OpenTelemetry 参考实现提供了跨 JVM 和跨语言的分布式跟踪。
Itara 还支持事件驱动拓扑,通过虚拟节点和事件契约实现。例如,Kafka 主题可以声明为一个虚拟节点,事件驱动的通信也遵循四个事件模型。
目前,Itara 是一个概念验证项目,包含一个演示:一个 Java 的“gateway”组件调用一个 Rust 的“calculator”组件,可以通过更改配置从直接调用切换到 HTTP 调用,而组件代码不变。项目计划进一步开发可视化编辑器和控制器等工具。
与传统的服务网格或侧车模式不同,Itara 不隐藏网络,而是将拓扑显式化。它不引入运行时开销,而是将拓扑决策前置到启动时。项目的愿景是让分布式系统的拓扑成为像配置和基础设施即代码一样被管理的实体。