簡介
為了更好地支撐日益增長的龐大業務量,我們常常需要把服務進行整合、拆分,使我們的服務不僅能通過叢集部署抵擋流量的沖擊,又能根據業務在其上進行靈活的擴充。随着分布式的普及、服務的快速增長與雲計算技術的進步,微服務架構也因其特有的優勢而備受關注。微服務架構的本質,是把整體的業務拆分成很多有特定明确功能的服務,通過很多分散的小服務之間的配合,去解決更大,更複雜的問題。對被拆分後的服務進行分類和管理,彼此之間使用統一的接口來進行互動。
本系列講述了在阿裡雲Kubernetes容器服務基礎之上,如何快速搭建基于Spring Cloud的微服務架構中的基礎設施:
- 第一篇: 分布式服務注冊與發現系統
- 第二篇: 分布式配置管理系統
- 第三篇: API網關服務Zuul 系統
- 第四篇: 分布式追蹤系統
- 第五篇: 分布式彈性服務與容錯處理架構Hystrix及其監控儀表闆
- 第六篇: 熔斷器聚合監控Hystrix Turbine
本文是系列中的第四篇,着重介紹分布式追蹤系統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
,如下:
點選
參數
, 可以通過修改參數配置進行定制化,例如指定資料庫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服務建立時指定的root使用者密碼,不填寫時會自動配置設定一個随機密碼;mysql.mysqlRootPassword
-
為mysql服務建立時指定的使用者名稱mysql.mysqlUser
-
為mysql服務建立時指定的使用者密碼,不填寫時會自動配置設定一個随機密碼;mysql.mysqlPassword
-
為mysql服務建立時指定的資料庫名稱mysql.db
修改之後,在右側選擇對應的叢集、命名空間,指定釋出名稱,然後點選部署。
幾分鐘之後,一個挂載了mysql資料庫的Zipkin執行個體就可以建立出來。
體驗Zipkin Server
服務
,在右側點選剛建立的Zipkin服務提供的通路位址,
在打開的Zipkin界面中,點選上部的菜單 -
Dependencies
,再點選
Find a trace
,就可以快速驗證Zipkin是否啟動成功。
如果點選查詢,可以看到如下類似的trace内容,則證明Zipkin Server已正常啟動。
開發微服務并內建Zipkin
如下圖所示,提供了4個基于Spring Boot開發的微服務示例,具體代碼請參閱:
https://github.com/AliyunContainerService/spring-cloud-k8s-sample切換到每個Spring Boot項目的根目錄,執行mvn spring-boot:run啟動服務。確定4個服務項目都正常啟動之後,在浏覽器或者postman中通路:
http://localhost:8031/service1/test1
打開Zipkin控制台界面,選擇service1搜尋就可以看到如下所示的調用鍊路:
點選每一項可以檢視具體的調用詳情,如服務間的調用關系、消耗時間等,如下圖所示:
總結
我們可以利用阿裡雲Kubernetes容器服務,快速搭建一套分布式追蹤系統,為應用引入和配置Zipkin服務。歡迎大家使用阿裡雲上的容器服務,快速搭建一套分布式追蹤系統Zipkin,比較簡單地內建到自己項目的微服務開發中。