zipkin能够时时监控用户应用的时间和各项数据的开源应用程序前端
在讲解架构图以前先思考一个问题,若是咱们本身要作一个监控系统须要哪些模块 简单想一下可能包括:数据采集(通常在用户应用程序端)、数据上报(通常须要一个传输代理)、数据汇总(通常在监控应用服务端)、数据存储(须要一个存储介质)、数据展现(查询和统计api和前端)再来看下面的架构图就一目了然了 java
二、transport数据上报代理:数据在发送到服务端可使用多种渠道,例如:发送http请求、发送mq消息等。mysql
三、collector数据接收汇总:接收transport发送的数据因为发送渠道多种多样,因此接收端要适配各类渠道git
四、storage数据存储模块:因为数据存储介质多种多样,例如:内存、mysql等,因此存储模块要适配各类介质github
五、api和ui负责监控数据的展现:经过浏览器展现监控数据web
知道了以上zipkin的基本框架,后面的安装和使用就简单了spring
首先到官网下载服务端安装包:zipkin.io/ 这是官网地址。我使用的版本是2.14.0 注意:2.14.0服务端安装以后自动汉化,不用配置。部分早期版本安装以后默认英文版本。 下载连接:sql
search.maven.org/remote_cont…数据库
下载以后检查一下本身的jdk环境。最好1.8+版本 最基本的服务启动命令:java -jar zipkin-***.jar 默认端口:9411 启动以后访问:localhost:9411.展现页以下:apache
安装完成
因为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监控插入到链里面呢?
这里简单举两个具体的例子:
对于servlet请求很容易想到经过filter监控每个请求 对于spring mvc很容易想到经过拦截器监控
经过以上方法已经能够感知到用户的每个请求,下一步咱们可能会想须要采集那些数据呢? zipkin是基于google的一篇论文实现的,论文中详细说明了监控的数据原理。这里咱们不去看论文也没有必要看。只须要简单的思考几个问题就能够了。首先监控数据是一个链,链就要有先后的关联关系。和每一个链的数据划分。 例如:咱们须要监控用户端的两个请求,每一个请求通过一个链的两个节点。对于采集到的监控数据首先要分清楚那些数据属于哪个请求、属于一个请求数据的先后关系。
zipkin提出一个span的概念。span经过定义不一样类型的id帮助咱们划分请求和请求的先后关系 span 里面有traceId:同一个请求的traceid相同;spanid:每个接口调用能够建立一个spanid;还有一个parentId:代表确了前一个的spanId。根据这几个id咱们就能够区分请求和调用关系了 根据traceId区分出不一样的请求、根据spanid和parentid区分出先后调用关系。
区分请求以后咱们再思考一个问题:zipkin最关键的一个指标就是时间。zipkin经过定义如下时间概念来划分请求的不一样时间节点
一、cs:Client Send,客户端发起请求;
二、sr:Server Receive,服务器接受请求,开始处理;
三、ss:Server Send,服务器完成处理,给客户端应答;
四、cr:Client Receive,客户端接受到服务端应答;
注意以上四个时间都是点时间。zipkin能够经过点时间计算出段时间展现 以上的各类id和各类点时间已经能够实现zipkin的主要监控功能,对于span的详细参数说明你们能够查看git源码:
客户端完成数据采集和封装以后就是消息发送了,因为zipkin提供多种发送机制因此咱们只要实现不一样的消息发送客户端就能够了。好比http、mq等这里具体消息发送不细说了,后面会经过zipkin-brave帮助咱们实现消息发送
经过上面的说明咱们本身很容易实现一个zipkin客户端了 例如实现一个spring mvc请求的数据监控: 首先写一个拦截器,而后记录时间,标记出客户端仍是服务端封装span。最后将span发送给zipkin服务端便可。这里只是说明一个思路没有具体实现,后面的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来查看。 下面简单截一段代码:
根据上的说明能够基本理解客户端原理了。集成dubbo只要dubbo的instrumentation就能够。这里不粘贴源代码。只是简单说明一下我使用的dubbo是2.6+。经过继承dubbo-filter实现请求的拦截。对于发送端依然采用rabbitmq和上面没有区别再也不说明
本文主要是讲解一下zipkin的原理,给你们梳理一下使用的思路,对于具体使用你们能够自行在网上查看,有不少说明文章。我建议你们在了解zipkin客户端和服务端原理以后经过本身去查看brave源码来实现本身的数据监控。由于查看网上文章通常都会遇到各类各样的问题,还有不少文章过于久远致使各类版本不兼容。其实当咱们知道了原理以后后面的具体实施就很简单了。一点提示就是在具体实现过程当中必定要注意版本的兼容性和本身工程环境的兼容性。最好先建立一个简单工程验证,而后再加入到正式业务项目中。