源碼:使用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
等整個服務起來,就可以在雲背景看到日志了: