Spring-Cloud(六)服務(wù)追蹤

Spring Cloud Sleuth

Spring Cloud Sleuth 主要功能就是在分布式系統(tǒng)中提供追蹤解決方案贮尉,并且兼容支持了 zipkin,你只需要在pom文件中引入相應(yīng)的依賴即可哥谷。
微服務(wù)架構(gòu)上通過業(yè)務(wù)來劃分服務(wù)的,通過REST調(diào)用概而,對外暴露的一個接口呼巷,可能需要很多個服務(wù)協(xié)同才能完成這個接口功能,如果鏈路上任何一個服務(wù)出現(xiàn)問題或者網(wǎng)絡(luò)超時赎瑰,都會形成導(dǎo)致接口調(diào)用失敗王悍。
隨著業(yè)務(wù)的不斷擴(kuò)張,服務(wù)之間互相調(diào)用會越來越復(fù)雜餐曼。

Spring Cloud Sleuth的專業(yè)術(shù)語:

  • Span:基本工作單元压储,例如,在一個新建的span中發(fā)送一個RPC等同于發(fā)送一個回應(yīng)請求給RPC源譬,span通過一個64位ID唯一標(biāo)識集惋,trace以另一個64位ID表示,span還有其他數(shù)據(jù)信息踩娘,比如摘要刮刑、時間戳事件、關(guān)鍵值注釋(tags)养渴、span的ID雷绢、以及進(jìn)度ID(通常是IP地址) span在不斷的啟動和停止,同時記錄了時間信息理卑,當(dāng)你創(chuàng)建了一個span翘紊,你必須在未來的某個時刻停止它。
  • Trace:一系列spans組成的一個樹狀結(jié)構(gòu)藐唠,例如帆疟,如果你正在跑一個分布式大數(shù)據(jù)工程鹉究,你可能需要創(chuàng)建一個trace。
  • Annotation:用來及時記錄一個事件的存在踪宠,一些核心annotations用來定義一個請求的開始和結(jié)束
  • cs :Client Sent -客戶端發(fā)起一個請求自赔,這個annotion描述了這個span的開始
  • sr : Server Received -服務(wù)端獲得請求并準(zhǔn)備開始處理它,如果將其sr減去cs時間戳便可得到網(wǎng)絡(luò)延遲
  • ss :Server Sent -注解表明請求處理的完成(當(dāng)請求返回客戶端)殴蓬,如果ss減去sr時間戳便可得到服務(wù)端需要的處理請求時間
  • cr :Client Received -表明span的結(jié)束匿级,客戶端成功接收到服務(wù)端的回復(fù)蟋滴,如果cr減去cs時間戳便可得到客戶端從服務(wù)端獲取回復(fù)的所有所需時間

將Span和Trace在一個系統(tǒng)中使用Zipkin注解的過程圖形化:

Span和Trace圖形化

Spring Cloud Zipkin

Spring cloud提供了spring-cloud-sleuth-zipkin來方便集成zipkin實現(xiàn)染厅,Zipkin是Twitter的一個開源項目,它基于Google Dapper實現(xiàn)津函。
我們可以使用它來收集各個服務(wù)器上請求鏈路的跟蹤數(shù)據(jù)肖粮,并通過它提供的REST API接口來輔助我們查詢跟蹤數(shù)據(jù)以實現(xiàn)對分布式系統(tǒng)的監(jiān)控程序,從而及時地發(fā)現(xiàn)系統(tǒng)中出現(xiàn)的延遲升高問題并找出系統(tǒng)性能瓶頸的根源尔苦。
除了面向開發(fā)的API接口之外涩馆,它也提供了方便的UI組件來幫助我們直觀的搜索跟蹤信息和分析請求鏈路明細(xì)。

zipkin-architecture

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

  • Collector:收集器組件魂那,它主要用于處理從外部系統(tǒng)發(fā)送過來的跟蹤信息,將這些信息轉(zhuǎn)換為Zipkin內(nèi)部處理的Span格式稠项,以支持后續(xù)的存儲涯雅、分析、展示等功能展运。
  • Storage:存儲組件活逆,它主要對處理收集器接收到的跟蹤信息,默認(rèn)會將這些信息存儲在內(nèi)存中拗胜,我們也可以修改此存儲策略蔗候,通過使用其他存儲組件將跟蹤信息存儲到數(shù)據(jù)庫中。
  • RESTful API:API組件埂软,它主要用來提供外部訪問接口锈遥。比如給客戶端展示跟蹤信息,或是外接系統(tǒng)訪問以實現(xiàn)監(jiān)控等勘畔。
  • Web UI:UI組件所灸,基于API組件實現(xiàn)的上層應(yīng)用。通過UI組件用戶可以方便而有直觀地查詢和分析跟蹤信息咖杂。

新建一個基礎(chǔ)Spring的Maven Moudle工程命名為zipkin庆寺,引用所需的依賴:

    <parent>
        <groupId>com.wkedong.springcloud</groupId>
        <artifactId>parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </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>
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-storage-mysql</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

這里依賴了zipkin相關(guān)的服務(wù)和Mysql數(shù)據(jù)庫(zipkin數(shù)據(jù)存入數(shù)據(jù)庫進(jìn)行持久化保存)

注:需要支持zipkin追蹤的應(yīng)用需要在pom文件里依賴以下內(nèi)容,這里不一一贅述

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

application.yml配置文件如下:

server:
  port: 6040
spring:
  application:
    name: zipkin
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/spring_cloud_zipkin?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver

接下來我們修改應(yīng)用主類:


/**
 * @author wkedong
 */
@EnableZipkinServer
@SpringBootApplication
public class ZipkinApplication {

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

}

@EnableZipkinServer注解表示該應(yīng)用為zipkin服務(wù)

啟動該應(yīng)用并訪問http://localhost:6040 ,出現(xiàn)zipkin查看的UI圖形頁面:

Zipkin


啟動Eureka诉字,Config懦尝,ServiceProducer知纷,ServiceConsumer并訪問Consumer接口/testGet接口,觀察控制臺輸出

  • Consumer下輸出:
2019-02-16 09:45:35.717  INFO [service-consumer,b97e2da610e3a31a,b97e2da610e3a31a,true] 16052 --- [nio-7010-exec-1] c.w.s.s.controller.ConsumerController    : ===<call testGet>===
  • Producer下輸出:
2019-02-16 09:45:36.177  INFO [service-producer,b97e2da610e3a31a,0f79122e2926c368,true] 14500 --- [nio-6070-exec-1] c.w.s.s.controller.ProducerController    : ===<call testGet>===
2019-02-16 09:45:36.177  INFO [service-producer,b97e2da610e3a31a,0f79122e2926c368,true] 14500 --- [nio-6070-exec-1] c.w.s.s.s.impl.ProducerServiceImpl       : /testGet, instanceId:HANWEB-PC:service-producer:6070, host:HANWEB-PC

從上面的控制臺輸出內(nèi)容中陵霉,我們可以看到多了一些形如[service-consumer,b97e2da610e3a31a,b97e2da610e3a31a,true]的日志信息琅轧,而這些元素正是實現(xiàn)分布式服務(wù)跟蹤的重要組成部分,它們每個值的含義如下:

  • 第一個值:service-consumer踊挠,它記錄了應(yīng)用的名稱乍桂,也就是application.properties中spring.application.name參數(shù)配置的屬性。
  • 第二個值:b97e2da610e3a31a效床,Spring Cloud Sleuth生成的一個ID睹酌,稱為Trace ID,它用來標(biāo)識一條請求鏈路剩檀。一條請求鏈路中包含一個Trace ID憋沿,多個Span ID。
  • 第三個值:b97e2da610e3a31a沪猴,Spring Cloud Sleuth生成的另外一個ID辐啄,稱為Span ID,它表示一個基本的工作單元运嗜,比如:發(fā)送一個HTTP請求壶辜。
  • 第四個值:true,表示是否要將該信息輸出到Zipkin等服務(wù)中來收集和展示担租。(這里有些人可能是false砸民,因為在各個應(yīng)用配置文件中sleuth:sampler:percentage: #zipkin收集率為配置,未配置的默認(rèn)值為0.1即10%的收集率翩活,改為1即可100%收集)

上面四個值中的Trace ID和Span ID是Spring Cloud Sleuth實現(xiàn)分布式服務(wù)跟蹤的核心阱洪。
在一次服務(wù)請求鏈路的調(diào)用過程中,會保持并傳遞同一個Trace ID菠镇,從而將整個分布于不同微服務(wù)進(jìn)程中的請求跟蹤信息串聯(lián)起來冗荸,以上面輸出內(nèi)容為例,service-consumer和service-producer同屬于一個前端服務(wù)請求來源利耍,所以他們的Trace ID是相同的蚌本,處于同一條請求鏈路中。


  • 現(xiàn)在查看zipkin管理頁面:


    Zipkin管理頁面
  • 可以看到多了一個訪問Traces記錄隘梨,點擊進(jìn)去:


    Traces

得到Sleuth收集到的跟蹤到詳細(xì)信息程癌,其中包括了請求服務(wù)名,請求接口轴猎,請求時間消耗等嵌莉。

  • 點擊依賴分析:
    依賴分析

查看Zipkin Server根據(jù)跟蹤信息分析生成的系統(tǒng)請求鏈路依賴關(guān)系圖


文章目錄:

整體demo的GitHub地址:Spring-Cloud

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市捻脖,隨后出現(xiàn)的幾起案子锐峭,更是在濱河造成了極大的恐慌中鼠,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沿癞,死亡現(xiàn)場離奇詭異援雇,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)椎扬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門惫搏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蚕涤,你說我怎么就攤上這事筐赔。” “怎么了钻趋?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵川陆,是天一觀的道長剂习。 經(jīng)常有香客問我蛮位,道長,這世上最難降的妖魔是什么鳞绕? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任失仁,我火速辦了婚禮,結(jié)果婚禮上们何,老公的妹妹穿的比我還像新娘萄焦。我一直安慰自己,他們只是感情好冤竹,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布拂封。 她就那樣靜靜地躺著,像睡著了一般鹦蠕。 火紅的嫁衣襯著肌膚如雪冒签。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天钟病,我揣著相機(jī)與錄音萧恕,去河邊找鬼。 笑死肠阱,一個胖子當(dāng)著我的面吹牛票唆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播屹徘,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼走趋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了噪伊?” 一聲冷哼從身側(cè)響起簿煌,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤典挑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后啦吧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體您觉,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年授滓,在試婚紗的時候發(fā)現(xiàn)自己被綠了琳水。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡般堆,死狀恐怖在孝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情淮摔,我是刑警寧澤私沮,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站和橙,受9級特大地震影響仔燕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜魔招,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一晰搀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧办斑,春花似錦外恕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蠕蚜,卻和暖如春尚洽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背波势。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工翎朱, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尺铣。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓拴曲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凛忿。 傳聞我的和親對象是個殘疾皇子澈灼,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

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