目录
2.3下载zipkin server jar包(也可以新建springboot,自己搭建run)
1 简介
微服务系统:在win下 模拟客户买东西即一个叫bert的客户访问优衣库买衣服的简单demo,使用zipkin来追踪链路,并将数据持久化到elasticsearch,最后通过kibana来搜 索、查看交互存储在Elasticsearch索引中的数据。
2 前期准备
2.1下载elasticsearch
镜像网站:https://mirrors.huaweicloud.com/elasticsearch/7.6.2/
2.2下载kibana
镜像网站: https://mirrors.huaweicloud.com/kibana/7.6.2/
2.3下载zipkin server jar包(也可以新建springboot,自己搭建run)
比如zipkin-server-2.21.6-exec.jar,网上很多,都可以,这里提供一个
链接:https://pan.baidu.com/s/1GIrDlg7AGQQnJ3i_4m9GdA
提取码:0g47
3 快速开始
3.1 开启elasticsearch
运行./bin/elasticsearch.bat
3.2开启kibana
3.2.1配置kibana
打开./config/kibana.yml,指定要绑定的elasticsearch源,同时可以配置一下中文
3.2.2运行kibana
运行./bin/kibana.bat
3.3 开启zipkin 服务器
java -jar zipkin-server-2.21.6-exec.jar --STORAGE_TYPE=elasticsearch --DES_HOSTS=http://localhost:9200
3.4 开启bert服务端
这里打成了jar包,看源码可以在文末连接下载
java -jar bert.jar
访问 http://localhost:8988/bert_home
3.5 开启优衣库服务端
这里打成了jar包,看源码可以在文末连接下载
java -jar UNIQLO.jar
访问 http://localhost:8989/UNIQLO_home
3.6 买东西,催下单 链路访问模拟
浏览器分别访问
http://localhost:8988/shopping
http://localhost:8989//place_client_order
会看到
3.7 链路追踪
查看zipkin web http://localhost:9411
会发现
查看kibana
4 kibana设置权限问题:
kibana 本身没有用户名密码的设置,可以使用 nginx 来实现。
4.1 下载nginx
https://www.cnblogs.com/jiangwangxiang/p/8481661.html
4.2 开始:
参考: https://blog.youkuaiyun.com/li916227164/article/details/93883408
4.2.1配置
特别注意:有的时候改了配置,可是无法生效,一直是欢迎界面,那么有可能是浏览器缓存导致的,清一下就可以看到了,如下配置
即可登录访问本地目录,如果是访问kibana即http://localhost:5601
那么就得不能用root了,要用代理即
auth_basic_user_file就是账号,密码目录,可以使用htpasswd在线生成器进行加密成暗文:
https://tool.oschina.net/htpasswd
当然也可以是一个简单的txt文件格式是:
ytt:123456
4.2.2启动
先启动kibana等服务,然后启动nginx,访问:
可看到
linux 下可以参考:
https://www.cnblogs.com/agang-php/p/11167397.html
5 zipkin框架解析:
大体框架如下
(1) 其中CLIENT到collector 是日志收集部分,后续我们称为过程a
(2) collector到storage是数据上传保存部分,后续我们称为过程b
(3) zipkin 通过API从数据库中读取数据,然后可视化到ui界面,后续我们称为过程c
其中如果想各个部分分开做:
-----------------------------------------------------------------------------------------
那么过程a可以采用SpringCloud-Sleuth来收集日志,保存到本地
----------------------------------------------------------------------------------------
过程b就是将日志保存起来,假设还是保存到es,那么其实就是看看上述zipkin 在es保存的数据格式,然后我们只需要同样按该格式(其实就是哪些字段)保存好就行,看其字段有几种方式,可以通过kibana看一条记录就可以如:
接下来思路就是按照这种格式同样保存到es就行,往数据库中写数据手段多多,因为比较熟悉python这里就用python吧
关于使用Python对es进行增查删改,博客很多,可以查查,这里主要说一说探究过程和其中遇到的一些问题,帮助快速熟悉。
整个思路就是:
由于当前我们es已经保存了部分数据(上述运行bert的数据),这部分数据肯定是合法的,我们第一步就是该一下其中某些字段的值,看看ui中是否也对应更新显示,如果是,那么接下来就按照这部分的数据格式往其中插入一条新的数据,看看ui是否显示,显示即完成目标!所以
第一步:更新合法数据部分字段,验证es和ui实时同步更新。
第二步:往es插入一条新数据,看ui是否正确显示。
首先我们获取一条数据
import json
from elasticsearch import Elasticsearch
es = Elasticsearch()
print(es.get(index='zipkin-span-2020-08-17',id='3784d590c377d16d-dd53762eed5608551f14c1435038c9fe'))
输出
注意点:
(1) index 对应的就是下面的红框,id按说是对应绿框,但是其实kibana这里显示id是切断的简洁版,可以看其json文件,那里有其完整的id,更长的完整版,只有使用这个完整版,es.get才会找到,否则不行
接下来我们更新部分一个字段
index = 'zipkin-span-2020-08-17'
_id = "3784d590c377d16d-dd53762eed5608551f14c1435038c9fe"
es.update(index=index,id=_id ,body={'doc':{'name': "please successfully"}})
即这里将name更新为"please successfully",那么我们看es和对应ui
可以看到对应都变了,所以具有可行性
注意点:
(1)更新的时候一定要指定index和id
(2) body这里是固定写法即
body={'doc':{要更新的字段}}
切不可写成
body={要更新的字段}
后面这种在之前的版本可能对,当前是要使用上面的这种形式
接下来就是要插入一条数据了,有哪些字段呢?再看这个
我们只需要填填充如下字段即可
_index
_type
_id
_source
其他的version什么的我们不要管,当我们新插入一条数据的时候,这些会帮自动弄的
index:就是一个索引名字,随便取取
type:统一取成 '_doc'就行
id :这个就是一个唯一标识,也是自己随便定义,保证唯一即可,需要注意的是,在插入数据的时候有两种方法,即是index和create,其中Index方式可以不加这个字段,系统会为我们自动创建一个全局唯一id(我猜是根据时间戳),create是必须自己要定义一个,所以后续我们用index这种方式,懒得生成id了
source 这部分最重要了,其实这里就是个大字典,里面定义了所有我们路由监控到的数据,trainceId,paerntId等等
好了插入一条看看:
#字典定义
index = "zipkin-span-2020-10-18"
doc_type = "_doc"
traceId = '5555555555555555'
duration = 1234567
shared = True
localEndpoint = {'serviceName': 'uniqlo', 'ipv4': '192.168.0.102', 'port': 8989}
timestamp_millis = 1597668254890
kind = 'SERVER'
name = "tt"
#parentId = "3784d590c377d16d"
timestamp = 1597668254890000
_id = "3784d590c377d16d"
tags = {'mvc.controller.class': 'ZipkinProviderApplication', 'mvc.controller.method': 'call_bert_home', 'spring.instance_id': 'windows10.microdone.cn:UNIQLO:8989'}
#插入一条数据
es.index(index=index,doc_type=doc_type,body={"traceId":traceId,"duration":duration,'shared':shared,"localEndpoint":localEndpoint,"timestamp_millis":timestamp_millis,
"kind":kind,'name':name,"timestamp":timestamp,"id":_id,'tags':tags})
看看es和UI
注意点
(1)因为这里没有链路访问,所以没有parentId,后续有的话可以加上,有真正数据后也可以关联起来
总体代码
# -*- coding: utf-8 -*-
from elasticsearch import Elasticsearch
es = Elasticsearch()
#查看一条样本
print(es.get(index='zipkin-span-2020-08-17',id='3784d590c377d16d-dd53762eed5608551f14c1435038c9fe'))
#更新一条样本
index = 'zipkin-span-2020-08-17'
_id = "3784d590c377d16d-dd53762eed5608551f14c1435038c9fe"
es.update(index=index,id=_id ,body={'doc':{'name': "please successfully"}})
#插入一条样本
#字典定义
index = "zipkin-span-2020-10-18"
doc_type = "_doc"
traceId = '5555555555555555'
duration = 1234567
shared = True
localEndpoint = {'serviceName': 'uniqlo', 'ipv4': '192.168.0.102', 'port': 8989}
timestamp_millis = 1597668254890
kind = 'SERVER'
name = "tt"
#parentId = "3784d590c377d16d"
timestamp = 1597668254890000
_id = "3784d590c377d16d"
tags = {'mvc.controller.class': 'ZipkinProviderApplication', 'mvc.controller.method': 'call_bert_home', 'spring.instance_id': 'windows10.microdone.cn:UNIQLO:8989'}
es.index(index=index,doc_type=doc_type,body={"traceId":traceId,"duration":duration,'shared':shared,"localEndpoint":localEndpoint,"timestamp_millis":timestamp_millis,
"kind":kind,'name':name,"timestamp":timestamp,"id":_id,'tags':tags})
--------------------------------------------------------------------------------------------------------------------------------------------------
过程C的话就是需要将参数传给ui对应 的url就行了,有哪些地址了可以看其官方:
关于怎么传这里说的比较清楚
https://www.jianshu.com/p/17ce989e108e
这里写了个jdk11版本的,已上传github
6 其他问题:
6.1 不熟悉java 的话可以使用 python
https://www.cnpython.com/pypi/py-zipkin
https://blog.youkuaiyun.com/weixin_34255055/article/details/86278842
6.2 上述源码
https://github.com/Mryangkaitong/zipkin-elasticsearch-kibana
6.3 bert和优衣库代码打包的话请参考
https://blog.youkuaiyun.com/Garnett_zk/article/details/89185978
主要就是在pom文件中加
<packaging>jar</packaging>
打包成功后会在程序目录下的target目录下生产相应的jar包
如果报错 程序包org.junit.jupiter.api不存在请看
https://blog.youkuaiyun.com/littlehaes/article/details/104088317
6.4 eclipse 上传github
https://blog.youkuaiyun.com/weixin_34128839/article/details/92169706
https://jingyan.baidu.com/article/27fa7326b694d846f8271fd3.html
https://blog.youkuaiyun.com/qq_41973729/article/details/82184034
6.5 参考资料
(1) https://www.bilibili.com/video/BV1p4411K7pz?p=3
(3) https://blog.youkuaiyun.com/forezp/article/details/70162074
(4) https://blog.youkuaiyun.com/weixin_38937840/article/details/103891093
(5) https://blog.youkuaiyun.com/qq_38187437/article/details/105171275
(6) https://www.cnblogs.com/liuqijia/p/11507494.html
(7) https://www.jianshu.com/p/17ce989e108e