源碼:使用Spring Cloud Sleuth和Zipkin進行分佈式跟蹤。
這一章主要講的是,之前自己寫的關聯ID的注入與傳播,用Sleuth來搞定,然後再加上統一日誌管理。
一、Spring Cloud Sleuth與關聯ID
1.Pom依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
只需要增加個依賴,跟蹤狀態就有了,是真滴方便。
2.使用Zuul將關聯ID添加到HTTP響應。
Sleuth官方認爲在http返回中返回跟蹤ID是不安全的,所以沒有返回,但是我們是需要的,所以要在Zuul的後置過濾器裏配製一下。
二、使用Open Zipkin進行分佈式跟蹤
1.許可證,組織,路由服務添加pom依賴
<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>
2.配置服務以指向Zipkin
3.安裝和配置Zipkin服務器
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
</dependency>
Zipkin支持4種不同的後端數據存儲,分別是:
- 內存數據
- MySQL
- Cassandra
- Elasticsearch
默認是內存。
4.設置跟蹤級別
默認情況下,zipkin只會將所有事務的10%寫進Zipkin服務器。
可以設爲這個值爲1.
spring:
sleuth:
sampler:
percentage: 1
也可以替換一個Bean,見名知意,總是發送。
5.使用Zipkin跟蹤事務
配置文件裏,url要加http,不然會報錯:
還是像之前那樣將配置服務改成native本地模式,然後依次開啓Eureka->配置服務-》日誌服務->組織和許可證-》路由。
在運行組織符合和許可證服務的時候,發現老是往localhost上連,調了三個小時才發現,媽耶,一個空格引發的血案:
這倆是一級的,源碼有個錯誤:
許可證服務配置的也不對:
這樣纔對:
然後用postman請求兩次:
接下來就可以跳到localhost:/9411見證奇蹟的時刻了~
然後點開一個詳細查看:
還可以繼續點下去,更詳細:
6.捕獲消息傳遞跟蹤
我們知道,之前的設計是,當組織產生更新或者刪除時,發送消息到消息隊列,然後通知許可證服務刷新redis。然後我們可以用它返回的id來跟蹤消息傳遞。
在Zipkin右上角輸入它,回車即可:
但是很可惜,關聯ID不會傳遞到消息隊列裏去,所以我們手動查一下許可證服務:
7.添加自定義跨度
Zipkin可以監控在SPring環境中的調用,但是redis呀,sql呀, 它監控不到,所以要添加自定義跨度,其實我們之前的記錄已經顯示redis的時間了,爲什麼呢?因爲已經配置了,代碼是這樣的:
記得一定要關閉跟蹤,否則會報錯:打開卻未關閉。
同樣,組織服務的Postgres數據庫操作,也需要定義個跨度:
三、日誌聚合與Spring Cloud Sleuth
現在用雲聚合日誌服務來保存日誌,原理是,docker裏運行的標準輸出都輸出到了Docker.sock,然後用Logspout Docker容器監聽Docker.sock,將得到的內容寫入遠程syslog位置。
1.創建Papertrail賬戶並配置syslog連接器
可能需要科學上網:Papertrail。我看了一下,阿里雲也有類似的東西,改日用阿里試試。
因爲是免費賬戶,所以創建很簡單:
然後添加一個日誌記錄連接就可以了:
2.將docker輸出重定向到Papertrail
把docker-compose.yml更改一下:那裏改成自己的地址。
然後運行docker環境,怎麼運行可以參考我之前寫的博客:包含docker運行配置。
要素就是先打包再用docker build。然後如果映射路徑啊什麼的都配置好了的話,run.sh裏的這些也可以都刪除
精簡一下docker-compose.yml文件,如下:
version: "3"
services:
eurekaserver:
image: johncarnell/tmx-eurekasvr:chapter9
ports:
- "8761:8761"
configserver:
image: johncarnell/tmx-confsvr:chapter9
ports:
- "8888:8888"
zipkin:
image: johncarnell/tmx-zipkinsvr:chapter9
ports:
- "9411:9411"
zuulserver:
image: johncarnell/tmx-zuulsvr:chapter9
ports:
- "5555:5555"
licensingservice:
image: johncarnell/tmx-licensing-service:chapter9
ports:
- "8080:8080"
organizationservice:
image: johncarnell/tmx-organization-service:chapter9
ports:
- "8081:8081"
logspout:
image: gliderlabs/logspout
command: syslog://logs2.papertrailapp.com:51993
volumes:
- /var/run/docker.sock:/var/run/docker.sock
然後:
#初始化
docker swarm init
#運行 將服務命名爲 mysite
docker stack deploy -c docker-compose.yml mysite
#查看運行狀況
docker service ls
等整個服務起來,就可以在雲後臺看到日誌了: