基于调用链的服务治理系统的设计与实现

1. 原理

1.1 结构

  • TraceID: 调用调用链的唯一流水ID
  • SpanID: 表示调用层次
  • ParentSpanID: 表示调用顺序

每一个节点都是一个Span,HTTP协议头添加唯一TraceID,以及调用层次和顺序的SpanID和ParentSpanID。出现故障时,通过TraceID把一整条调用链的所有调用信息收集到一个集合,通过SpanID和ParentSpanID回复调用树。

调用链示意1

调用链示意2

1.2 整体架构

1.2.1 结构组成

实现架构

调用链结构

  • 采集器: 负责把业务系统的远程服务调用信息从业务系统传递给处理器
  • 处理器: 负责从业务系统的采集器中接收服务调用信息并聚合调用链,将其存储在分布式数据存储中,以及对调用链进行分析,并输出给监控和报警系统
  • 分布式存储系统: 存储还来的调用链数据,并支持灵活的查询和搜索功能
  • 调用链展示系统: 支持查询调用链,业务链等功能

1.2.2 TraceID和SpanID在服务器间的传递

传递类型

  • Java进程内: ThreadLocal
  • 服务之间
    • RESTful: 使用HTTP头传递TraceID和SpanID
    • RPC: 需要在序列化协议添加定制化字段,将TraceID和SpanID从调用方传递给被调用方
  • 主子线程间(异步): 放在子线程的ThreadLocal
  • 消息队列传递: 消息队列客户端的库上定制化,将TraceID和SpanID增加到消息报文中。
  • 缓存数据库访问: 封装缓存,数据库的客户端

服务间传递

1.2.3 采集器的设计与实现

  • 应用层主动推送
  • AOP推送
  • JavaAgent字节码增强
  • 代理推送

results matching ""

    No results matching ""