微服務應用開發進階①鏈路追蹤Zipkin

簡介

Zipkin 是一款開源的分佈式實時數據追蹤系統,由基於 Google Dapper 的論文設計而來,由 Twitter 公司提供開源實現,主要功能是聚集來自各個異構系統的實時監控數據,和微服務架構下的接口直接的調用鏈路和系統延時問題。

Spring Cloud Sleuth爲Spring Cloud實現了分佈式跟蹤解決方案,集成了Zipkin 。

應用場景: 1、可以知道在那個環節耗時長,解決系統併發瓶頸

                   2、在舊、複雜系統,根據調用鏈路優化架構

                   3、可以簡單收集調用信息和報錯,協助運維

架構和總覽

收集方式:http、kafka、rabbbitmq、activeMq、scribe (日誌收集系統)

                   Facebook的日誌收集系統https://github.com/facebook/scribe

存儲方式:in Memory、mysql、cassandra、es       

流程和概念

##基本單元Span、一次鏈路調用;多個span組成調用鏈
traceId:64位或128位,全局唯一,
parentId:父spanid,64位,根span的parentId爲空
id:spanid,64位,tranceId內唯一
name:方法名
serviceName:服務名
timestamp:自1970-1-1 00:00:00 UTC的微秒
duration:開始span到結束span的時間,單位微秒
annotations:記錄事件,value有一些預定義的值,例如客戶端發送(cs),客戶端接收(cr),服務端接收(sr),服務端發送(ss)等
tags:記錄附加數據

SpringCloud2.x簡單集成zipkin

下載和啓動zipkinServer      默認存儲在內存中

# 容器
docker run -d -p 9411:9411 openzipkin/zipkin
# java
curl -sSL https://zipkin.io/quickstart.sh | bash -s
java -jar zipkin.jar
## Running from Source
github下載源碼編譯
### 下載指定版本
https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec

配置zipkinClient    默認使用http的傳輸方式

### http的方式只需要這個包即可  包含spring-cloud-starter-sleuth
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
spring:
  sleuth:
    web:
      client:
        enabled: true
    sampler:
      probability: 1.0 # 將採樣比例設置爲 1.0,也就是全部都需要。默認是 0.1
  zipkin:
    base-url: http://localhost:9411/ # 指定了 Zipkin 服務器的地址

訪問http://127.0.0.1:9411/zipkin/ ,如圖

Zipkin + Kafka + Cassandra

啓動Server

啓動zipkinServer連上kafka和cassandra

java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=cassandra3  --CASSANDRA_KEYSPACE=zipkin_test  --CASSANDRA_CONTACT_POINTS=localhost:9042 --KAFKA_BOOTSTRAP_SERVERS=locahost:9092

zipkin-server報錯,topic不存在,可能自動創建被關閉了,那我們創建一個topic zipkin(默認topic)

[Producer clientId=producer-1] Error while fetching metadata with correlation id 7 : {zipkin=UNKNOWN_TOPIC_OR_PARTITION}

配置zipkinClient 

SpirngCloud2.x的變化!!!

相比上面的包,我們需要增加kafka的依賴,網上很多說要引入spring-cloud-sleuth-stream;

但是官網不推薦使用並且不支持,正常情況下必然是無法配置成功的,相關的依賴你咋都下來不下來咯。

最終只需要引入以下兩個包

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

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-stream-binder-kafka</artifactId>
</dependency>

配置文件如下:啓用zipkin採集方式爲kafka

spring:
  kafka:
    producer:
      max-request-size: 10485760
      bootstrap-servers: localhost:9092
      request-required-acks: 1
      retries: 5
      batch-size: 16384
      linger: 1
      buffer-memory: 134217728
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
  sleuth:
    sampler:
      probability: 1.0
    web:
      client:
        enabled: true
  zipkin:
    sender:
      type: kafka
#    base-url: http://localhost:9411

測試源碼和zipkinClient配置實例: https://github.com/zhouxiaohei/zipkin-test-demo

serviceb調用servicea,產生調用鏈和依賴;servicec和serviceb雷同,只是從HTTP傳輸換成kafka傳輸;

如圖,可以看到http請求失敗顯示爲紅色;serviceb調用servicea產生了兩個完整的span

 

如果換成servicec調用servicea,通過kafka工具我們能看到有kafka消息,類似如下圖

 

 生成調用鏈依賴

  如下圖所示,我們會發現一個問題,在in Memory的使用方式中,我們自動生成調用鏈,但是在cassandra中調用鏈沒有了;

其實除了in Memory的方式,其他存儲方式我們都需要使用官方zipkin-dependencies去定時生成調用鏈

## 下載子項目zipkin-dependencies
##方法1-2-3  官網最新、中央倉庫指定版本、docker
curl -sSL https://zipkin.io/quickstart.sh | bash -s io.zipkin.dependencies:zipkin-dependencies:LATEST zipkin-dependencies.jar
https://search.maven.org/remote_content?g=io.zipkin.dependencies&a=zipkin-dependencies&v=LATEST
docker run openzipkin/zipkin-dependencies    

Zipkin Dependencies默認分析的是當天的數據,可以通過命令參數的方式讓Zipkin Dependencies分析指定日期的數據

運行命令:

STORAGE_TYPE=cassandra3 CASSANDRA_KEYSPACE=zipkin_test CASSANDRA_CONTACT_POINTS=localhost:9042 java -jar zipkin-dependencies-2.2.0.jar 

OK,到這裏我們的鏈路追蹤就完成了,如果覺得有用就點個贊或者關注,支持一下吧~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章