基于调用链的服务治理系统的设计与实现
1. 原理
1.1 结构
- TraceID: 调用调用链的唯一流水ID
- SpanID: 表示调用层次
- ParentSpanID: 表示调用顺序
每一个节点都是一个Span,HTTP协议头添加唯一TraceID,以及调用层次和顺序的SpanID和ParentSpanID。出现故障时,通过TraceID把一整条调用链的所有调用信息收集到一个集合,通过SpanID和ParentSpanID回复调用树。


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字节码增强
- 代理推送