1. 程式人生 > >分布式鏈路監控與追蹤系統

分布式鏈路監控與追蹤系統

分享圖片 延遲 ESS 原理 開放源代碼 image spring ram ati

1.分布式鏈路監控與追蹤產生背景
2.SpringCloud Sleuth + Zipkin
3.分布式服務追蹤實現原理
4.搭建Zipkin服務追蹤系統
5.搭建Zipkin集成RabbitMQ異步傳輸
6.SpringCloud2.x新知識介紹
7.發布SpringCloud2.0x百級完整超清視頻教程含源碼

分布式鏈路監控與追蹤產生背景

在微服務系統中,隨著業務的發展,系統會變得越來越大,那麽各個服務之間的調用關系也就變得越來越復雜。一個 HTTP 請求會調用多個不同的微服務來處理返回最後的結果,在這個調用過程中,可能會因為某個服務出現網絡延遲過高或發送錯誤導致請求失敗,這個時候,對請求調用的監控就顯得尤為重要了。Spring Cloud Sleuth 提供了分布式服務鏈路監控的解決方案。下面介紹 Spring Cloud Sleuth 整合 Zipkin 的解決方案。

Zipkin框架介紹

Zipkin 是 Twitter 的一個開源項目,它基於 Google Dapper 實現的。我們可以使用它來收集各個服務器上請求鏈路的跟蹤數據,並通過它提供的 REST API 接口來輔助查詢跟蹤數據以實現對分布式系統的監控程序,從而及時發現系統中出現的延遲過高問題。除了面向開發的 API 接口之外,它還提供了方便的 UI 組件來幫助我們直觀地搜索跟蹤信息和分析請求鏈路明細,比如可以查詢某段時間內各用戶請求的處理時間等。

Zipkin 和 Config 結構類似,分為服務端 Server,客戶端 Client,客戶端就是各個微服務應用。

微服務中,如果服務與服務之間的依賴關系非常復雜,如果某個服務出現一些問題,很難知道原因。

技術分享圖片

Spring Cloud提供ZipKin組件

SpringCloud Zipkin 與Sleuth
Zipkin 是一個開放源代碼分布式的跟蹤系統,由Twitter公司開源,它致力於收集服務的定時數據,以解決微服務架構中的延遲問題,包括數據的收集、存儲、查找和展現。
每個服務向zipkin報告計時數據,例如用戶每次請求服務的處理時間等,可方便的監測系統中存在的瓶頸。
zipkin會根據調用關系通過Zipkin UI生成依賴關系圖。

Spring Cloud Sleuth為服務之間調用提供鏈路追蹤。通過Sleuth可以很清楚的了解到一個服務請求經過了哪些服務,每個服務處理花費了多長。從而讓我們可以很方便的理清各微服務間的調用關系。此外Sleuth可以幫助我們:
耗時分析: 通過Sleuth可以很方便的了解到每個采樣請求的耗時,從而分析出哪些服務調用比較耗時;
可視化錯誤: 對於程序未捕捉的異常,可以通過集成Zipkin服務界面上看到;
鏈路優化: 對於調用比較頻繁的服務,可以針對這些服務實施一些優化措施。
Spring Cloud Sleuth可以結合Zipkin,將信息發送到Zipkin,利用Zipkin的存儲來存儲信息,利用Zipkin Ui來展示數據。

搭建Zipkin服務追蹤系統

Spring Boot 2.0 版本之後,官方已不推薦自己搭建定制了,而是直接提供了編譯好的 jar 包。詳情可以查看官網:https://zipkin.io/pages/quickstart.html
註意:zipkin官網已經提供定制了,使用官方jar運行即可。

啟動方式:
默認端口號啟動zipkin服務
java –jar zipkin.jar 默認端口號; 9411
訪問地址:http://192.168.18.220:9411

指定端口號啟動8080啟動zipkin服務
java -jar zipkin.jar --server.port=8080
訪問地址:http://192.168.18.220:8080

指定訪問rabbitmq 啟動
java -jar zipkin.jar --zipkin.collector.rabbitmq.addresses=127.0.0.1

技術分享圖片

訪問:http://192.168.8.159:9411/zipkin/

技術分享圖片

默認的值是在內存中 需要設置持久化到內存中哦

案例展示 order ---> member ---> msg

在Order服務、Member、Msg服務裏面引入:

         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>

pom:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>
    <!-- 管理依賴 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.M7</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!-- SpringBoot整合Web組件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- SpringBoot整合eureka客戶端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>

    </dependencies>
    <!-- 註意: 這裏必須要添加, 否者各種依賴有問題 -->
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

yml配置

技術分享圖片

###會員項目的端口號
server:
  port: 8000
###服務別名----服務註冊到註冊中心名稱 
spring:
  application:
    name: app-toov5-member
  zipkin: 
    base-url: http://127.0.0.1:9411/
  ###全部采集  
  sleuth:
    sampler:
      probability: 1.0

eureka:
  client:
    service-url:
    ##### 當前會員服務註冊到eureka服務地址
      defaultZone: http://localhost:8100/eureka
    ### 需要將我的服務註冊到eureka上
    register-with-eureka: true
    ####需要檢索服務
    fetch-registry: true

底層原理:

服務跟蹤原理
為了實現請求跟蹤,當請求發送到分布式系統的入口端點時, 只需要服務跟蹤框架為該請求創建一個唯的跟蹤標識, 同時在分布式系統內部流轉的時候,框架始終保持傳遞該唯一標識, 直到返回給請求方為止,這個唯一標識就是前 文中提到的Trace ID。通過Trace ID的記錄,我們就能將所有請求過程的日誌關聯起來。
為了統計各處理單元的時間延遲,當請求到達各個服務組件時,或是處理邏輯到達某個狀態時,也通過一個唯一 標識來標記它的開始、 具體過程以及結束,該標識就是前文中提到的Span ID。對於每個Span來說,它必須有開始和結束兩個節點,通過記錄開始Span和結束Span的時間戳,就能統計出該Span的時間延遲,除了時間戳記錄之外,它還可以包含一些其他元數據, 比如事件名稱、請求信息等
SpanId記錄每一次請求, TraceID記錄整個調用鏈全局ID

TraceId 和 SpanId 在微服務中傳遞追蹤

TraceId記錄每一次請求,耗時時間、接口調用關系

TraceId和SpanId在微服務中傳遞追蹤

在微服務中,使用請求頭傳遞TraceId和SpanId,一個TraceId由多個SpanId組合起來。獲取到整個微服務調用依賴關系

下一級的parentId就是上一級的spanId 形成一個鏈

每次請求生成一個新的spanId

分布式鏈路監控與追蹤系統