隨着業務的發展,系統規模也會越來越大,各微服務間的調用關系也越來越錯綜復雜。
通常一個客戶端發起的請求在后端系統中會經過多個不同的微服務調用來協同產生最后的請求結果,
在復雜的微服務架構系統中,幾乎每一個前端請求都會形成一條復雜的分布式服務調用鏈路,在每條鏈路中任何一個依賴服務出現延遲過高或錯誤的時候都會引起請求最后的失敗。
這時候,對於每一個請求,全鏈路調用的跟蹤就變得越來越重要,通過實現對請求調用的跟蹤可以幫助我們快速發現錯誤根煙以及監控分析每條鏈路上的性能瓶頸。
現今業界分布式服務跟蹤的理論基礎主要來自於 Google 的一篇論文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》,
使用最為廣泛的開源實現是 Twitter 的 Zipkin,為了實現平台無關、廠商無關的分布式服務跟蹤,CNCF 發布了布式服務跟蹤標准 Open Tracing。
國內,淘寶的“鷹眼”、京東的“Hydra”、大眾點評的“CAT”、新浪的“Watchman”、唯品會的“Microscope”、窩窩網的“Tracing”都是這樣的系統。
Spring Cloud Sleuth
服務跟蹤原理
分布式系統的服務跟蹤主要包括下面兩個關鍵點:
1.為了實現請求跟蹤,當請求發送到分布式系統的入口端點時,只需要服務跟蹤框架為該請求創建一個唯一的跟蹤標識Trace ID,
同時在分布式系統內部流轉的時候,框架失蹤保持該唯一標識,直到返回給請求方位置。
服務追蹤的追蹤單元是從客戶發起請求(request)抵達被追蹤系統的邊界開始,到被追蹤系統向客戶返回響應(response)為止的過程,稱為一個“trace”。
2.為了統計各處理單元的時間延遲,當請求到達各個服務組件時,也是通過一個唯一標識Span ID來標記它的開始,具體過程以及結束。對每一個Span來說,它必須有開始和結束兩個節點,通過記錄開始Span和結束Span的時間戳,就能統計出該Span的時間延遲,除了時間戳記錄之外,它還可以包含一些其他元數據,比如時間名稱、請求信息等。
這樣,若干個有序的 span 就組成了一個 trace。在系統向外界提供服務的過程中,會不斷地有請求和響應發生,也就會不斷生成 trace,把這些帶有span 的 trace 記錄下來,就可以描繪出一幅系統的服務拓撲圖。附帶上 span 中的響應時間,以及請求成功與否等信息,就可以在發生問題的時候,找到異常的服務;根據歷史數據,還可以從系統整體層面分析出哪里性能差,定位性能優化的目標。
Spring Cloud Sleuth為服務之間調用提供鏈路追蹤。通過Sleuth可以很清楚的了解到一個服務請求經過了哪些服務,每個服務處理花費了多長。從而讓我們可以很方便的理清各微服務間的調用關系。此外Sleuth可以幫助我們:
- 耗時分析: 通過Sleuth可以很方便的了解到每個采樣請求的耗時,從而分析出哪些服務調用比較耗時;
- 可視化錯誤: 對於程序未捕捉的異常,可以通過集成Zipkin服務界面上看到;
- 鏈路優化: 對於調用比較頻繁的服務,可以針對這些服務實施一些優化措施。
spring cloud sleuth可以結合zipkin,將信息發送到zipkin,利用zipkin的存儲來存儲信息,利用zipkin ui來展示數據。
ZipKin
Zipkin 是一個開放源代碼分布式的跟蹤系統,由Twitter公司開源,它致力於收集服務的定時數據,以解決微服務架構中的延遲問題,包括數據的收集、存儲、查找和展現。
每個服務向zipkin報告計時數據,例如用戶每次請求服務的處理時間等,可方便的監測系統中存在的瓶頸。
zipkin會根據調用關系通過Zipkin UI生成依賴關系圖。
搭建方法:
1.建立一個Zipkin server,只需要在pom中添加依賴、在properties文件中配置端口服務名等、在啟動類中添加@EnableZipkinServer注解。
<dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-server</artifactId> </dependency>
<dependency> <groupId>io.zipkin.java</groupId> <artifactId>zipkin-autoconfigure-ui</artifactId> </dependency>
2.在每個服務提供項目中添加zipkin支持
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency>
Spring應用在監測到Java依賴包中有sleuth和zipkin后,會自動在RestTemplate的調用過程中向HTTP請求注入追蹤信息,並向Zipkin Server發送這些信息。
在配置文件中添加代碼:
spring: zipkin: base-url: http://localhost:9000 sleuth: sampler: percentage: 1.0
spring.zipkin.base-url指定了Zipkin服務器的地址,spring.sleuth.sampler.percentage將采樣比例設置為1.0,也就是全部都需要。