大纲
zipkin主要功能模块
zipkin服务端安装
zipkin客户端说明
zipkin集成mvc
zipkin集成dubbo
zipkin主要功能模块
简介
zipkin可以时时监控用户应用的时间和各项数据的开源应用程序
机构图(取自官网)
在讲解架构图之前先思考一个问题,如果我们自己要做一个监控系统需要哪些模块 简单想一下可能包括:数据采集(一般在用户应用程序端)、数据上报(一般需要一个传输代理)、数据汇总(一般在监控应用服务端)、数据存储(需要一个存储介质)、数据展示(查询和统计api和前端)再来看下面的架构图就一目了然了

2、transport数据上报代理:数据在发送到服务端可以使用多种渠道,例如:发送http请求、发送mq消息等。
3、collector数据接收汇总:接收transport发送的数据由于发送渠道多种多样,所以接收端要适配各种渠道
4、storage数据存储模块:由于数据存储介质多种多样,例如:内存、mysql等,所以存储模块要适配各种介质
5、api和ui负责监控数据的展示:通过浏览器展示监控数据
知道了以上zipkin的基本框架,后面的安装和使用就简单了
zipkin服务端安装
安装
首先到官网下载服务端安装包:zipkin.io/ 这是官网地址。我使用的版本是2.14.0 注意:2.14.0服务端安装之后自动汉化,不用配置。部分早期版本安装之后默认英文版本。 下载链接:
下载之后检查一下自己的jdk环境。最好1.8+版本 最基本的服务启动命令:java -jar zipkin-***.jar 默认端口:9411 启动之后访问:localhost:9411.展示页如下:

安装完成
启动参数说明
由于zipkin支持多种信息接收端和多种数据存储介质,这些都需要在启动时候通过启动参数指定。一个简单的启动用例如下:
java -jar zipkin-server-***-exec.jar --zipkin.collector.rabbitmq.addresses=localhost --zipkin.collector.rabbitmq.port=6572 --zipkin.collector.rabbitmq.username=guest --zipkin.collector.rabbitmq.password=guest --STORAGE_TYPE=mysql --MYSQL_HOST=localhost --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root --MYSQL_PASS=rootroot
通过参数很容易看出来:存储介质选择mysql、消息传递采用rabbitmq 详细参数说明请参考: github.com/apache/incu…
如果采用mysql作为存储介质需要先初始化mysql数据库和表: 参考: github.com/apache/incu…
由于篇幅有限这里就不粘贴详细的命令参数和数据库sql语句了(也没有必要)
zipkin客户端说明
数据采集
说明客户端之前我们先思考一个简单问题,客户端到底做什么? 大家一定会说:数据采集啊。但是要如何采集呢?
做一个简单的比喻,对于用户的一个请求想象成一个链,链上的每一个节点都是一个接口调用,zipkin需要监控每一个接口调用的时间和数据。我们面对的第一个问题可能就是如何将zipkin监控插入到链里面呢?
这里简单举两个具体的例子:
对于servlet请求很容易想到通过filter监控每一个请求 对于spring mvc很容易想到通过拦截器监控
采集数据的结构体
通过以上方法已经可以感知到用户的每一个请求,下一步我们可能会想需要采集那些数据呢? zipkin是基于google的一篇论文实现的,论文中详细说明了监控的数据原理。这里我们不去看论文也没有必要看。只需要简单的思考几个问题就可以了。首先监控数据是一个链,链就要有前后的关联关系。和每个链的数据划分。 例如:我们需要监控用户端的两个请求,每个请求经过一个链的两个节点。对于采集到的监控数据首先要分清楚那些数据属于哪一个请求、属于一个请求数据的前后关系。
zipkin提出一个span的概念。span通过定义不同类型的id帮助我们划分请求和请求的前后关系 span 里面有traceId:同一个请求的traceid相同;spanid:每一个接口调用可以创建一个spanid;还有一个parentId:表明确了前一个的spanId。根据这几个id我们就可以区分请求和调用关系了 根据traceId区分出不同的请求、根据spanid和parentid区分出前后调用关系。
区分请求之后我们再思考一个问题:zipkin最关键的一个指标就是时间。zipkin通过定义以下时间概念来划分请求的不同时间节点
1、cs:Client Send,客户端发起请求;
2、sr:Server Receive,服务器接受请求,开始处理;
3、ss:Server Send,服务器完成处理,给客户端应答;
4、cr:Client Receive,客户端接受到服务端应答;
注意以上四个时间都是点时间。zipkin可以通过点时间计算出段时间展示 以上的各种id和各种点时间已经可以实现zipkin的主要监控功能,对于span的详细参数说明大家可以查看git源码:
消息发送
客户端完成数据采集和封装之后就是消息发送了,由于zipkin提供多种发送机制所以我们只要实现不同的消息发送客户端就可以了。比如http、mq等这里具体消息发送不细说了,后面会通过zipkin-brave帮助我们实现消息发送
一个简单流程说明
通过上面的说明我们自己很容易实现一个zipkin客户端了 例如实现一个spring mvc请求的数据监控: 首先写一个拦截器,然后记录时间,标记出客户端还是服务端封装span。最后将span发送给zipkin服务端即可。这里只是说明一个思路没有具体实现,后面的zipkin-brave会帮我们实现
zipkin-brave
下面简单说明一下zipkin-brave的使用 我们已经知道客户端需要一个拦截功能、封装span功能、发送span功能。那么brave就是帮助我们封装这些功能,我们只要直接拿来用就可以了 在使用之前我们需要考虑我们要拦截什么请求、我们要通过什么渠道发送消息。当我们确定了这两个问题之后只要到官网去找相应的brave包就可以了。下面举一个拦截sping mvc请求、通过rabbitmq发送消息的例子 第一步:先去git上找到sping mvc的brave拦截器、在找到rabbitmq发送的brave发送器 这里说明一下:拦截器在zipkin里面叫instrumentation。发送器叫sender。知道这两个概念可以帮助我们快速搜索,例如我用的是:mvnrepository.com/search。 只要在搜索框输入:brave-instrumentation 就可能看到各种拦截的工具;输入:zipkin-sender 就可以看到各种发送器 对于brave的源码地址如下:github.com/openzipkin/… 在这里可以看到源代码。帮助我们了解具体实现,也可以直接复制源代码到自己的项目里面实现拦截功能 我引入jar包:brave-instrumentation-spring-webmvc。我们看一下源码也是很简单。就是定一个SpanCustomizingAsyncHandlerInterceptor拦截器 引入jar包:zipkin-sender-amqp-client 发送mq消息。对于其他的依赖包可以通过:mvnrepository.com/search来查看。 下面简单截一段代码:


zipkin集成dubbo
根据上的说明可以基本理解客户端原理了。集成dubbo只要dubbo的instrumentation就可以。这里不粘贴源代码。只是简单说明一下我使用的dubbo是2.6+。通过继承dubbo-filter实现请求的拦截。对于发送端依然采用rabbitmq和上面没有区别不再说明
总结
本文主要是讲解一下zipkin的原理,给大家梳理一下使用的思路,对于具体使用大家可以自行在网上查看,有很多说明文章。我建议大家在了解zipkin客户端和服务端原理之后通过自己去查看brave源码来实现自己的数据监控。因为查看网上文章一般都会遇到各种各样的问题,还有很多文章过于久远导致各种版本不兼容。其实当我们知道了原理之后后面的具体实施就很简单了。一点提示就是在具体实现过程中一定要注意版本的兼容性和自己工程环境的兼容性。最好先创建一个简单工程验证,然后再加入到正式业务项目中。