本文節選自《瘋狂Spring Cloud微服務架構實戰》
京東購買位址::https://item.jd.com/12256011.html
當當網購買位址::http://product.dangdang.com/25201393.html
Spring Cloud教學視訊:http://blog.csdn.net/boxiong86/article/details/78399104
Spring Cloud電子書:http://blog.csdn.net/boxiong86/article/details/78488226
微服務跟蹤概述
先對微服務跟蹤的相關概念,做一個基本的講解。
實際問題與Sleuth
前面章節中,我們使用Spring Cloud來搭建服務叢集,不論是Eureka伺服器、服務執行個體,還是配置伺服器、網關等節點,都可以橫向擴充。一旦叢集中的服務數量增多,并且它們之間存在複雜的依賴關系,那麼管理它們将會變成一件很棘手的事情。
當外部使用者向叢集發起請求,這些請求将會調用多個服務,每個服務又會依賴其他的服務,此時,如果出現異常、逾時等情況,排查問題将變得非常困難。我們需要很清楚知道,服務出現了什麼問題,這些問題出在哪個環節。
為了能解決這些問題,Spring Cloud提供了Sleuth架構作為解決方案,Sleuth可以與Zipkin、Apache HTrace和ELK等資料分析、服務跟蹤系統進行整合,為服務跟蹤、解決問題提供了便利。
服務跟蹤系統
目前有許多的分布式跟蹤系統,例如Zipkin、HTrace等,這些系統可以幫助我們收集一些,由服務實時産生的資料(主要是日志),通過這些資料可以分析出分布式系統的健康狀态、服務調用過程、調用耗時等名額,為優化系統、解決問題提供了依據。
讀者需要差別兩個基本的概念:服務跟蹤和資料分析,資料分析系統(例如ELK等)收集了服務叢集所産生的資料後,也可以實作服務監控、服務跟蹤等功能,但明顯資料分析系統的概念更為廣泛、抽象。本書将會介紹服務跟蹤系統Zipkin,同樣也會介紹著名的資料分析平台ELK。
Sleuth基本概念
Sleuth借鑒了Google Dapper的設計,先了解以下兩個概念:
? Trace:表示整個跟蹤的過程,從使用者發起請求,到最終的響應。一次跟蹤包含多個跨度,這些跨度以樹狀結構進行儲存。
? Span:跨度,表示一次調用的過程,一次跟蹤包含多次的調用過程。假設使用者向A服務發送請求,A服務又要調用B服務,那麼此時将會産生兩個跨度:使用者調用A服務、A服務調用B服務。
圖10-1簡單地描述了跨度的概念。
圖10-1 跨度
如圖10-1,使用者或外部程式調用A服務,此次調用看作是跨度A,A服務還要調用B服務,在跨度A的基礎上會産生跨度B,跨度B是跨度A的一部分,在Sleuth的設計上,跨度A是B的父跨度。是以在整個跟蹤過程中,這些跨度是樹狀結構的。
除了跟蹤和跨度外,還要了解一下Annotation(事件辨別),它主要用于記錄事件的存在,主要包括以下幾個事件辨別:
? cs:Client Sent,表示用戶端發送了請求,這個辨別意味着跨度的開始。例如前面的A服務向B服務發送請求,A服務就是用戶端。
? sr:Server Received,表示服務端接收到請求,并開始進行處理。
? ss:Server Sent,表示伺服器端完成請求的處理,并對用戶端做出響應。
? cr:Client Received,表示用戶端接收到響應,意味着整個跨度的結束。
項目準備
在使用Sleuth前,先準備本章的測試項目,本章主要以一個微服務叢集為基礎,該叢集包括以下項目:
? test-eureka-server:Eureka伺服器,端口為8761。
? test-book-service:圖書微服務,主要提供根據id查詢圖書的服務,端口為8081。
? test-pay-service:支付微服務,主要提供支付服務,端口為8082。
? test-sale-service:銷售微服務,會調用圖書服務和支付服務,端口為8083。
以上的項目,均可以在codes\10目錄找到對應的源碼,幾個項目的結構請見圖10-2。
圖10-2 測試項目結構
以上幾個測試項目是一個簡單的Spring Cloud叢集,銷售服務依賴了“圖書服務”和“支付服務”。
本文節選自《瘋狂Spring Cloud微服務架構實戰》
Spring Cloud教學視訊:http://blog.csdn.net/boxiong86/article/details/78399104
Spring Cloud電子書:http://blog.csdn.net/boxiong86/article/details/78488226
本書代碼共享位址:https://gitee.com/yangenxiong/SpringCloud