Apache顶级项目,SkyWalking为何一枝独秀?

导读:本文摘自于SkyWalking创始人吴晟撰写的《Apache SkyWalking实战》一书,详细讲述了SkyWalking的架构设计与优势 。
吴晟:Apache基金会会员,Apache SkyWalking创始人、项目VP和PMC成员,Apache孵化器PMC成员,Apache ShardingSphere PMC成员,Apache APISIX (incubating) PPMC成员,Apache ECharts (incubating)和Apache DolphinScheduler (incubating)孵化器导师,Zipkin成员和贡献者,CNCF OpenTracing核心维护者 。
1. SkyWalking的架构设计
如图所示,SkyWalking官方架构图对SkyWalking的整体架构进行了非常直观的描述 。SkyWalking由以下4个核心部分构成 。

Apache顶级项目,SkyWalking为何一枝独秀?

文章插图
 
SkyWalking官方架构图
  • 探针 。探针(对应图中Tracing和Mestrics部分)可以是语言探针,也可以是其他项目的协议 。
  • OAP平台(Observability Analysis Platform),或称OAP Server 。它是一个高度组件化的轻量级分析程序,由兼容各种探针的Receiver、流式分析内核和查询内核三部分构成 。
  • 存储实现(Storage Implementors) 。SkyWalking的OAP Server支持多种存储实现,并且提供了标准接口,可以实现其他存储 。
  • UI模块(SkyWalking) 。通过标准的GraphQL协议进行统计数据查询和展现 。
从设计角度而言,SkyWalking总体遵循以下三大设计原则:
  • 面向协议设计
  • 模块化设计
  • 轻量化设计
面向协议设计
面向协议设计是SkyWalking从5.x开始严格遵守的首要设计原则 。SkyWalking包含下列对外协议 。
【Apache顶级项目,SkyWalking为何一枝独秀?】1. 探针协议
探针协议分为四大类 。
  • 语言探针上报协议 。此协议包括语言探针的注册、Metrics数据上报、Tracing数据上报、命令下行,以及Service Mesh中使用的Telemetry协议 。所有基于语言(JAVA、.NET、Node.js、php、Go等)的探针都需要严格遵守此协议定义 。此协议从v6版本开始全部以gRPC服务方式对外提供 。
  • 语言探针交互协议 。因为分布式追踪,探针间需要借助HTTP Header、MQ Header等应用间通信管道进行交互 。此协议定义交互格式 。所有基于语言(Java、.NET、Node.js、PHP、Go等)的探针都需要严格遵守此协议定义 。此协议从v2开始执行与v1不同的编码方法,加入了强制Base64的要求 。将从SkyWalking 8开始执行的全新v3协议,简化了编码,提供了更多特性,比如透传业务信息、探针交互能力等 。
  • Service Mesh协议 。此协议是SkyWalking针对Service Mesh抽象的专有协议,任何Mesh类的服务都可以通过此协议直接上行Telemetry数据,用于计算服务Metrics和拓扑图 。
  • 第三方协议 。针对大型的第三方开源项目,尤其是Service Mesh核心平台Istio和Envoy,提供核心协议适配,支持针对Istio+Envoy的Service Mesh进行无缝监控 。
2. 查询协议
查询协议使用GraphQL格式定义的查询协议 。多数读者可能更熟悉RESTful格式的查询,但SkyWalking考虑到更好的扩展性、更加灵活的组合查询模式,选择了由Facebook在2012年开源的GraphQL 。GraphQL在开源和商业项目中已经得到了广泛运用 。协议格式的预定义和多种查询组合使用提供了UI和第三方系统良好的集成能力 。熟悉SkyWalking历史的读者会知道,SkyWalking在6.0.0-GA之后的版本,更换了全新的RocketBot UI作为默认UI,这个过程得益于GraphQL的灵活性,后端协议和实现可以完全不变 。社区中已有大量公司基于此协议包装了云平台产品的UI 。
查询协议分为以下6类 。
  • 元数据查询:查询在SkyWalking注册的服务、服务实例、Endpoint等元数据信息 。
  • 拓扑关系查询:查询全局或者单个服务或Endpoint的拓扑图及依赖关系 。
  • Metrics指标查询:线性指标查询 。
  • 聚合指标查询:区间范围均值查询及TopN查询等 。
  • Trace查询:追踪明细查询 。
  • 告警查询 。
除了上述两大类协议外,部分模块也存在一些模块内协议,如导出的数据格式协议、告警协议、动态配置服务协议等 。这些协议与执行模块的默认实现有关,属于SkyWalking默认对外集成协议的范围,考虑到模块化设计,这些协议本身也是可以替换的,这里就不一一描述了 。
模块化设计
模块化设计,旨在以开源项目为内核,为更多的企业内部定制服务、商业产品的二次包装及插拔机制提供插拨机制与扩展点 。开源项目的一致性升级至关重要,模块化设计,明确接口边界,使得扩展很容易跟上开源版本升级的节奏 。对于商业包装和开源产品的迭代发展,这是必不可少的一环 。


推荐阅读