微服務的鏈路追蹤概述:
分布式鏈路追蹤(Distributed Tracing),就是將一次分布式請求還原成調用鏈路,進行日志記錄,性能監控並將一次分布式請求的調用情況集中展示。比如各個服務節點上的耗時、請求具體到達哪台機器上、每個服務節點的請求狀態等等。
Sleuth概述:
Spring Cloud Sleuth 主要功能就是在分布式系統中提供追蹤解決方案,並且兼容支持了 zipkin,只需要在pom文件中引入相應的依賴即可。
它大量借用了Google Dapper的設計。Dapper論文闡述了分布式系統,特別是微服務架構中鏈路追蹤的概念、數據表示、埋點、傳遞、收集、存儲與展示等技術細節。
鏈路追蹤Sleuth入門:
(1) 需要鏈路追蹤的微服務都添加上配置依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency>
( 2) 修改application.yml添加日志級別
logging:
level:
root: INFO
org.springframework.web.servlet.DispatcherServlet: DEBUG
org.springframework.cloud.sleuth: DEBUG
每個微服務都需要添加如上的配置。啟動微服務,調用之后,我們可以在各個微服務的控制台觀察到 sleuth 的日志輸出
其中 975279e5c6fce4b0 是TraceId,后面跟着的是SpanId,依次調用有一個全局的TraceId,將調用鏈路串起來。仔細分析每個微服務的日志,不難看出請求的具體過程。
查看日志文件並不是一個很好的方法,當微服務越來越多日志文件也會越來越多,通過Zipkin可以將日志聚合,並進行可視化展示和全文檢索。
Zipkin的概述:
Zipkin 是 Twitter 的一個開源項目,它基於 Google Dapper 實現,它致力於收集服務的定時數據,以解決微服務架構中的延遲問題,包括數據的收集、存儲、查找和展現。 我們可以使用它來收集各個服務器上請求鏈路的跟蹤數據,並通過它提供的 REST API 接口來輔助我們查詢跟蹤數據以實現對分布式系統的監控程序,從而及時地發現系統中出現的延遲升高問題並找出系統性能瓶頸的根源。除了面向開發的 API 接口之外,它也提供了方便的 UI 組件來幫助我們直觀的搜索跟蹤信息和分析請求鏈路明細,比如:可以查詢某段時間內各用戶請求的處理時間等。 Zipkin 提供了可插拔數據存儲方式:In-Memory、MySql、Cassandra 以及 Elasticsearch。
Zipkin 的架構,主要由 4 個核心組件構成:
Collector :收集器組件,它主要用於處理從外部系統發送過來的跟蹤信息,將這些信息轉換為Zipkin 內部處理的 Span 格式,以支持后續的存儲、分析、展示等功能。
Storage :存儲組件,它主要對處理收集器接收到的跟蹤信息,默認會將這些信息存儲在內存中,我們也可以修改此存儲策略,通過使用其他存儲組件將跟蹤信息存儲到數據庫中。
RESTful API :API 組件,它主要用來提供外部訪問接口。比如給客戶端展示跟蹤信息,或是外接系統訪問以實現監控等。
Web UI :UI 組件,基於 API 組件實現的上層應用。通過 UI 組件用戶可以方便而有直觀地查詢和分析跟蹤信息。
Zipkin 分為兩端,一個是 Zipkin 服務端,一個是 Zipkin 客戶端,客戶端也就是微服務的應用。客戶端會配置服務端的 URL 地址,一旦發生服務間的調用的時候,會被配置在微服務里面的 Sleuth 的監聽器監聽,並生成相應的 Trace 和 Span 信息發送給服務端。發送的方式主要有兩種,一種是 HTTP 報文的方式,還有一種是消息總線的方式如 RabbitMQ。
不論哪種方式,我們都需要:
一個服務注冊中心,這里就用之前的 eureka 來當注冊中心。
一個 Zipkin 服務端。
多個微服務,這些微服務中配置 Zipkin 客戶端。
Zipkin Server的部署和配置:
(1) Zipkin Server下載
從spring boot 2.0開始,官方就不再支持使用自建Zipkin Server的方式進行服務鏈路追蹤,而是直接提供了編譯好的 jar 包來給我們使用。可以從官方網站先下載Zipkin的web UI,我們這里下載的是zipkin -server-2.12.9-exec.jar
(2) 啟動
在命令行輸入 java -jar zipkin-server-2.12.9-exec.jar 啟動 Zipkin Server
默認 Zipkin Server的請求端口為 9411
Zipkin Server 的啟動參數可以通過官方提供的 yml 配置文件查找
在瀏覽器輸入 http://127.0.0.1:9411 即可進入到 Zipkin Server 的管理后台
客戶端Zipkin+Sleuth整合:
通過查看日志分析微服務的調用鏈路並不是一個很直觀的方案,結合zipkin可以很直觀地顯示微服務之間的調用關系。
(1)客戶端添加依賴(客戶端指的是需要被追蹤的微服務)
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency>
(2)修改客戶端配置文件
zipkin:
base-url: http://127.0.0.1:9411/ #zipkin server的地址
sender:
type: web #請求方式,默認以http的方式向zipkin server發送追蹤數據,其他取值如 kafka、rabbit
sleuth:
sampler:
probability: 1.0 #采樣的百分比,默認為0.1,即10%
#過於頻繁的采樣會影響系統性能,實際使用這里需要配置一個合適的值。
(3)測試
啟動每個微服務,通過瀏覽器發送一次微服務請求。打開 Zipkin Service 控制台,根據條件追蹤每次請求調用過程
基於消息中間件收集數據:
在默認情況下,Zipkin客戶端和Server之間是使用HTTP請求的方式進行通信(即同步的請求方式),在網絡波動,Server端異常等情況下可能存在信息收集不及時的問題。Zipkin支持與rabbitMQ整合完成異步消息傳輸。
1.RabbitMQ的安裝與啟動
.......
2.服務端啟動:
java -jar zipkin-server-2.12.9-exec.jar --RABBIT_ADDRESSES=127.0.0.1:5672
RABBIT_ADDRESSES : 指定RabbitMQ地址
RABBIT_USER: 用戶名(默認guest)
RABBIT_PASSWORD : 密碼(默認guest)
啟動Zipkin Server之后,我們打開RabbitMQ的控制台可以看到多了一個Queue
其中 zipkin 就是為我們自動創建的Queue隊列
3.客戶端配置
(1) 配置依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-sleuth-zipkin</artifactId> </dependency> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit</artifactId> </dependency>
(2) 配置消息中間件rabbit mq地址等信息
zipkin:
#base-url: http://127.0.0.1:9411/ #zipkin server的地址
sender:
#type: web #請求方式,默認以http的方式向zipkin server發送追蹤數據,其他取值如 kafka、rabbit
type: rabbit
sleuth:
sampler:
probability: 1.0 #采樣的百分比,默認為0.1,即10%
#過於頻繁的采樣會影響系統性能,實際使用這里需要配置一個合適的值。
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
listener: #配置重試策略
direct:
retry:
enabled: true
simple:
retry:
enabled: true
修改消息的投遞方式,改為 rabbit 即可。
添加 rabbitmq 的相關配置
(3) 測試
關閉Zipkin Server,並隨意請求連接。打開rabbitmq管理后台可以看到,消息已經推送到rabbitmq。
當Zipkin Server啟動時,會自動的從rabbitmq獲取消息並消費,展示追蹤數據
存儲跟蹤數據:
Zipkin Server追蹤數據信息默認保存到內存,這種方式不適合生產環境。因為一旦Zipkin Service關閉重啟或者服務崩潰,就會導致歷史數據消失。Zipkin支持將追蹤數據持久化到mysql數據庫或者存儲到elasticsearch中。
1.准備數據庫:可以從官網找到Zipkin Server持久mysql的數據庫腳本
2.配置啟動服務端
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=root
STORAGE_TYPE : 存儲類型
MYSQL_HOST: mysql主機地址
MYSQL_TCP_PORT:mysql端口
MYSQL_DB: mysql數據庫名稱
MYSQL_USER:mysql用戶名
MYSQL_PASS :mysql密碼