微服務—分佈式服務追蹤sleuth和zipkin

隨着業務的發展,系統規模也會愈來愈大,各微服務間的調用關係也愈來愈錯綜複雜。html

一般一個客戶端發起的請求在後端系統中會通過多個不一樣的微服務調用來協同產生最後的請求結果,前端

在複雜的微服務架構系統中,幾乎每個前端請求都會造成一條複雜的分佈式服務調用鏈路,在每條鏈路中任何一個依賴服務出現延遲太高或錯誤的時候都會引發請求最後的失敗。java

這時候,對於每個請求,全鏈路調用的跟蹤就變得愈來愈重要,經過實現對請求調用的跟蹤能夠幫助咱們快速發現錯誤根菸以及監控分析每條鏈路上的性能瓶頸。spring

現今業界分佈式服務跟蹤的理論基礎主要來自於 Google 的一篇論文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》後端

使用最爲普遍的開源實現是 Twitter 的 Zipkin,爲了實現平臺無關、廠商無關的分佈式服務跟蹤,CNCF 發佈了布式服務跟蹤標準 Open Tracing。性能優化

國內,淘寶的「鷹眼」、京東的「Hydra」、大衆點評的「CAT」、新浪的「Watchman」、惟品會的「Microscope」、窩窩網的「Tracing」都是這樣的系統。服務器

Spring Cloud Sleuth

服務跟蹤原理架構

分佈式系統的服務跟蹤主要包括下面兩個關鍵點:app

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,也就是所有都須要。

相關文章
相關標籤/搜索