天天看點

阿裡雲Kubernetes SpringCloud 實踐進行時(4): 分布式鍊路追蹤

簡介

為了更好地支撐日益增長的龐大業務量,我們常常需要把服務進行整合、拆分,使我們的服務不僅能通過叢集部署抵擋流量的沖擊,又能根據業務在其上進行靈活的擴充。随着分布式的普及、服務的快速增長與雲計算技術的進步,微服務架構也因其特有的優勢而備受關注。微服務架構的本質,是把整體的業務拆分成很多有特定明确功能的服務,通過很多分散的小服務之間的配合,去解決更大,更複雜的問題。對被拆分後的服務進行分類和管理,彼此之間使用統一的接口來進行互動。

本系列講述了在阿裡雲Kubernetes容器服務基礎之上,如何快速搭建基于Spring Cloud的微服務架構中的基礎設施:

本文是系列中的第四篇,着重介紹分布式追蹤系統Zipkin。

微服務的特點決定了一次請求可能少則經過幾次服務調用完成,多則跨越幾十個甚至是上百個服務節點。以往在單應用環境下,所有的業務都在同一個伺服器上,如果伺服器出現錯誤和異常,隻要盯住一個點,就可以快速定位和處理問題。

但是在微服務的架構下,如何分析服務鍊路的瓶頸并對其進行調優,如何快速進行服務鍊路的故障發現,如何跟蹤業務流的處理順序和結果,等等。這些在單應用下看起來較容易處理的事情,在微服務架構下卻成為了一個大問題。

Dapper與Zipkin

為了應對自身大規模的複雜叢集環境,Google公司提出了一套分布式跟蹤系統的理論機制,并發表了論文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》,給行業内分布式跟蹤的實作提供了非常有價值的參考。目前該論文也成為了目前分布式跟蹤系統的理論基礎。

Zipkin是一款開源的分布式實時資料追蹤系統,基于 Google Dapper的論文設計而來,由 Twitter 公司開發貢獻。其主要功能是聚集來自各個異構系統的實時監控資料。

各業務系統在彼此調用時,将特定的跟蹤消息傳遞至zipkin,zipkin在收集到跟蹤資訊後将其聚合處理、存儲、展示等,使用者可通過web UI友善獲得網絡延遲、調用鍊路、系統依賴等等。

Zipkin主要包括四個子產品:

  • Collector 接收或收集各應用傳輸的資料
  • Storage 存儲接受或收集過來的資料,目前支援Memory,MySQL,Cassandra,ElasticSearch等,預設存儲在記憶體中。
  • API(Query) 負責查詢Storage中存儲的資料,提供簡單的JSON API擷取資料,主要提供給web UI使用
  • Web 提供簡單的web界面

Spring Cloud與Zipkin

為了更好地支援內建分布式追蹤系統,Spring Cloud實作了一個名為Sleuth的項目,使得開發人員隻需要少量代碼即可實作與Zipkin等系統的內建。

下面講述一下在阿裡雲Kubernetes容器服務基礎之上,如何快速搭建一套分布式追蹤系統。

準備Kubernetes環境

阿裡雲容器服務Kubernetes 1.9.3目前已經上線,可以通過容器服務管理控制台非常友善地快速建立 Kubernetes 叢集。具體過程可以參考

建立Kubernetes叢集

體驗通過應用目錄簡便部署

Zipkin的存儲和收集可以根據實際情況進行配置,預設情況下,存儲使用了記憶體方式,收集則是使用了http post (/api/v1/spans)方式。監聽端口預設為9411。這種方式僅限于開發測試環境,因為一旦重新開機之後,記憶體中的資料将會消失,不能得到有效儲存。

點選左側的

應用目錄

,在右側選中

ack-springcloud-zipkin

,如下:

阿裡雲Kubernetes SpringCloud 實踐進行時(4): 分布式鍊路追蹤

點選

參數

, 可以通過修改參數配置進行定制化,例如指定資料庫MySQL的root使用者通路密碼、建立資料庫新使用者、指定資料庫名稱等等。修改之後,在右側選擇對應的叢集、命名空間,指定釋出名稱,然後點選部署。

replicaCount: 2
image:
  repository: registry.cn-hangzhou.aliyuncs.com/aliacs-app-catalog/zipkin
  tag: 1.5.13.RELEASE
  pullPolicy: Always

service:
  enabled: true
  type: LoadBalancer
  externalPort: 9411
  internalPort: 9411

mysql:
  image: "registry.cn-hangzhou.aliyuncs.com/aliacs-app-catalog/mysql"
  imageTag: "5.7.20"
  ## Specify password for root user
  ##
  ## Default: random 10 character string
  # mysqlRootPassword: testing

  ## Create a database user
  ##
  mysqlUser: mysqluser
  mysqlPassword:

  ## Allow unauthenticated access, uncomment to enable
  ##
  # mysqlAllowEmptyPassword: true

  ## Create a database
  ##
  mysqlDatabase: mydb           

其中,

  • 指定

    mysql.mysqlRootPassword

    為mysql服務建立時指定的root使用者密碼,不填寫時會自動配置設定一個随機密碼;
  • mysql.mysqlUser

    為mysql服務建立時指定的使用者名稱
  • mysql.mysqlPassword

    為mysql服務建立時指定的使用者密碼,不填寫時會自動配置設定一個随機密碼;
  • mysql.db

    為mysql服務建立時指定的資料庫名稱

修改之後,在右側選擇對應的叢集、命名空間,指定釋出名稱,然後點選部署。

幾分鐘之後,一個挂載了mysql資料庫的Zipkin執行個體就可以建立出來。

體驗Zipkin Server

服務

,在右側點選剛建立的Zipkin服務提供的通路位址,

阿裡雲Kubernetes SpringCloud 實踐進行時(4): 分布式鍊路追蹤

在打開的Zipkin界面中,點選上部的菜單 -

Dependencies

,再點選

Find a trace

,就可以快速驗證Zipkin是否啟動成功。

如果點選查詢,可以看到如下類似的trace内容,則證明Zipkin Server已正常啟動。

阿裡雲Kubernetes SpringCloud 實踐進行時(4): 分布式鍊路追蹤

開發微服務并內建Zipkin

如下圖所示,提供了4個基于Spring Boot開發的微服務示例,具體代碼請參閱:

https://github.com/AliyunContainerService/spring-cloud-k8s-sample
阿裡雲Kubernetes SpringCloud 實踐進行時(4): 分布式鍊路追蹤

切換到每個Spring Boot項目的根目錄,執行mvn spring-boot:run啟動服務。確定4個服務項目都正常啟動之後,在浏覽器或者postman中通路:

http://localhost:8031/service1/test1

打開Zipkin控制台界面,選擇service1搜尋就可以看到如下所示的調用鍊路:

阿裡雲Kubernetes SpringCloud 實踐進行時(4): 分布式鍊路追蹤

點選每一項可以檢視具體的調用詳情,如服務間的調用關系、消耗時間等,如下圖所示:

阿裡雲Kubernetes SpringCloud 實踐進行時(4): 分布式鍊路追蹤

總結

我們可以利用阿裡雲Kubernetes容器服務,快速搭建一套分布式追蹤系統,為應用引入和配置Zipkin服務。歡迎大家使用阿裡雲上的容器服務,快速搭建一套分布式追蹤系統Zipkin,比較簡單地內建到自己項目的微服務開發中。