使用背景
生产环境中,服务越来越多、内部调用关系越来越复杂,需要搭建一套链路追踪系统来分析、评测调用链的各个环节快慢以及系统拓扑图。
简介&说明
链路追踪其实就是个数据上报和收集展示的过程
zipkin是一款链路追踪系统,由服务端和客户端两方组成,服务端由Zipkin提供了,客户端就是我们的应用程序,它不限定是springboot应用,只要按照规范进行上报,服务端就能解析调用链,其中有trace、span、annotation等相关概念不再赘述。
spring sleuth 就是实现了上报规范(traceId传递等),帮我们在rpc调用前后进行了上报,因此我们可以很简单地使用链路追踪功能!
开发环境
MAC \ STS \ JDK8.0 \ SpringBoot 2.1.3.RELEASE
Zipkin Server搭建
Zipkin官方:https://zipkin.io/pages/quickstart.html
SpringBoot 2.x起,Zipkin Server直接下载或编译jar包启动即可,不用自己再搭建了。
下载方式1:直接下载,
curl -sSL https://zipkin.io/quickstart.sh | bash -s
下载方式2:编码编译
# get the latest source
git clone https://github.com/openzipkin/zipkin
cd zipkin
# Build the server and also make its dependencies
./mvnw -DskipTests --also-make -pl zipkin-server clean install
# Run the server
java -jar ./zipkin-server/target/zipkin-server-*exec.jar
通过以上两种方式都会得到一个可执行的jar包,下面启动Zipkin:
java -DKAFKA_BOOTSTRAP_SERVERS=10.1.172.181:9092,10.1.172.181:9093,10.1.172.181:9094 -jar zipkin.jar
-DKAFKA_BOOTSTRAP_SERVERS:Zipkin可以通过Http接口、rabbitmq、kafka接收上报数据,本例通过kafka进行数据收集,kafka搭建点我
(zipkin默认使用内存存储,也可使用Mysql或者Es进行存储,以后再来补...)
默认9411端口(基于spring boot,可通过--server.port=xxx修改),启动后可直接通过浏览器访问http://127.0.0.1:9411,页面如下:
刚搭起来没有数据,下面开始在应用程序中通过Sleuth进行上报。
Zipkin客户端(Spring Boot应用)搭建
首先增加起步依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
那么sleuth在哪里?实际上spring-cloud-starter-zipkin是对sleuth和zipkin-client的打包
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
</dependencies>
修改application.properties,让zipkin客户端使用kafka进行上报:
# 采样比例,1.0表示100%
spring.sleuth.sampler.probability=1.0
# kafka集群地址
spring.kafka.bootstrap-servers=10.1.172.181:9092,10.1.172.181:9093,10.1.172.181:9094
# 重试次数
spring.kafka.producer.retries=3
# 不配置则使用http
spring.zipkin.sender.type=kafka
Spring Cloud中所有服务提供者、消费者都可以通过以上配置进行链路追踪数据上报,本文搭建了两个Zipkin Client,仅对关键关键的信息进行展示
下面由CUST通过Ribbon调用SP提供的服务。然后再回到Zipkin的页面
可以看到出现了几条调用链记录,其中红色表示调用链中出现了错误,一目了然。
两条报错是因为cust在rpc调用时把sp的名字配错了,改对之后重启cust再次调用成功了。
其他补充
有没有注意到文中并没有提到要为Zipkin在kafka中创建Topic?
其实在使用kafka时进行上报时,就自动创建了名为zipkin的Topic
在kafka所在机器上通过指令观察一下:
bin/kafka-topics.sh --describe --zookeeper localhost:2181
可以看到自动创建了1个分区两个副本(1主1从)的Topic
深度探讨一下,可不可以把Topic改为多个分区呢
bin/kafka-topics.sh --alter --zookeeper 10.1.172.181:2181 --partitions 2 --topic zipkin
通过以上指令成功改成两个分区,再次调用接口测试,数据依然正常,那么在一开始就自己创建个zipkin的Topic应该也是可行的!
如有问题,欢迎交流!