天天看點

使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)

源碼:使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤。

這一章主要講的是,之前自己寫的關聯ID的注入與傳播,用Sleuth來搞定,然後再加上統一日志管理。

一、Spring Cloud Sleuth與關聯ID

1.Pom依賴

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

隻需要增加個依賴,跟蹤狀态就有了,是真滴友善。

2.使用Zuul将關聯ID添加到HTTP響應。

Sleuth官方認為在http傳回中傳回跟蹤ID是不安全的,是以沒有傳回,但是我們是需要的,是以要在Zuul的後置過濾器裡配制一下。

使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)

二、使用Open Zipkin進行分布式跟蹤

1.許可證,組織,路由服務添加pom依賴

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

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

2.配置服務以指向Zipkin

使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)

3.安裝和配置Zipkin伺服器

<dependency>
        <groupId>io.zipkin.java</groupId>
        <artifactId>zipkin-autoconfigure-ui</artifactId>
    </dependency>
      <dependency>
          <groupId>io.zipkin.java</groupId>
          <artifactId>zipkin-server</artifactId>
      </dependency>
           
使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)

Zipkin支援4種不同的後端資料存儲,分别是:

  1. 記憶體資料
  2. MySQL
  3. Cassandra
  4. Elasticsearch

    預設是記憶體。

4.設定跟蹤級别

預設情況下,zipkin隻會将所有事務的10%寫進Zipkin伺服器。

可以設為這個值為1.

spring:
	sleuth:
	    sampler:
	      percentage: 1
           

也可以替換一個Bean,見名知意,總是發送。

使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)

5.使用Zipkin跟蹤事務

配置檔案裡,url要加http,不然會報錯:

使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)

還是像之前那樣将配置服務改成native本地模式,然後依次開啟Eureka->配置服務-》日志服務->組織和許可證-》路由。

在運作組織符合和許可證服務的時候,發現老是往localhost上連,調了三個小時才發現,媽耶,一個空格引發的血案:

使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)

這倆是一級的,源碼有個錯誤:

使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)

許可證服務配置的也不對:

使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)

這樣才對:

使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)

然後用postman請求兩次:

使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)

接下來就可以跳到localhost:/9411見證奇迹的時刻了~

使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)

然後點開一個詳細檢視:

使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)

還可以繼續點下去,更詳細:

使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)
使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)
6.捕獲消息傳遞跟蹤

我們知道,之前的設計是,當組織産生更新或者删除時,發送消息到消息隊列,然後通知許可證服務重新整理redis。然後我們可以用它傳回的id來跟蹤消息傳遞。

使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)

在Zipkin右上角輸入它,回車即可:

使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)
使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)

但是很可惜,關聯ID不會傳遞到消息隊列裡去,是以我們手動查一下許可證服務:

使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)
使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)
7.添加自定義跨度

Zipkin可以監控在SPring環境中的調用,但是redis呀,sql呀, 它監控不到,是以要添加自定義跨度,其實我們之前的記錄已經顯示redis的時間了,為什麼呢?因為已經配置了,代碼是這樣的:

使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)

記得一定要關閉跟蹤,否則會報錯:打開卻未關閉。

同樣,組織服務的Postgres資料庫操作,也需要定義個跨度:

使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)

三、日志聚合與Spring Cloud Sleuth

現在用雲聚合日志服務來儲存日志,原理是,docker裡運作的标準輸出都輸出到了Docker.sock,然後用Logspout Docker容器監聽Docker.sock,将得到的内容寫入遠端syslog位置。

1.建立Papertrail賬戶并配置syslog連接配接器

可能需要科學上網:Papertrail。我看了一下,阿裡雲也有類似的東西,改日用阿裡試試。

使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)

因為是免費賬戶,是以建立很簡單:

使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)

然後添加一個日志記錄連接配接就可以了:

使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)
使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)

2.将docker輸出重定向到Papertrail

把docker-compose.yml更改一下:那裡改成自己的位址。

使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)

然後運作docker環境,怎麼運作可以參考我之前寫的部落格:包含docker運作配置。

要素就是先打包再用docker build。然後如果映射路徑啊什麼的都配置好了的話,run.sh裡的這些也可以都删除

使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)

精簡一下docker-compose.yml檔案,如下:

version: "3"
services:
  eurekaserver:
   image:   johncarnell/tmx-eurekasvr:chapter9
   ports:
       - "8761:8761"
  configserver:
    image: johncarnell/tmx-confsvr:chapter9
    ports:
       - "8888:8888"
  zipkin:
    image: johncarnell/tmx-zipkinsvr:chapter9
    ports:
      - "9411:9411"
  zuulserver:
    image: johncarnell/tmx-zuulsvr:chapter9
    ports:
      - "5555:5555"
  licensingservice:
    image: johncarnell/tmx-licensing-service:chapter9
    ports:
      - "8080:8080"
  organizationservice:
    image: johncarnell/tmx-organization-service:chapter9
    ports:
      - "8081:8081"
  logspout:
    image: gliderlabs/logspout
    command: syslog://logs2.papertrailapp.com:51993
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

           

然後:

#初始化
docker swarm init
#運作 将服務命名為 mysite
docker stack deploy -c docker-compose.yml mysite
#檢視運作狀況
docker service ls

           

等整個服務起來,就可以在雲背景看到日志了:

使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)
使用Spring Cloud Sleuth和Zipkin進行分布式跟蹤(學習筆記)

繼續閱讀