為什么使用RabbitMQ
zipkin的原理是服務之間的調用關系會通過HTTP方式上報到zipkin-server端,然后再通過zipkin-ui去調用查看追蹤服務之間的調用鏈路。但是這種方式存在一個隱患,如果微服務之間與zipkin服務端網絡不通,或調用鏈路上的網絡閃斷,http通信收集方式就無法工作。而且zipkin默認是將數據存儲在內存中的,如果服務端重啟或宕機,就會導致數據丟失。
不僅將數據存儲在zipkin-serve中,同時還能通過某個消息存儲的容器將本次調用其他服務的消息數據進行持久化存儲,這樣不就可以解決問題嗎?結合RabbitMQ證好解決了這一問題,再發一份到消息隊列中去。
項目架構圖如下:
Sleuth + Zipkin + RabbitMQ 集成項目示例
本例使用項目參考:【SpringCloud】Spring Cloud Sleuth + Zipkin 服務調用鏈路追蹤(二十五)項目
1、安裝RabbitMQ並啟動,參考【RabbitMQ】 RabbitMQ安裝
2、啟動Zipkin服務端,並連接到RabbitMQ
命令:java -jar zipkin-server-2.21.1-exec.jar --zipkin.collector.rabbitmq.addresses=localhost:5672 --zipkin.collector.rabbitmq.username=guest --zipkin.collector.rabbitmq.password=guest
3、查看RabbitMQ的Web界面,Queue選項中內容如下,增加了一個zipkin的Queue
4、Slehtu服務提供者項目(springcloud-provider-sleuth-payment8010),增加RabbitMQ依賴
1 <!-- zipkin + sleuth --> 2 <dependency> 3 <groupId>org.springframework.cloud</groupId> 4 <artifactId>spring-cloud-starter-zipkin</artifactId> 5 </dependency> 6 7 <dependency> 8 <groupId>org.springframework.boot</groupId> 9 <artifactId>spring-boot-starter-amqp</artifactId> 10 </dependency> 11 12 <!-- eureka client --> 13 <dependency> 14 <groupId>org.springframework.cloud</groupId> 15 <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> 16 </dependency>
完整依賴如下:

1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <parent> 6 <artifactId>test-springcloud</artifactId> 7 <groupId>com.test</groupId> 8 <version>1.0-SNAPSHOT</version> 9 </parent> 10 <modelVersion>4.0.0</modelVersion> 11 12 <artifactId>springcloud-provider-sleuth-payment8010</artifactId> 13 14 <dependencies> 15 16 <!-- zipkin + sleuth --> 17 <dependency> 18 <groupId>org.springframework.cloud</groupId> 19 <artifactId>spring-cloud-starter-zipkin</artifactId> 20 </dependency> 21 22 <dependency> 23 <groupId>org.springframework.boot</groupId> 24 <artifactId>spring-boot-starter-amqp</artifactId> 25 </dependency> 26 27 <!-- eureka client --> 28 <dependency> 29 <groupId>org.springframework.cloud</groupId> 30 <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> 31 </dependency> 32 33 <!-- spring boot --> 34 <dependency> 35 <groupId>org.springframework.boot</groupId> 36 <artifactId>spring-boot-starter-web</artifactId> 37 </dependency> 38 <dependency> 39 <groupId>org.springframework.boot</groupId> 40 <artifactId>spring-boot-starter-actuator</artifactId> 41 </dependency> 42 43 <dependency> 44 <groupId>org.springframework.boot</groupId> 45 <artifactId>spring-boot-devtools</artifactId> 46 <scope>runtime</scope> 47 <optional>true</optional> 48 </dependency> 49 50 <dependency> 51 <groupId>org.projectlombok</groupId> 52 <artifactId>lombok</artifactId> 53 <optional>true</optional> 54 </dependency> 55 <dependency> 56 <groupId>org.springframework.boot</groupId> 57 <artifactId>spring-boot-starter-test</artifactId> 58 <scope>test</scope> 59 </dependency> 60 </dependencies> 61 62 </project>
5、修改項目(springcloud-provider-sleuth-payment8010)作為Slehtu服務提供者的配置文件
1)更該zipkin的發送類型
2)增加spring rabbitmq的配置
1 spring: 2 application: 3 name: cloud-sleuth-provider 4 zipkin: 5 # zipkin url地址 6 # base-url: http://localhost:9411 7 sender: 8 type: rabbit 9 sleuth: 10 sampler: 11 # 采樣率值介於 0 到 1 之間, 1 則表示全部采集 12 # 默認值:0.1,即10% 13 probability: 1 14 # base-url: http://localhost:9411 15 rabbitmq: 16 host: localhost 17 port: 5672 18 username: guest 19 password: guest
6、測試
1)啟動Sleuth服務提供者項目
2)訪問地址:http://localhost:8010/payment/zipkin,正常獲取內容
3)在zipkin的web界面中,查看請求日志信息
4)關閉Zipkin服務,訪問地址:http://localhost:8010/payment/zipkin
通過Web界面,查看RabbitMQ中的zipkin隊列內容,發現有一個消息,且內容如下:
[ { "traceId":"35381f02daf9c1a4", "id":"35381f02daf9c1a4", "kind":"SERVER", "name":"get /payment/zipkin", "timestamp":1589131166688083, "duration":6650, "localEndpoint":{ "serviceName":"cloud-sleuth-provider", "ipv4":"192.168.1.4" }, "remoteEndpoint":{ "ipv6":"::1", "port":62161 }, "tags":{ "http.method":"GET", "http.path":"/payment/zipkin", "mvc.controller.class":"PaymentController", "mvc.controller.method":"paymentZipkin" } } ]
5)再次啟動Zipkin服務,RabbitMQ中的zipkin隊列消息,被消費了