zipkin官方网站,点此进入
Zipkin是一个分布式链路调用监控系统,聚合各业务调用延迟数据,以达到链路调用监控跟踪
架构图如下
总体划分,zipkin 可以分为 client 和 server 两部分。
client 就是我们需要管理的各个服务,在各种调用行为的过程当中收集数据发送给server。
server 用于收集各个 client 上报的数据,存储,分析,以及展示等等。
Zipkin Server主要包括四个模块:
Zipkin Client 不同的语言和框架做了不一样的实现,但是基本原理是一致的。即在服务调用的过程当中拦截请求,添加用于链路追溯的一些信息或者收集信息上报server。
例如spring工程,在restTemplate发送请求的过程当中加入filter。又或者EGGJS是使用中间件进行请求的拦截。
服务调用的过程
zipkin-server 是用 java 实现的,可以执行 jar 包启动。或者直接跑 docker
docker run --name zipkin -d -p 9411:9411 openzipkin/zipkin
这是使用 zipkin-server 最简单的方式。
另外 server 可以使用额外的数据存储组件对数据进行持久化存储。以及接入 消息中间件用于缓解server端的数据接收压力。这些后续如果要上线使用再集成。
目前我们的java应用基本是使用springcloud的架构,spring cloud针对Zipkin的集成非常成熟。
加入相关的依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-zipkinartifactId>
dependency>
应用的配置
spring.application.name=spring-client-1 //应用名称
spring.zipkin.base-url=http://127.0.0.1:9411 //服务端地址
spring.sleuth.sampler.percentage=1.0 //采样比例
spring.sleuth.sampler.rate=100 //单位时间上传速率限制
应用日志配置
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %X{X-B3-TraceId:-}-%X{X-B3-SpanId:-} %level ${LOG_SYSTEM} [%logger{100}_%M] - %msg%npattern>
有人针对 Eggjs 做了插件,引用插件即可。
添加依赖
npm i egg-zipkin --save
启用插件
zipkin: {
enable: true,
package: 'egg-zipkin',
}
应用配置
config.zipkin = {
serviceName: 'base-service',
httpsOn: false,
targetServer: '127.0.0.1:9411',
targetApi: '/api/v2/spans',
jsonEncoder: 'v2',
consoleRecorder: false
};
按照上述的应用配置,我跑了三个应用。分别是
请求一个API,调用过程如下
执行该接口。
zipkin 上的呈现
zipkin还会呈现服务的依赖情况
当流程存在异常的时候,例如我在最后的服务写个BUG
服务日志里出现异常
2020-11-12 18:59:26.282 159c66b078aa8955-8849ccfd7a5f30e7 ERROR [com.starnetuc.zhixin.common.exception.BusinessErrorDecoder_decode]
记得我们上面的日志配置%X{X-B3-TraceId:-}-%X{X-B3-SpanId:-}
, 159c66b078aa8955这个是traceId。可以查询这次调用过程。
当然系统提供了服务名称,时间等方式进行筛选
注意,系统对于HTTP请求是否异常的判断是通过HTTP状态码,所以服务接口出现意料之外的异常,状态码置为对应的状态码。例如 500, 403等等
后面附上调用的请求头和发送给zipkin的报文内容
服务A调用服务B的报文
GET /production/field/provinceandversion?pid=2 HTTP/1.1
X-B3-SpanId: ffa5382f8d436a5b
X-B3-ParentSpanId: adb5f4e54f3182c1
X-B3-Sampled: 1
X-B3-TraceId: adb5f4e54f3182c1
Accept: */*
User-Agent: Java/1.8.0_181
Host: 192.168.75.89:9097
Connection: keep-alive
服务A上报的报文
[{
"traceId": "adb5f4e54f3182c1",
"parentId": "adb5f4e54f3182c1",
"id": "ffa5382f8d436a5b",
"kind": "CLIENT",
"name": "get",
"timestamp": 1605182686556492,
"duration": 134208,
"localEndpoint": {
"serviceName": "produceweb",
"ipv4": "172.18.0.1"
},
"tags": {
"http.method": "GET",
"http.path": "/production/field/provinceandversion"
}
}, {
"traceId": "adb5f4e54f3182c1",
"id": "adb5f4e54f3182c1",
"kind": "SERVER",
"name": "get /self/production/field/provinceandversion",
"timestamp": 1605182686550122,
"duration": 145217,
"localEndpoint": {
"serviceName": "produceweb",
"ipv4": "172.18.0.1"
},
"remoteEndpoint": {
"ipv4": "127.0.0.1",
"port": 54718
},
"tags": {
"http.method": "GET",
"http.path": "/self/production/field/provinceandversion",
"mvc.controller.class": "ProductionFieldController",
"mvc.controller.method": "listProvinceAndHwversion"
}
}]
服务B调用服务C的报文
GET /api/materials/finished/model/get?id=2 HTTP/1.1
X-B3-SpanId: 6bc0d5f3db423892
X-B3-ParentSpanId: ffa5382f8d436a5b
X-B3-Sampled: 1
X-B3-TraceId: adb5f4e54f3182c1
Accept: */*
User-Agent: Java/1.8.0_181
Host: 127.0.0.1:7001
Connection: keep-alive
服务B上报的报文
[{
"traceId": "adb5f4e54f3182c1",
"parentId": "ffa5382f8d436a5b",
"id": "6bc0d5f3db423892",
"kind": "CLIENT",
"name": "get",
"timestamp": 1605182686565280,
"duration": 115108,
"localEndpoint": {
"serviceName": "eureka-service-produce",
"ipv4": "172.18.0.1"
},
"tags": {
"http.method": "GET",
"http.path": "/api/materials/finished/model/get"
}
}, {
"traceId": "adb5f4e54f3182c1",
"parentId": "adb5f4e54f3182c1",
"id": "ffa5382f8d436a5b",
"kind": "SERVER",
"name": "get /production/field/provinceandversion",
"timestamp": 1605182686561079,
"duration": 127734,
"localEndpoint": {
"serviceName": "eureka-service-produce",
"ipv4": "172.18.0.1"
},
"remoteEndpoint": {
"ipv4": "192.168.75.89",
"port": 49184
},
"tags": {
"http.method": "GET",
"http.path": "/production/field/provinceandversion",
"mvc.controller.class": "ProductionFieldController",
"mvc.controller.method": "listProvinceAndHwversion"
},
"shared": true
}]
服务C上报的报文
[{
"traceId": "adb5f4e54f3182c1",
"parentId": "ffa5382f8d436a5b",
"id": "6bc0d5f3db423892",
"name": "get",
"kind": "SERVER",
"timestamp": 1605182686638000,
"duration": 40717,
"localEndpoint": {
"serviceName": "base-service",
"ipv4": "192.168.75.89"
},
"tags": {
"http.url": "127.0.0.1:7001/api/materials/finished/model/get?id=2",
"http.status_code": "200"
},
"shared": true
}]