掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流
作者:翟永超 2018-04-09 13:56:13
開發(fā)
開發(fā)工具
分布式 Zipkin是Twitter的一個開源項目,它基于Google Dapper實現(xiàn)。我們可以使用它來收集各個服務器上請求鏈路的跟蹤數(shù)據(jù),并通過它提供的REST API接口來輔助我們查詢跟蹤數(shù)據(jù)以實現(xiàn)對分布式系統(tǒng)的監(jiān)控程序,從而及時地發(fā)現(xiàn)系統(tǒng)中出現(xiàn)的延遲升高問題并找出系統(tǒng)性能瓶頸的根源。

在臨海等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供成都做網(wǎng)站、成都網(wǎng)站設計 網(wǎng)站設計制作按需策劃,公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,品牌網(wǎng)站制作,成都全網(wǎng)營銷推廣,外貿(mào)網(wǎng)站制作,臨海網(wǎng)站建設費用合理。
通過上一篇《分布式服務跟蹤(整合logstash)》,我們雖然已經(jīng)能夠利用ELK平臺提供的收集、存儲、搜索等強大功能,對跟蹤信息的管理和使用已經(jīng)變得非常便利。但是,在ELK平臺中的數(shù)據(jù)分析維度缺少對請求鏈路中各階段時間延遲的關注,很多時候我們追溯請求鏈路的一個原因是為了找出整個調用鏈路中出現(xiàn)延遲過高的瓶頸源,亦或是為了實現(xiàn)對分布式系統(tǒng)做延遲監(jiān)控等與時間消耗相關的需求,這時候類似ELK這樣的日志分析系統(tǒng)就顯得有些乏力了。對于這樣的問題,我們就可以引入Zipkin來得以輕松解決。
Zipkin簡介
Zipkin是Twitter的一個開源項目,它基于Google Dapper實現(xiàn)。我們可以使用它來收集各個服務器上請求鏈路的跟蹤數(shù)據(jù),并通過它提供的REST API接口來輔助我們查詢跟蹤數(shù)據(jù)以實現(xiàn)對分布式系統(tǒng)的監(jiān)控程序,從而及時地發(fā)現(xiàn)系統(tǒng)中出現(xiàn)的延遲升高問題并找出系統(tǒng)性能瓶頸的根源。除了面向開發(fā)的API接口之外,它也提供了方便的UI組件來幫助我們直觀的搜索跟蹤信息和分析請求鏈路明細,比如:可以查詢某段時間內(nèi)各用戶請求的處理時間等。
上圖展示了Zipkin的基礎架構,它主要有4個核心組件構成:
HTTP收集
在Spring Cloud Sleuth中對Zipkin的整合進行了自動化配置的封裝,所以我們可以很輕松的引入和使用它,下面我們來詳細介紹一下Sleuth與Zipkin的基礎整合過程。主要分為兩步:
***步:搭建Zipkin Server
創(chuàng)建一個基礎的Spring Boot應用,命名為zipkin-server,并在pom.xml中引入Zipkin Server的相關依賴,具體如下:
org.springframework.boot spring-boot-starter-parent 1.5.10.RELEASE io.zipkin.java zipkin-server io.zipkin.java zipkin-autoconfigure-ui org.springframework.cloud spring-cloud-dependencies Dalston.SR5 pom import
- @EnableZipkinServer
- @SpringBootApplication
- public class ZipkinApplication {
- public static void main(String[] args) {
- SpringApplication.run(ZipkinApplication.class, args);
- }
- }
- spring.application.name=zipkin-server
- server.port=9411
創(chuàng)建完上述工程之后,我們將其啟動起來,并訪問http://localhost:9411/,我們可以看到如下圖所示的Zipkin管理頁面:
第二步:為應用引入和配置Zipkin服務
在完成了Zipkin Server的搭建之后,我們還需要對應用做一些配置,以實現(xiàn)將跟蹤信息輸出到Zipkin Server。我們以之前實現(xiàn)的trace-1和trace-2為例,對它們做以下改造內(nèi)容:
org.springframework.cloud spring-cloud-sleuth-zipkin
- spring.zipkin.base-url=http://localhost:9411
測試與分析
到這里我們已經(jīng)完成了接入Zipkin Server的所有基本工作,我們可以繼續(xù)將eureka-server、trace-1和trace-2啟動起來,然后我們做一些測試實驗,以對它的運行機制有一些初步的理解。
我們先來向trace-1的接口發(fā)送幾個請求:http://localhost:9101/trace-1,當我們在日志中出現(xiàn)跟蹤信息的***一個值為true的時候,說明該跟蹤信息會輸出給Zipkin Server,所以此時我們可以去Zipkin Server的管理頁面中選擇合適的查詢條件后,點擊Find Traces,就可以查詢出剛才在日志中出現(xiàn)的跟蹤信息了(也可以根據(jù)日志中的Trace ID,在頁面的右上角輸入框中來搜索),具體如下頁面所示:
點擊下方trace-1端點的跟蹤信息,我們還可以得到Sleuth收集到的跟蹤到詳細信息,其中包括了我們關注的請求時間消耗等。
點擊導航欄中的Dependencies菜單,我們還可以查看Zipkin Server根據(jù)跟蹤信息分析生成的系統(tǒng)請求鏈路依賴關系圖:
消息中間件收集
Spring Cloud Sleuth在整合Zipkin時,不僅實現(xiàn)了以HTTP的方式收集跟蹤信息,還實現(xiàn)了通過消息中間件來對跟蹤信息進行異步收集的封裝。通過結合Spring Cloud Stream,我們可以非常輕松的讓應用客戶端將跟蹤信息輸出到消息中間件上,同時Zipkin服務端從消息中間件上異步地消費這些跟蹤信息。
接下來,我們基于之前實現(xiàn)的trace-1和trace-2應用以及zipkin-server服務端做一些改造,以實現(xiàn)通過消息中間件來收集跟蹤信息。改造的內(nèi)容非常簡單,只需要我們做項目依賴和配置文件做一些調整就能馬上實現(xiàn),下面我們分別對客戶端和服務端的改造內(nèi)容做詳細說明:
***步:修改客戶端trace-1和trace-2
org.springframework.cloud spring-cloud-sleuth-stream org.springframework.cloud spring-cloud-starter-stream-rabbit
- spring.rabbitmq.host=localhost
- spring.rabbitmq.port=5672
- spring.rabbitmq.username=springcloud
- spring.rabbitmq.password=123456
第二步:修改zipkin-server服務端
為了讓zipkin-server服務端能夠從消息中間件中獲取跟蹤信息,我們只需要在pom.xml中引入針對消息中間件收集封裝的服務端依賴spring-cloud-sleuth-zipkin-stream,同時為了支持具體使用的消息中間件,我們還需要引入針對消息中間件的綁定器實現(xiàn),比如以使用RabbitMQ為例,我們可以在依賴中增加如下內(nèi)容:
org.springframework.cloud spring-cloud-sleuth-zipkin-stream org.springframework.cloud spring-cloud-starter-stream-rabbit io.zipkin.java zipkin-autoconfigure-ui
其中,spring-cloud-sleuth-zipkin-stream依賴是實現(xiàn)從消息中間件收集跟蹤信息的核心封裝,其中包含了用于整合消息中間件的核心依賴、zipkin服務端的核心依賴、以及一些其他通常會被使用的依賴(比如:用于擴展數(shù)據(jù)存儲的依賴、用于支持測試的依賴等)。但是,需要注意的是這個包里并沒有引入zipkin的前端依賴zipkin-autoconfigure-ui,為了方便使用,我們在這里也引用了它。
測試與分析
在完成了上述改造內(nèi)容之后,我們繼續(xù)將eureka-server、trace-1和trace-2、zipkin-server都啟動起來,同時確保RabbitMQ也處于運行狀態(tài)。此時,我們可以在RabbitMQ的控制頁面中看到一個名為sleuth的交換器,它就是zipkin的消息中間件收集器實現(xiàn)使用的默認主題。
***,我們使用之前的驗證方法,通過向trace-1的接口發(fā)送幾個請求:http://localhost:9101/trace-1,當有被抽樣收集的跟蹤信息時(調試時我們可以設置AlwaysSampler抽樣機制來讓每個跟蹤信息都被收集),我們可以在RabbitMQ的控制頁面中發(fā)現(xiàn)有消息被發(fā)送到了sleuth交換器中,同時我們再到zipkin服務端的Web頁面中也能夠搜索到相應的跟蹤信息,那么我們使用消息中間件來收集跟蹤信息的任務到這里就完成了。
完整示例:
讀者可以根據(jù)喜好選擇下面的兩個倉庫中查看trace-1和trace-2兩個項目:
Github:https://github.com/dyc87112/SpringCloud-Learning/
Gitee:https://gitee.com/didispace/SpringCloud-Learning/
【本文為51CTO專欄作者“翟永超”的原創(chuàng)稿件,轉載請通過51CTO聯(lián)系作者獲取授權】

我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流