1.Skywalking与Zipkin的区别
- 颗粒度:Skywalking方法级(展示的更详细),方法中所有的调用都展示出来了,如数据库调用、redis调用,第三方网络调用,而Zipkin只能展示接口级
- UI界面:Skywalking完胜,国产开源,更适合国人眼球
- 代码侵入性:Skywalking无代码侵入,使用字节码增强技术,在启动服务时使用 javaagent 指向skywalking服务即可收集调用链span信息
- Zipkin:简单、轻量级
2.安装部署对比
Zipkin安装部署简单,参考:Spring Cloud Sleuth + Zipkin 调用链监控
Skywalking安装部署复杂:http://skywalking.apache.org/ , github
# Skywalking安装步骤如下:
# 1.docker 安装elasticsearch
docker run -d -it --name=elasticsearch --net=esnetwork \
--restart=always \
-p 9200:9200 \
-p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms2g -Xmx2g" \
-e TZ='Asia/Shanghai' \
-e LANG="en_US.UTF-8" \
-v /root/elasticsearch/config/:/usr/share/elasticsearch/config/ \
-v /root/elasticsearch/data/:/usr/share/elasticsearch/data/ \
-v /root/elasticsearch/logs/:/usr/share/elasticsearch/logs/ \
-v /root/elasticsearch/plugins/:/usr/share/elasticsearch/plugins/ \
-v /etc/localtime:/etc/localtime \
-v /etc/timezone:/etc/timezone \
elasticsearch:7.4.2
# 2.安装 IK 分词器(进入docker容器安装插件)
docker exec -it elasticsearch bash
cd bin/
elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
# 3.下载skywalking:wget http://mirror.bit.edu.cn/apache/skywalking/7.0.0/apache-skywalking-apm-7.0.0.tar.gz
# 4.解压,进入目录,修改配置
vi config/application.yml ,配置storage为elasticsearch7,默认h2
storage:
selector: ${SW_STORAGE:elasticsearch7}
# 5.启动 SkyWalking OAP 服务
sh bin/oapService.sh , 查看启动日志:tail -f logs/skywalking-oap-server.log
# 6.启动 SkyWalking UI 服务
sh bin/webappService.sh,查看日志:tail -f logs/web.log
# 7.复制 skywalking 软件里面的 agent 目录到 java应用服务器上
# 8.复制后,修改agent\config\agent.config 里面的collector.backend_service参数,
值为:skywalking OAP服务的IP地址,端口默认为11800
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.10.1:11800}
# 7.启动java服务,指向复制后的agent目录中的skywalking-agent.jar
nohup java -javaagent:/skywalking/agent/skywalking-agent.jar -jar xxxx-1.0.0.jar &
3.界面对比
启动zipkin与对应微服务,访问服务,产生数据,查看zipkin ui界面
- zipkin需要在代码中引入依赖,默认使用http向zipkin server发送数据,当调用量大时可以结合 rabbitmq ,java服务向rabbitmq发送调用链trace,zipkin采集rabbitmq里面的trace信息
- nohup java -jar zipkin-server-2.12.9-exec.jar --zipkin.collector.rabbitmq.addresses=localhost --zipkin.collector.rabbitmq.username=admin --zipkin.collector.rabbitmq.password=admin &
zipkin 只能看到调用了那些服务,服务耗时多长,没法查看服务中的方法调用了redis、网络接口等
启动Skywalking与对应微服务,访问服务,产生数据,查看skywalking ui界面
方法里面的mysql调用、redis调用,调用了几次,每次的耗时,都展示的很详情,very nice
比如,采集的这个接口,调用了2次mysql查询,每次耗时2670ms,就需要优化sql了
skywalking之所以能采集到多种中间件(http、redis、mysql、mongodb)等等的信息,是因为它对每个中间件内置了处理程序,当我们启动应用使用skywalking时会自动对应用内的各种中间件添加拦截器
有http的、jdbc的
zipkin只能采集到服务层,也就是那个控制器的那个方法,内部调用了什么不能采集,如需要采集需要自定义处理器,相当于给当前 traceId 手动添加 spanId
例如:SpringBoot应用,使用Zipkin则需要引入 brave 相关的包,然后自动注入http-interceptors拦截器,才能采集应用内对外的http请求
SpringCloud应用,使用sleuth会自动注入http的拦截器,在http请求头中添加spanId