一、微服務架構下的問題
- 如何快速發現問題?
- 如何判斷故障影響範圍?
- 如何梳理服務依賴以及依賴的合理性?
- 如何分析鏈路性能問題以及實時容量規劃?
二、Sleuth
-
Span:基本工作單元,例如,在一個新建的span中發送一個RPC等同於發送一個迴應請求給RPC,span通過一個64位ID唯一標識,trace以另一個64位ID表示,span還有其他數據信息,比如摘要、時間戳事件、關鍵值註釋(tags)、span的ID、以及進度ID(通常是IP地址)span在不斷的啓動和停止,同時記錄了時間信息,當你創建了一個span,你必須在未來的某個時刻停止它。
-
Trace:一系列spans組成的一個樹狀結構,例如,如果你正在跑一個分佈式大數據工程,你可能需要創建一個trace。
-
Annotation:用來及時記錄一個事件的存在,一些核心annotations用來定義一個請求的開始和結束。
-
-
sr - Server Received -服務端獲得請求並準備開始處理它,如果將其sr減去cs時間戳便可得到網絡延遲
-
ss - Server Sent -註解表明請求處理的完成(當請求返回客戶端),如果ss減去sr時間戳便可得到服務端需要的處理請求時間
-
cr - Client Received -表明span的結束,客戶端成功接收到服務端的回覆,如果cr減去cs時間戳便可得到客戶端從服務端獲取回覆的所有所需時間
-
簡單的來說:這個分佈式鏈路追蹤就是一個查找錯誤、分析節點性能的東西。至於span和trace我們看下面一張小圖。
trace:整個鏈路調用,代表整個調用。span:每個最小工作單元,一次遠程服務調用。
這樣我們來通過trace和span就能夠實現鏈路追蹤了!!!
1、項目中整合sleuth
放入網關微服務、service-order微服務、service-product微服務中依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
分別加入日誌配置:
logging:
level:
root: info
org.springframework.web.servlet.DispatcherServlet: DEBUG
org.springframework.cloud.sleuth: DEBUG
重啓項目,看着這玩意。成功!!!
網關:traceID:0b48fa87c54c387a,span:0b48fa87c54c387a
service-order微服務,traceID:0b48fa87c54c387a,span:207b97ce89948d13
service-product微服務,traceID:0b48fa87c54c387a,span:d1b79f584d414475
從而驗證了我們上面那個小圖,一次遠程調用traceid是相同的,但是span是不同的。
老鐵們如果,這些信息存儲日誌中,就讓你們這麼看日誌,是不是很難受,所以引入下面的zipkin
三、zipkin
-
Collector:收集器組件,它主要用於處理從外部系統發送過來的跟蹤信息,將這些信息轉換爲Zipkin 內部處理的 Span 格式,以支持後續的存儲、分析、展示等功能。
-
Storage:存儲組件,它主要對處理收集器接收到的跟蹤信息,默認會將這些信息存儲在內存中,我們也可以修改此存儲策略,通過使用其他存儲組件將跟蹤信息存儲到數據庫中。
- RESTful API:API 組件,它主要用來提供外部訪問接口。比如給客戶端展示跟蹤信息,或是外接系統訪問以實現監控等。
-
Web UI:UI 組件,基於 API 組件實現的上層應用。通過 UI 組件用戶可以方便而有直觀地查詢和分析跟蹤信息。
-
一個 Eureka 服務註冊中心,這裏我們就用之前的 eureka 項目來當註冊中心。
-
一個 Zipkin 服務端。
-
多個微服務,這些微服務中配置Zipkin 客戶端。
1、Zipkin Server的部署和配置
(1) Zipkin Server下載
- 默認Zipkin Server的請求端口爲 9411
- Zipkin Server的啓動參數可以通過官方提供的yml配置文件查找
-
在瀏覽器輸入 http://127.0.0.1:9411即可進入到Zipkin Server的管理後臺
2、三個項目添加zipkin依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
添加配置
spring:
zipkin:
base-url: http://127.0.0.1:9411
sender:
type: web # 數據的傳輸方式、以http方式傳遞到server
sleuth:
sampler:
probability: 1 # 採集數據的比例
重啓一下項目:
3、zipkin數據保存到mysql中(解決第一個問題)
java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root --MYSQL_PASS=111111
然後就可以持久化到數據庫裏了。
4、連接消息中間件(解決第二個問題)
自己去安裝一下rabbitmq(偷偷的告訴你,用docker安裝賊快!!!)
java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root --MYSQL_PASS=111111 -RABBIT_ADDRESSES=127.0.0.1:5672
修改對應的配置:
zipkin:
# base-url: http://127.0.0.1:9411
sender:
type: rabbit
# type: web # 數據的傳輸方式、以http方式傳遞到server
sleuth:
sampler:
probability: 1 # 採集數據的比例
rabbitmq:
host: 127.0.0.1
port: 5672
username: user
password: password
listener:
direct:
retry:
enabled: true
simple:
retry:
enabled: true
證明了我們的配置正確。
源碼:[email protected]:Zesystem/springclouddedemowangguan.git