缘由

公司使用的是Docker+微服务,服务拆分差不多41个了,然后过完年来就接到这个需求,把指定业务功能的业务基线整理出来,比如,登录这个操作会经过哪些微服务,把登录这个操作的链条列出来,从api--途径的服务--DB这样一个链条。接到这个需求后,我就傻逼似的一个一个去问开发,然而开发每个人只负责自己开发的模块,具体途径的他们也不知道;然后一直拖一直拖,拖到了现在,总得找个办法把这个给完成了,刚好公司有用到Zipkin这个,但是并不了解,只知道有这么个东西,那就先了解他,然后根据他的数据库和我们自己的ELK操作日志找到这些个调用链路。 

思路

ELK日志会记录操作日志,日志里会把Zipkin的三个ID打印出来,比如我做一个登陆操作,通过Kibana显示的ELK里会有登陆这个操作的日志,那我获取这个登陆操作的SpanId,通过Zipkin的API接口和SpanId可以获取所有和这个SpanId有关的信息;然后根据获取的信息把调用链给整理出来。 
 

Zipkin的相关了解

 
主要是根据写篇博文学习;参考地址:https://juejin.im/post/5c3d4df0f265da61307517ad 
 

一、Zipkin的由来

在单机系统使用过程中,如果某个请求响应过慢或者响应出错,通过查看日志就可以清楚的知道某个请求出了问题;如果在分布式系统中,客户端一个请求到达服务器后,由多个服务协作完成。如服务A调用服务B,服务B调用服务C,服务C调用服务D,那么想要知道哪个服务处理时间过长或是处理异常导致的话,就需要一个服务一个服务的去机器查看日志,先定位出问题的服务,再定位出问题的地方。随着系统越来越壮大,服务越来越多,一个请求对应处理的服务调用链就越长,这种排查方式很艰难,为了解决这个问题,便诞生了各种分布式场景中追踪问题的解决方案,zipkin就是其中之一。
 

二、什么是ZipKin

一个独立的分布式追踪系统,客户端存在于应用中(各个服务中),应具备追踪信息生成,采集发送等功能,而服务端应该包含以下基本的三个功能
1)信息收集:用来收集各服务端采集的信息,并对这些信息进行梳理存储、建立索引
2)数据存储:存储追踪数据
3)查询服务:提供查询请求链路信息的接口
 
三、 它的整体结构图
 
 
 
Zipkin(服务端)包含四个组件,分别是collector,storage,search,Web UI
1)collector信息收集器,作为一个守护进程,它会时刻等待着客户端传递过来的追踪数据,对这些数据进程验证,存储以及创建查询需要的索引
2)storage是存储组件,zipkin默认直接将数据存储在内存中,此外支持使用Cassandra、Elasticsearch和Mysql
3)search是一个查询进程,它提供了简单的JSON API来提供外部调用查询
4)Web UI是zipkin的服务端展示平台,主要调用search提供的接口,用图标将链路信息清晰的展示
 
四、基本概念
 
Trace:一个请求达到应用后所调用的所有服务组成的调用链就像一个树结构(如图),我们追踪这个调用链路得到的这个数结构可以称之为Trace
Span:在一次Trace中,每个服务的每一次调用,就是一个基本工作单元(如图中的每一个树节点),称之为span
 
 
 
每一个span都有一个id作为唯一标识,同样每一次Trace都会生成一个traceID在span中作为追踪评标识,另外再通过一个parentId标明本次调用的发起者(就是发起者的span-id)。当span有了上面三个标识后,就可以很清晰的将多个span进行梳理串联,最终归纳出一条完整的跟踪链路。
 
 
五、实战
 
1)根据指定的trace_id获得返回值,然后根据返回值分析调用链
 
curl http://localhost:9411/api/v2/trace/2e0d4019eb7aae31
2)获取所有的服务
 
curl http://localhost:9411/api/v2/services
3)span数据结构详解
 
一次追踪链路会包含很多的span,因此一个span便是一个数组,标准的json为:
 
[
{
"traceId": "string", // 追踪链路ID
"name": "string", // span名称,一般为方法名称
"parentId": "string", // 调用者ID
"id": "string", // spanID
"kind": "CLIENT", // 替代zipkin v1的注解中的四个核心状态,详细介绍见下文
"timestamp": , // 时间戳,调用时间
"duration": , // 持续时间-调用的服务所消耗的时间
"debug": true,
"shared": true,
"localEndpoint": { // 本地网络节点上下文
"serviceName": "string",
"ipv4": "string",
"ipv6": "string",
"port":
},
"remoteEndpoint": { // 远端网络节点上下文
"serviceName": "string",
"ipv4": "string",
"ipv6": "string",
"port":
},
"annotations": [ // value通常是缩写代码,对应的时间戳表示代码标记事件的时间
{
"timestamp": ,
"value": "string"
}
],
"tags": { // span的上下文信息,比如:http.method、http.path
"additionalProp1": "string",
"additionalProp2": "string",
"additionalProp3": "string"
}
}
]
我的根据返回的json信息,并根据traceId、parentId、id、kind(CLINET、CLIENT)把谁调用谁,哪个服务到哪个服务整理出来:
 
 
六、有关Cassandra数据库相关操作
 
1)连接数据库
cqlsh 172.10.0.5
2)查看所有的库

 
cqlsh> describe keyspaces;
3)使用指定的库
cqlsh> use zipkin2;
4)查看所有的表
cqlsh> describe tables;
5)根据指定条件查询
#查询前得对查询列建立索引
cqlsh:zipkin2> create index on span(trace_id);
cqlsh:zipkin2> select * from trace_by_service_span where trace_id='f81a638649326474';
 
 
 
 
 

通过ZipKin整理调用链路的更多相关文章

  1. spring cloud 入门系列八:使用spring cloud sleuth整合zipkin进行服务链路追踪

    好久没有写博客了,主要是最近有些忙,今天忙里偷闲来一篇. =======我是华丽的分割线========== 微服务架构是一种分布式架构,微服务系统按照业务划分服务单元,一个微服务往往会有很多个服务单 ...

  2. Net和Java基于zipkin的全链路追踪

    在各大厂分布式链路跟踪系统架构对比 中已经介绍了几大框架的对比,如果想用免费的可以用zipkin和pinpoint还有一个忘了介绍:SkyWalking,具体介绍可参考:https://github. ...

  3. Zipkin — 微服务链路跟踪.

    一.Zipkin 介绍 Zipkin 是什么?  Zipkin的官方介绍:https://zipkin.apache.org/  Zipkin是一款开源的分布式实时数据追踪系统(Distributed ...

  4. 跟我学SpringCloud | 第十一篇:使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪

    SpringCloud系列教程 | 第十一篇:使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪 Springboot: 2.1.6.RELEASE SpringCloud: ...

  5. Spring Cloud Sleuth+ZipKin+ELK服务链路追踪(七)

    序言 sleuth是spring cloud的分布式跟踪工具,主要记录链路调用数据,本身只支持内存存储,在业务量大的场景下,为拉提升系统性能也可通过http传输数据,也可换做rabbit或者kafka ...

  6. 个推基于 Zipkin 的分布式链路追踪实践

    作者:个推应用平台基础架构高级研发工程师 阿飞   01业务背景   随着微服务架构的流行,系统变得越来越复杂,单体的系统被拆成很多个模块,各个模块通过轻量级的通信协议进行通讯,相互协作,共同实现系统 ...

  7. net core 微服务框架 Viper 调用链路追踪

    1.Viper是什么? Viper 是.NET平台下的Anno微服务框架的一个示例项目.入门简单.安全.稳定.高可用.全平台可监控.底层通讯可以随意切换thrift grpc. 自带服务发现.调用链追 ...

  8. Springboot+Dubbo使用Zipkin进行接口调用链路追踪

    Zipkin介绍: Zipkin是一个分布式链路跟踪系统,可以采集时序数据来协助定位延迟等相关问题.数据可以存储在cassandra,MySQL,ES,mem中.分布式链路跟踪是个老话题,国内也有类似 ...

  9. zipkin:调用链显示分析

    为什么使用了httpclient,客户端没有向zipkin server发送日志? 因为我实在main方法中调用的,完事后这个线程就没了:httpclient用的还是异步的发送日志方式:所以没发日志. ...

随机推荐

  1. 使用numpy与matplotlib.pyplot画图

    使用numpy与matplotlib.pyplot画图 1. 折线图 1 # -*- enccoding:utf-8 -*- 2 import numpy as np 3 import matplot ...

  2. c++中sort()函数的用法

    用法: 1.sort函数可以三个参数也可以两个参数,必须的头文件#include < algorithm>和using namespace std; 2.它使用的排序方法是类似于快排的方法 ...

  3. sklearn中树模型可视化的方法

    在机器学习的过程中,我们常常会用到树模型的方式来解决我们的问题.在工业界,我们不仅要针对某个问题利用机器学习的方法来解决问题,而且还需要能力解释其中的原理或原因.今天主要在这里记录一下树模型是怎么做可 ...

  4. GIT和SVN版本控制

    Git 与SVN SVN 是集中式版本控制系统: 先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了, ...

  5. 用 Cobertura 测量测试覆盖率

      尽管测试先行编程(test-first programming)和单元测试已不能算是新概念,但测试驱动的开发仍然是过去 10 年中最重要的编程创新.最好的一些编程人员在过去半个世纪中一直在使用这些 ...

  6. Sublime使用及配置C编译器

    一.环境配置 在安装了MinGW+Gcc的基础上做如下设置—— 新建编译系统c.sublime-build: { "cmd" : ["gcc", "$ ...

  7. 怎么样通过php使用html5实现多文件上传?(php多图上传)

    <!DOCTYPE html><html lang="zh-cn"> <head> <meta charset="utf-8&q ...

  8. ADO.Net中DataSet的应用

    一.知识点描述 1.DataSet是ADO.NET的中心概念.可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合.也就是说,即使断开数据链路,或者关闭数据库,Data ...

  9. python基础3、4---流程控制、运算符

    1.for循环 和while循环 for 临时变量 in 待遍历的数据: 循环体 (循环体这里一般加break,结束循环,执行else代码) else: 循环不满足条件执行的代码 while  表达式 ...

  10. [转]https://www.jianshu.com/p/06443248f4d8

    eos是什么? 原文 https://www.jianshu.com/p/06443248f4d8 简介 用一句话来定义eos,即:区块链操作系统,支持在它之上构建dapp,支持智能合约.帐户.身份验 ...