Zipkin服务追踪原理
创造一些追踪标识符(tracingId,spanId,parentId),最终将一个request的流程树构建出来,各业务系统在彼此调用时,将特定的跟踪消息传递至zipkin,zipkin在收集到跟踪信息后将其聚合处理、存储、展示等,用户可通过web UI方便获得网络延迟、调用链路、系统依赖等等。
transport作用:收集被trace的services的spans,并将它们转化为zipkin common Span,之后把这些Spans传递的存储层
collector会对一个到来的被trace的数据(span)进行验证、存储并设置索引(Cassandra/ES-search/Memory)
Zipkin基本概念&核心数据结构
- Annotation(用途:用于定位一个request的开始和结束,cs/sr/ss/cr含有额外的信息,比如说时间点):
- cs:Client Start,表示客户端发起请求一个span的开始
- sr:Server Receive,表示服务端收到请求
- ss:Server Send,表示服务端完成处理,并将结果发送给客户端
- cr:Client Received,表示客户端获取到服务端返回信息一个span的结束,当这个annotation被记录了,这个RPC也被认为完成。客户端调用时间=cr-cs,服务端处理时间=sr-ss。
- Span:一个请求(包含一组Annotation和BinaryAnnotation);它是基本工作单元,一次链路调用(可以是RPC,DB等没有特定的限制)创建一个span,通过一个64位ID标识它。
- span通过还有其他的数据,例如描述信息,时间戳,key-value对的(Annotation)tag信息,parent-id等,其中parent-id可以表示span调用链路来源,通俗的理解span就是一次请求信息
- Trace:类似于树结构的Span集合,表示一条调用链路,存在唯一标识通过traceId(全局的跟踪ID,是跟踪的入口点,根据需求来决定在哪生成traceId)、spanId(请求跟踪ID,比如一次rpc等)和parentId(上一次 请求跟踪ID,用来将前后的请求串联起来),被收集到的span会汇聚成一个tree,从而提供出一个request的整体流程。
整个描述:在一次Trace中,每个服务的每一次调用,就是一个基本工作单元,就像上图中的每一个树节点,称之为span。每一个span都有一个id作为唯一标识,同样每一次Trace都会生成一个traceId在span中作为追踪标识,另外再通过一个parentId标明本次调用的发起者(就是发起者的span-id)。当span有了上面三个标识后,就可以很清晰的将多个span进行梳理串联,最终归纳出一条完整的跟踪链路。
代码实践操作
无存储方式,只需要控制台
本文的源代码在:git@github.com:chengcheng222e/springcloud-learn.git 欢迎大家去fork。
/Users/chenyuan/Workspaces/Github/springcloud-learn/eureka-server
1 |
|
application.properties
1 | eureka-server = |
/Users/chenyuan/Workspaces/Github/springcloud-learn/zipkin-server
1 | package com.allei; |
application.properties
1 | zipkin-server = |
/Users/chenyuan/Workspaces/Github/springcloud-learn/trace-a
1 | package com.allei; |
application.properties
1 | trace-a = |
/Users/chenyuan/Workspaces/Github/springcloud-learn/trace-b
1 | package com.allei; |
application.properties
1 | trace-b = |
/Users/chenyuan/Workspaces/Github/springcloud-learn/trace-c
1 | package com.allei; |
application.properties
1 | trace-c = |
全部把服务启动起来,然后我们去注册中心看一下启动的服务情况。
我们从trace-a服务触发一个服务:
查阅一下日志
/Users/chenyuan/Workspaces/Github/springcloud-learn/trace-a
日志
1 | 2020-01-10 12:04:51.226 DEBUG [trace-a,c8df468b969a0917,c8df468b969a0917,false] 2626 --- [io-10001-exec-1] o.s.web.servlet.DispatcherServlet : GET "/trace-a", parameters={} |
/Users/chenyuan/Workspaces/Github/springcloud-learn/trace-b
日志
1 | 2020-01-10 12:04:52.733 DEBUG [trace-b,c8df468b969a0917,a4c77f10471bb209,false] 2862 --- [io-10002-exec-1] o.s.web.servlet.DispatcherServlet : GET "/trace-b", parameters={} |
/Users/chenyuan/Workspaces/Github/springcloud-learn/trace-c
日志
1 | 2020-01-10 12:04:53.306 DEBUG [trace-c,c8df468b969a0917,e9651abffa9bf1d2,false] 3211 --- [io-10003-exec-1] o.s.web.servlet.DispatcherServlet : GET "/trace-c", parameters={} |
参考地址
- https://www.cnblogs.com/mxmbk/p/9820936.html
- https://juejin.im/post/5c3d4df0f265da61307517ad
- https://github.com/openzipkin/zipkin
- https://www.cnblogs.com/sxdcgaq8080/p/10007735.html
- https://blog.csdn.net/u010046908/article/details/54773323
如果大家喜欢我的文章,可以关注个人订阅号。欢迎随时留言、交流。