1. 簡述
在上一節《spring-cloud-sleuth+zipkin追蹤服務實現(一)》中,我們使用microservice-zipkin-server、microservice-zipkin-client、microservice-zipkin-client-backend 三個程序實現了使用http方式進行通信,數據持久化到內存中的服務調用鏈路追蹤實現。
在這里我們做兩點改動,首先是數據從保存在內存中改為持久化到數據庫,其次是將http通信改為mq異步方式通信。
我們還是使用之前上一節中的三個程序做修改,方便大家看到對比不同點。這里每個項目名都加了一個stream,用來表示區別。
2、microservice-zipkin-stream-server
要將http方式改為通過MQ通信,我們要將依賴的原來依賴的io.zipkin.java:zipkin-server換成spring-cloud-sleuth-zipkin-stream和spring-cloud-starter-stream-rabbit
同時要使用mysql持久化,我們需要添加mysql相關依賴。
全部maven依賴如下:
```
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--zipkin依賴-->
<!--此依賴會自動引入spring-cloud-sleuth-stream並且引入zipkin的依賴包-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
<scope>runtime</scope>
</dependency>
<!--保存到數據庫需要如下依賴-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
```
添加以上maven依賴后,我們將啟動類ZipkinServer中@EnableZipkinServer注解替換成@EnableZipkinStreamServer,
具體如下:
package com.yangyang.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.sleuth.zipkin.stream.EnableZipkinStreamServer;
/**
* Created by chenshunyang on 2017/5/24.
*/
@EnableZipkinStreamServer// //使用Stream方式啟動ZipkinServer
@SpringBootApplication
public class ZipkinStreamServerApplication {
public static void main(String[] args) {
SpringApplication.run(ZipkinStreamServerApplication.class,args);
}
}
點擊@EnableZipkinStreamServer注解的源碼我們可以看到它也引入了@EnableZipkinServer注解,同時還創建了一個rabbit-mq的消息隊列監聽器。
以方便接收從消息客戶端收集發過來的mq消息。
由於使用了消息中間件rabbit mq以及mysql,所以我們還需要在配置文件application.properties加入相關的配置:
server.port=11020
spring.application.name=microservice-zipkin-stream-server
#zipkin數據保存到數據庫中需要進行如下配置
#表示當前程序不使用sleuth
spring.sleuth.enabled=false
#表示zipkin數據存儲方式是mysql
zipkin.storage.type=mysql
#數據庫腳本創建地址,當有多個是可使用[x]表示集合第幾個元素
spring.datasource.schema[0]=classpath:/zipkin.sql
#spring boot數據源配置
spring.datasource.url=jdbc:mysql://localhost:3306/zipkin?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.initialize=true
spring.datasource.continue-on-error=true
#rabbitmq配置
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
其中zipkin.sql直接到官網去拷貝,也可以從本demo中拷貝
為了避免http通信的干擾,我們將原來的監聽端口有11008更改為11020,啟動程序,未報錯且能夠看到rabbit連接日志,說明程序啟動成功。
3.microservice-zipkin-stream-client、microservice-zipkin-client-stream-backend
與上一節中的配置一樣,客戶端的配置也非常簡單,maven依賴只需要將原來的spring-cloud-starter-zipkin替換為如下兩個依賴即可
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
此外,在配置文件中也加上連接MQ的配置
server:
port: 11021
spring:
application:
name: microservice-zipkin-stream-client
#rabbitmq配置
rabbitmq:
host: 127.0.0.1
port : 5672
username: guest
password: guest
當然為了以示區別,端口也做了相應的調整
4.測試
按照上一節的方式訪問:http://localhost:11021/call/1,我們可以上一節,說明rabbit-mq方式通信的sleuth功能已經生效了。
我們多次訪問consumer的地址可以看到日志中,請求的耗時時間不會再次出現突然耗時特長的情況。
為了體驗MQ通信給我們帶來的數據不丟失的特點,我們將數據庫中的數據清空,然后刷新zipkin server的界面,可以看到不再有數據
然后我們將zipkin-server程序想關閉,然后再多次訪問consumer的地址,之后,我們重啟zipkin server程序,啟動成功后訪問UI界面
很快看到Span Name選項有數據可以選擇了,同時數據庫中的記錄條數也不再是之前的0條了
如此說明我們的zipkin重啟后,從MQ中成功獲取出了在關閉這段時間里provider和consumer產生的信息數據。這樣我們使用spring-cloud-sleuth-stream+zipkin方式的rest服務調用追蹤功能就OK了。
5.項目源碼:
https://git.oschina.net/shunyang/spring-cloud-microservice-study.git
https://github.com/shunyang/spring-cloud-microservice-study.git
6.參考文檔:
spring cloud 官方文檔:https://github.com/spring-cloud/spring-cloud-sleuth