Spring Cloud Sleuth服務(wù)鏈路追蹤(Finchley版本)

一、簡(jiǎn)介

微服務(wù)結(jié)構(gòu)是一個(gè)分布式架構(gòu)拐纱,微服務(wù)系統(tǒng)按照業(yè)務(wù)劃分服務(wù)單元铜异,一個(gè)微服務(wù)系統(tǒng)往往有很多個(gè)服務(wù)單元。由于服務(wù)單元數(shù)量眾多秸架,服務(wù)單元之間的調(diào)用很復(fù)雜揍庄,一旦出現(xiàn)錯(cuò)誤和異常,很難去定位咕宿。所以在微服務(wù)架構(gòu)中必須實(shí)現(xiàn)分布式服務(wù)鏈路追蹤币绩。目前,常見的鏈路追蹤組件有Google的Dapper府阀,Twitter的Zipkin缆镣,以及阿里的Eagleeye(鷹眼)等,它們都是非常優(yōu)秀的鏈路追蹤開源組件试浙。

本章主要講述如何在Spring Cloud Sleuth中集成Zipkin董瞻。

二、基本術(shù)語

  • Span:基本哦工作單元田巴,發(fā)送一個(gè)遠(yuǎn)程調(diào)度任務(wù)就會(huì)產(chǎn)生一個(gè)Span钠糊,Span是用一個(gè)64位ID唯一標(biāo)識(shí)的,Trace是用另一個(gè)64位ID唯一標(biāo)識(shí)的壹哺。Span還包含了其它信息抄伍,例如:摘要,時(shí)間戳事件管宵,Span的ID以及進(jìn)程ID;
  • Trace:由一系列的Span組成截珍,呈樹狀結(jié)構(gòu)。請(qǐng)求一個(gè)微服務(wù)系統(tǒng)的API接口箩朴,這個(gè)API接口需要調(diào)用多個(gè)微服務(wù)單元岗喉,調(diào)用每個(gè)微服務(wù)單元都會(huì)產(chǎn)生一個(gè)新的Span,所有由這個(gè)請(qǐng)求產(chǎn)生的Span組成這個(gè)Trace;
  • Annotation:用于記錄一個(gè)事件炸庞,一些核心注解用于定義一個(gè)請(qǐng)求的開始和結(jié)束钱床,這些注解如下:
    • cs - Client Sent:客戶端發(fā)送一個(gè)請(qǐng)求,表示Span的開始
    • sr - Server Received:服務(wù)端接收請(qǐng)求并準(zhǔn)備開始處理它埠居。(sr-cs)等于網(wǎng)絡(luò)的延遲
    • ss - Server Sent:服務(wù)端發(fā)送響應(yīng)查牌,該注解表明請(qǐng)求處理的完成。(ss-sr)表示服務(wù)端處理請(qǐng)求的時(shí)間
    • cr - Client Received:客戶端接收響應(yīng)拐格,此時(shí)Span結(jié)束僧免。(cr-cs)表示整個(gè)請(qǐng)求所消耗的時(shí)間

如果一個(gè)服務(wù)的調(diào)用關(guān)系如下:


調(diào)用關(guān)系

那么此時(shí)將Span和Trace在一個(gè)系統(tǒng)中使用Zipkin注解的過程圖形化:


Zipkin注解的過程圖形化

每個(gè)顏色的表明一個(gè)Span(總計(jì)7個(gè)Spans,從A到G)捏浊,每個(gè)Span有類似的信息:
Trace Id = X
Span Id = D
Client Sent

此Span表示Span的Trance Id是X懂衩,Span Id是D,同時(shí)它發(fā)送一個(gè)Client Sent事件金踪。

Spans 的parent/child關(guān)系圖形化如下:


Spans的parent/child關(guān)系圖形化

三浊洞、Spring Cloud Sleuth + Zipkin整合案例

3.1 相關(guān)工程說明

服務(wù) 端口 服務(wù)說明
eureka 8761 服務(wù)注冊(cè)于發(fā)現(xiàn)
provider 8800 服務(wù)提供者
consumer 8801 服務(wù)消費(fèi)者
chainMonitor 8770 鏈路追蹤服務(wù)端

3.2 服務(wù)鏈路追蹤服務(wù)端

1. pom.xml添加依賴
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!-- zipkin 界面-->
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-ui</artifactId>
            <version>2.11.5</version>
        </dependency>
        <!-- zipkin 服務(wù)類-->
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-server</artifactId>
            <version>2.11.5</version>
        </dependency>
2.配置文件
server:
  port: 8770

spring:
  application:
    name: chainmonitor

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
management:
  metrics:
    web:
      server:
        auto-time-requests: false
3.啟動(dòng)類添加注解@EnableZipkinServer
@SpringBootApplication
@EnableEurekaClient
@EnableZipkinServer
public class ChainmonitorApplication {

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

3.3 服務(wù)鏈路追蹤客戶端

3.3.1 服務(wù)提供者provider

1.pom.xml添加依賴
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>
2.配置文件
server:
  port: 8800

spring:
  application:
    name: provider
  # zipkin的地址:通過真實(shí)IP地址訪問  
  zipkin:
    base-url: http://localhost:8770
    #通過服務(wù)名訪問
    #base-url: http://chainmonitor/
  sleuth:
    sampler:
      #設(shè)置采樣率,為了測(cè)試設(shè)置100%采集胡岔,設(shè)置為1.0
      probability: 1.0
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
3.服務(wù)接口
@RestController
public class HelloController {
    @RequestMapping(value = "/getBookByName")
    public String getNameById(@RequestParam("id") String id){
        String bookName = "";
        switch (id){
            case "1" :
                bookName = "Java";
                break;
            case "2" :
                bookName = "C++";
                break;
            default:
                bookName = "phython";
        }
        return bookName;
    }
}

3.3.2 服務(wù)消費(fèi)者consumer

1.pom.xml添加依賴
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>
2.配置文件
server:
  port: 8801

spring:
  application:
    name: consumer
  # zipkin的地址:通過真實(shí)IP地址訪問  
  zipkin:
    base-url: http://localhost:8770
    #通過服務(wù)名訪問
    #base-url: http://chainmonitor/
  sleuth:
    sampler:
      #設(shè)置采樣率法希,為了測(cè)試設(shè)置100%采集,設(shè)置為1.0
      probability: 1.0
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

3.feign遠(yuǎn)程調(diào)用接口

@FeignClient(name = "provider")
public interface FeignService {
    @RequestMapping(value = "/getBookByName",method = RequestMethod.GET)
    String getBookByName(@RequestParam("id") String id);
}

4.服務(wù)接口

@RestController
public class HelloController {
    @Autowired
    private FeignService feignService;

    @RequestMapping(value = "getBookName")
    public String getBookName(@RequestParam("id") String id){
        return feignService.getBookByName(id);
    }
}

四靶瘸、zipkin中圖形化數(shù)據(jù)解析

4.1 zipkin可視化成功調(diào)用

在Zipkin中展示了跟蹤信息苫亦,紅框里是一個(gè)Trace


Trace

點(diǎn)擊每個(gè)Trace毛肋,可以看到多個(gè)Span


span

點(diǎn)擊每個(gè)span,可以看到詳細(xì)信息
span詳細(xì)信息

4.2 zipkin可視化失敗調(diào)用

如果調(diào)用鏈路中發(fā)生接口調(diào)用失敗,zipkin會(huì)默認(rèn)使用紅色展示信息屋剑,如下圖:


span

點(diǎn)擊紅色的span润匙,可以看到詳細(xì)的失敗信息:


失敗信息

github示例代碼下載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市唉匾,隨后出現(xiàn)的幾起案子孕讳,更是在濱河造成了極大的恐慌,老刑警劉巖巍膘,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厂财,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡峡懈,警方通過查閱死者的電腦和手機(jī)璃饱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肪康,“玉大人帜平,你說我怎么就攤上這事∶佛校” “怎么了裆甩?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)齐唆。 經(jīng)常有香客問我嗤栓,道長(zhǎng),這世上最難降的妖魔是什么箍邮? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任茉帅,我火速辦了婚禮,結(jié)果婚禮上锭弊,老公的妹妹穿的比我還像新娘堪澎。我一直安慰自己,他們只是感情好味滞,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布樱蛤。 她就那樣靜靜地躺著,像睡著了一般剑鞍。 火紅的嫁衣襯著肌膚如雪昨凡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天蚁署,我揣著相機(jī)與錄音便脊,去河邊找鬼。 笑死光戈,一個(gè)胖子當(dāng)著我的面吹牛哪痰,可吹牛的內(nèi)容都是我干的遂赠。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼晌杰,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼解愤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起乎莉,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奸笤,沒想到半個(gè)月后惋啃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡监右,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年边灭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片健盒。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绒瘦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扣癣,到底是詐尸還是另有隱情惰帽,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布父虑,位于F島的核電站该酗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏士嚎。R本人自食惡果不足惜呜魄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望莱衩。 院中可真熱鬧爵嗅,春花似錦、人聲如沸笨蚁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽括细。三九已至册招,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間勒极,已是汗流浹背是掰。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辱匿,地道東北人键痛。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓炫彩,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親絮短。 傳聞我的和親對(duì)象是個(gè)殘疾皇子江兢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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