Spring Cloud構(gòu)建微服務(wù)架構(gòu):分布式服務(wù)跟蹤(整合zipkin)【Dalston版】

通過上一篇《分布式服務(wù)跟蹤(整合logstash)》,我們雖然已經(jīng)能夠利用ELK平臺(tái)提供的收集、存儲(chǔ)眉枕、搜索等強(qiáng)大功能,對(duì)跟蹤信息的管理和使用已經(jīng)變得非常便利。但是齐遵,在ELK平臺(tái)中的數(shù)據(jù)分析維度缺少對(duì)請(qǐng)求鏈路中各階段時(shí)間延遲的關(guān)注寂玲,很多時(shí)候我們追溯請(qǐng)求鏈路的一個(gè)原因是為了找出整個(gè)調(diào)用鏈路中出現(xiàn)延遲過高的瓶頸源,亦或是為了實(shí)現(xiàn)對(duì)分布式系統(tǒng)做延遲監(jiān)控等與時(shí)間消耗相關(guān)的需求梗摇,這時(shí)候類似ELK這樣的日志分析系統(tǒng)就顯得有些乏力了拓哟。對(duì)于這樣的問題,我們就可以引入Zipkin來得以輕松解決伶授。

原文地址:http://blog.didispace.com/spring-cloud-starter-dalston-8-4/

Zipkin簡介

Zipkin是Twitter的一個(gè)開源項(xiàng)目断序,它基于Google Dapper實(shí)現(xiàn)。我們可以使用它來收集各個(gè)服務(wù)器上請(qǐng)求鏈路的跟蹤數(shù)據(jù)糜烹,并通過它提供的REST API接口來輔助我們查詢跟蹤數(shù)據(jù)以實(shí)現(xiàn)對(duì)分布式系統(tǒng)的監(jiān)控程序违诗,從而及時(shí)地發(fā)現(xiàn)系統(tǒng)中出現(xiàn)的延遲升高問題并找出系統(tǒng)性能瓶頸的根源。除了面向開發(fā)的API接口之外疮蹦,它也提供了方便的UI組件來幫助我們直觀的搜索跟蹤信息和分析請(qǐng)求鏈路明細(xì)诸迟,比如:可以查詢某段時(shí)間內(nèi)各用戶請(qǐng)求的處理時(shí)間等。

image

上圖展示了Zipkin的基礎(chǔ)架構(gòu)愕乎,它主要有4個(gè)核心組件構(gòu)成:

  • Collector:收集器組件阵苇,它主要用于處理從外部系統(tǒng)發(fā)送過來的跟蹤信息,將這些信息轉(zhuǎn)換為Zipkin內(nèi)部處理的Span格式感论,以支持后續(xù)的存儲(chǔ)绅项、分析、展示等功能比肄。
  • Storage:存儲(chǔ)組件快耿,它主要對(duì)處理收集器接收到的跟蹤信息,默認(rèn)會(huì)將這些信息存儲(chǔ)在內(nèi)存中芳绩,我們也可以修改此存儲(chǔ)策略掀亥,通過使用其他存儲(chǔ)組件將跟蹤信息存儲(chǔ)到數(shù)據(jù)庫中。
  • RESTful API:API組件示括,它主要用來提供外部訪問接口铺浇。比如給客戶端展示跟蹤信息,或是外接系統(tǒng)訪問以實(shí)現(xiàn)監(jiān)控等垛膝。
  • Web UI:UI組件鳍侣,基于API組件實(shí)現(xiàn)的上層應(yīng)用。通過UI組件用戶可以方便而有直觀地查詢和分析跟蹤信息吼拥。

HTTP收集

在Spring Cloud Sleuth中對(duì)Zipkin的整合進(jìn)行了自動(dòng)化配置的封裝倚聚,所以我們可以很輕松的引入和使用它,下面我們來詳細(xì)介紹一下Sleuth與Zipkin的基礎(chǔ)整合過程凿可。主要分為兩步:

第一步:搭建Zipkin Server

  • 創(chuàng)建一個(gè)基礎(chǔ)的Spring Boot應(yīng)用惑折,命名為zipkin-server授账,并在pom.xml中引入Zipkin Server的相關(guān)依賴,具體如下:
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.10.RELEASE</version>
    <relativePath/>
  </parent>
  <dependencies>
    <dependency>
        <groupId>io.zipkin.java</groupId>
        <artifactId>zipkin-server</artifactId>
    </dependency>
    <dependency>
        <groupId>io.zipkin.java</groupId>
        <artifactId>zipkin-autoconfigure-ui</artifactId>
    </dependency>
  </dependencies>
  <dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Dalston.SR5</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
  </dependencyManagement>
  • 創(chuàng)建應(yīng)用主類ZipkinApplication惨驶,使用@EnableZipkinServer注解來啟動(dòng)Zipkin Server白热,具體如下:
@EnableZipkinServer
@SpringBootApplication
public class ZipkinApplication {

  public static void main(String[] args) {
    SpringApplication.run(ZipkinApplication.class, args);
  }

}
  • application.properties中做一些簡單配置,比如:設(shè)置服務(wù)端口號(hào)為9411(客戶端整合時(shí)候粗卜,自動(dòng)化配置會(huì)連接9411端口屋确,所以在服務(wù)端設(shè)置了端口為9411的話,客戶端可以省去這個(gè)配置)续扔。
spring.application.name=zipkin-server
server.port=9411

創(chuàng)建完上述工程之后攻臀,我們將其啟動(dòng)起來,并訪問http://localhost:9411/纱昧,我們可以看到如下圖所示的Zipkin管理頁面:

image

第二步:為應(yīng)用引入和配置Zipkin服務(wù)

在完成了Zipkin Server的搭建之后刨啸,我們還需要對(duì)應(yīng)用做一些配置,以實(shí)現(xiàn)將跟蹤信息輸出到Zipkin Server识脆。我們以之前實(shí)現(xiàn)的trace-1trace-2為例设联,對(duì)它們做以下改造內(nèi)容:

  • trace-1trace-2pom.xml中引入spring-cloud-sleuth-zipkin依賴,具體如下所示存璃。
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
  • trace-1trace-2application.properties中增加Zipkin Server的配置信息仑荐,具體如下所示(如果在zip-server應(yīng)用中雕拼,我們將其端口設(shè)置為9411纵东,并且均在本地調(diào)試的話,該參數(shù)也可以不配置啥寇,因?yàn)槟J(rèn)值就是http://localhost:9411)偎球。
spring.zipkin.base-url=http://localhost:9411

測(cè)試與分析

到這里我們已經(jīng)完成了接入Zipkin Server的所有基本工作,我們可以繼續(xù)將eureka-server辑甜、trace-1trace-2啟動(dòng)起來衰絮,然后我們做一些測(cè)試實(shí)驗(yàn),以對(duì)它的運(yùn)行機(jī)制有一些初步的理解磷醋。

我們先來向trace-1的接口發(fā)送幾個(gè)請(qǐng)求:http://localhost:9101/trace-1猫牡,當(dāng)我們?cè)谌罩局谐霈F(xiàn)跟蹤信息的最后一個(gè)值為true的時(shí)候,說明該跟蹤信息會(huì)輸出給Zipkin Server邓线,所以此時(shí)我們可以去Zipkin Server的管理頁面中選擇合適的查詢條件后淌友,點(diǎn)擊Find Traces,就可以查詢出剛才在日志中出現(xiàn)的跟蹤信息了(也可以根據(jù)日志中的Trace ID骇陈,在頁面的右上角輸入框中來搜索)震庭,具體如下頁面所示:

image

點(diǎn)擊下方trace-1端點(diǎn)的跟蹤信息,我們還可以得到Sleuth收集到的跟蹤到詳細(xì)信息你雌,其中包括了我們關(guān)注的請(qǐng)求時(shí)間消耗等器联。

image

點(diǎn)擊導(dǎo)航欄中的Dependencies菜單,我們還可以查看Zipkin Server根據(jù)跟蹤信息分析生成的系統(tǒng)請(qǐng)求鏈路依賴關(guān)系圖:

image

消息中間件收集

Spring Cloud Sleuth在整合Zipkin時(shí),不僅實(shí)現(xiàn)了以HTTP的方式收集跟蹤信息拨拓,還實(shí)現(xiàn)了通過消息中間件來對(duì)跟蹤信息進(jìn)行異步收集的封裝肴颊。通過結(jié)合Spring Cloud Stream,我們可以非常輕松的讓應(yīng)用客戶端將跟蹤信息輸出到消息中間件上渣磷,同時(shí)Zipkin服務(wù)端從消息中間件上異步地消費(fèi)這些跟蹤信息苫昌。

接下來,我們基于之前實(shí)現(xiàn)的trace-1trace-2應(yīng)用以及zipkin-server服務(wù)端做一些改造幸海,以實(shí)現(xiàn)通過消息中間件來收集跟蹤信息祟身。改造的內(nèi)容非常簡單,只需要我們做項(xiàng)目依賴和配置文件做一些調(diào)整就能馬上實(shí)現(xiàn)物独,下面我們分別對(duì)客戶端和服務(wù)端的改造內(nèi)容做詳細(xì)說明:

第一步:修改客戶端trace-1trace-2

  • 為了讓trace-1trace-2在產(chǎn)生跟蹤信息之后袜硫,能夠?qū)⒊闃佑涗涊敵龅较⒅虚g件中,我們除了需要之前引入的spring-cloud-starter-sleuth依賴之外挡篓,還需要引入zipkin對(duì)Spring Cloud Stream的擴(kuò)展依賴spring-cloud-sleuth-stream以及基于Spring Cloud Stream實(shí)現(xiàn)的消息中間件綁定器依賴婉陷,以使用RabbitMQ為例,我們可以加入如下依賴:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-sleuth-stream</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
  • application.properties配置中去掉HTTP方式實(shí)現(xiàn)時(shí)使用的spring.zipkin.base-url參數(shù)官研,并根據(jù)實(shí)際部署情況秽澳,增加消息中間件的相關(guān)配置,比如下面這些關(guān)于RabbitMQ的配置信息:
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=springcloud
spring.rabbitmq.password=123456

第二步:修改zipkin-server服務(wù)端

為了讓zipkin-server服務(wù)端能夠從消息中間件中獲取跟蹤信息戏羽,我們只需要在pom.xml中引入針對(duì)消息中間件收集封裝的服務(wù)端依賴spring-cloud-sleuth-zipkin-stream担神,同時(shí)為了支持具體使用的消息中間件,我們還需要引入針對(duì)消息中間件的綁定器實(shí)現(xiàn)始花,比如以使用RabbitMQ為例妄讯,我們可以在依賴中增加如下內(nèi)容:

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

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

<dependency>
    <groupId>io.zipkin.java</groupId>
    <artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>

其中,spring-cloud-sleuth-zipkin-stream依賴是實(shí)現(xiàn)從消息中間件收集跟蹤信息的核心封裝酷宵,其中包含了用于整合消息中間件的核心依賴亥贸、zipkin服務(wù)端的核心依賴、以及一些其他通常會(huì)被使用的依賴(比如:用于擴(kuò)展數(shù)據(jù)存儲(chǔ)的依賴浇垦、用于支持測(cè)試的依賴等)炕置。但是,需要注意的是這個(gè)包里并沒有引入zipkin的前端依賴zipkin-autoconfigure-ui男韧,為了方便使用朴摊,我們?cè)谶@里也引用了它。

測(cè)試與分析

在完成了上述改造內(nèi)容之后煌抒,我們繼續(xù)將eureka-server仍劈、trace-1trace-2zipkin-server都啟動(dòng)起來寡壮,同時(shí)確保RabbitMQ也處于運(yùn)行狀態(tài)贩疙。此時(shí)讹弯,我們可以在RabbitMQ的控制頁面中看到一個(gè)名為sleuth的交換器,它就是zipkin的消息中間件收集器實(shí)現(xiàn)使用的默認(rèn)主題这溅。

image

最后组民,我們使用之前的驗(yàn)證方法,通過向trace-1的接口發(fā)送幾個(gè)請(qǐng)求:http://localhost:9101/trace-1悲靴,當(dāng)有被抽樣收集的跟蹤信息時(shí)(調(diào)試時(shí)我們可以設(shè)置AlwaysSampler抽樣機(jī)制來讓每個(gè)跟蹤信息都被收集)臭胜,我們可以在RabbitMQ的控制頁面中發(fā)現(xiàn)有消息被發(fā)送到了sleuth交換器中,同時(shí)我們?cè)俚絲ipkin服務(wù)端的Web頁面中也能夠搜索到相應(yīng)的跟蹤信息癞尚,那么我們使用消息中間件來收集跟蹤信息的任務(wù)到這里就完成了耸三。

完整示例:

讀者可以根據(jù)喜好選擇下面的兩個(gè)倉庫中查看trace-1trace-2兩個(gè)項(xiàng)目:

如果您對(duì)這些感興趣,歡迎star浇揩、follow仪壮、收藏、轉(zhuǎn)發(fā)給予支持胳徽!

本文內(nèi)容部分節(jié)選自我的《Spring Cloud微服務(wù)實(shí)戰(zhàn)》积锅,但對(duì)依賴的Spring Boot和Spring Cloud版本做了升級(jí)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末养盗,一起剝皮案震驚了整個(gè)濱河市缚陷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌往核,老刑警劉巖箫爷,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異铆铆,居然都是意外死亡蝶缀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門薄货,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人碍论,你說我怎么就攤上這事谅猾。” “怎么了鳍悠?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵税娜,是天一觀的道長。 經(jīng)常有香客問我藏研,道長敬矩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任蠢挡,我火速辦了婚禮弧岳,結(jié)果婚禮上凳忙,老公的妹妹穿的比我還像新娘。我一直安慰自己禽炬,他們只是感情好涧卵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腹尖,像睡著了一般柳恐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上热幔,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天乐设,我揣著相機(jī)與錄音,去河邊找鬼绎巨。 笑死伤提,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的认烁。 我是一名探鬼主播肿男,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼却嗡!你這毒婦竟也來了舶沛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤窗价,失蹤者是張志新(化名)和其女友劉穎如庭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撼港,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坪它,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帝牡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片往毡。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖靶溜,靈堂內(nèi)的尸體忽然破棺而出开瞭,到底是詐尸還是另有隱情,我是刑警寧澤罩息,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布嗤详,位于F島的核電站,受9級(jí)特大地震影響瓷炮,放射性物質(zhì)發(fā)生泄漏葱色。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一娘香、第九天 我趴在偏房一處隱蔽的房頂上張望苍狰。 院中可真熱鬧办龄,春花似錦、人聲如沸舞痰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽响牛。三九已至玷禽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呀打,已是汗流浹背矢赁。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贬丛,地道東北人撩银。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像豺憔,于是被迫代替她去往敵國和親右钾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子摧茴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容