一个完整的分布式系统,除了系统本身,强调的就是监控,通过监控系统,出问题后可以迅速判断问题出在哪个地方。
监控组件 | 说明 |
---|---|
spring cloud slueth | 生成链路数据 |
zipkin | 和slueth配合使用,展示监控调用链信息 |
skywalking | 社区活跃度最高,支持4种语言 |
Pinpoint | 支持2种语言 |
试验系统
image.png
搭建一个系统,组成如图,其中外部访问都从api-gateway进入,通过hello-service2访问hello-service集群。搭建需要配置pom和相关配置参数。
pom配置如下
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
参数配置
spring:
sleuth:
sampler:
probability: 1.0
zipkin:
base-url: http://localhost:9411
从如下链接下载zipkin并运行
https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/
zipkinserver是个jar包,直接以jar包方式运行,启动后可以直接访问9411端口。
调用结果
通过localhost:9411地址查看
image.png
可以看到调用过程和调用时长,找到调用时间最长的地方进行优化。
相关原理
如上图,调用链上每个微服务都有sleuth组件,该组件对微服务侵入,对于每个访问都植入traceid和spanid,其中traceId是一个调用链全局唯一,而spanid对每个微服务的生成一个,采样相关数据。这样根据唯一的traceId和每个微服务的parent spanId和本服务的spanId,一条调用链可以很容易计算出来。
这些数据会被主动上报给zipkin server,zipkinserver根据数据展示调用图。
小结
一个现实的生产系统的调用链远比这里复杂,采用数据很多,需要统一设计形成采样平台。例如说物理层的采样、中间件采样、应用采样这三个层次,物理层采样和中间件是没法直接使用应用层的zipkin系统的,需要另外写埋点程序。
对于下一代基于servicemesh的微服务系统,可以都基于sidecar实施监控,对于物理层和中间件,都匹配一个sidecar,在sidecar中开发埋点监控。