在上一節《spring-cloud-sleuth+zipkin追蹤服務實作(一)》中,我們使用microservice-zipkin-server、microservice-zipkin-client、microservice- zipkin-client-backend 三個程式實作了使用http方式進行通信,資料持久化到記憶體中的服務呼叫鏈路追蹤實作。
在這裡我們做兩點改動,首先是資料從保存在記憶體中改為持久化到資料庫,其次是將http通訊改為mq非同步方式通訊。
我們還是使用之前上一節的三個程式做修改,方便大家看到對比不同點。這裡每個項目名都加了一個stream,用來表示差異。
要將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連線日誌,說明程式啟動成功。
與上一節中的設定一樣,客戶端的設定也非常簡單,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
當然為了以示區別,端口也做了相應的調整
按照上一節的方式訪問: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了。
以上是spring-cloud-sleuth+zipkin追蹤服務實作(二)的詳細內容。更多資訊請關注PHP中文網其他相關文章!