【Spring Cloud Sleuth】分布式跟蹤服務(wù)-快速入門

分布式服務(wù)隨著業(yè)務(wù)的發(fā)展钥庇,系統(tǒng)規(guī)模也會(huì)變得越來越大赋铝,各服務(wù)之間的調(diào)用關(guān)系也變得越來約復(fù)雜。通常一個(gè)由客戶端發(fā)起的請求在后端系統(tǒng)中會(huì)經(jīng)過多個(gè)不同的微服務(wù)調(diào)用來協(xié)同產(chǎn)生最后的請求結(jié)果,在復(fù)雜的微服務(wù)架構(gòu)系統(tǒng)中尺上,幾乎每一個(gè)前端請求都有可能引起請求最后的失敗蛉威。這時(shí)候日丹,對于每一個(gè)依賴服務(wù)出現(xiàn)延遲過高或者錯(cuò)誤的時(shí)候都有可能引起服務(wù)最后的失敗。這時(shí)候蚯嫌,對于每個(gè)請求哲虾,全鏈路調(diào)用的跟蹤就變得越來越重要,通過實(shí)現(xiàn)對請求調(diào)用的根據(jù)可以幫助我們快速發(fā)現(xiàn)錯(cuò)誤根源以及監(jiān)控分析每條請求鏈路上的性能瓶頸择示。針對上面問題束凑,Spring Cloud Sleuth提供了一套完整的解決方案

快速入門
在引入Sleuth之前,我們依賴本人其他博客內(nèi)容栅盲,構(gòu)建一些基礎(chǔ)設(shè)施和引用
.服務(wù)注冊中心Eureka
.微服務(wù)應(yīng)用:trace-1,實(shí)現(xiàn)一個(gè)Rest接口/trace-1汪诉,調(diào)用接口后將觸發(fā)對trace2應(yīng)用的調(diào)用,具體實(shí)現(xiàn)如下:
pom依賴:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.SR2</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

.應(yīng)用trace1剪菱、trace2的application.yml配置:

# 只列出了trace1應(yīng)用的配置文件摩瞎,trace2應(yīng)用配置內(nèi)容類似
server:
  port: 8201
spring:
  application:
    name: trace1
eureka:
  instance:
    instance-id: trace:8201
    hostname: trace1
  client:
    fetch-registry: true
    register-with-eureka: true
    serviceUrl:
      defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka

.trace1、trace2應(yīng)用啟動(dòng)類
將trace1孝常、trace2應(yīng)用注冊到Eureka注冊中心

@SpringBootApplication
@EnableEurekaClient
public class Tracing1Application {
    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

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

.trace1應(yīng)用REST接口

@RestController
@Slf4j
public class Trace {
    @Autowired
    RestTemplate restTemplate;
    @GetMapping("/trace-1")
    public String trace() {
        log.info("=====call trace-1====");
        return restTemplate.getForEntity("http://trace2/trace-2",String.class).getBody();
    }
}

.trace2應(yīng)用REST接口

@RestController
@Slf4j
public class Trace {
    @Autowired
    RestTemplate restTemplate;
    @GetMapping("/trace-2")
    public String trace() {
        log.info("=====call trace-2====");
        return "Trace";
    }
}

.瀏覽器調(diào)用http://localhost:8201/trace-1旗们,顯示結(jié)果如下:

# trace1
2018-10-28 12:57:05.738  INFO [trace1,fc2ec50d569fb572,fc2ec50d569fb572,false] 2423 --- [nio-8201-exec-6] s.tracing1.traceController.Trace         : =====call trace-1====
# trace2 
2018-10-28 12:57:11.227  INFO [trace2,fc2ec50d569fb572,0e335c29b8314c9d,false] 2431 --- [nio-8202-exec-3] s.tracing2.traceController.Trace         : =====call trace-2====

從控制臺(tái)輸出的內(nèi)容中,我們可以看到打印出了[trace1,fc2ec50d569fb572,fc2ec50d569fb572,false]信息构灸,這些元素正式分布式跟蹤的重要組成部分上渴,各元素含義如下:
.第一個(gè)值:trace1,應(yīng)用的名稱喜颁,application.yml文件中對應(yīng)的spring.application.name
.第二個(gè)值:fc2ec50d569fb572稠氮,Spring Cloud Sleuth生成的Trace ID,用于表示一條請求鏈路。一個(gè)請求鏈路可以包含一個(gè)Trace ID和多個(gè)Span ID
.第三個(gè)值:0e335c29b8314c9d半开,Span ID隔披,它表示一個(gè)基本的工作單。
.第四個(gè)值:false寂拆,表示是否將該信息輸出到Zipkin等服務(wù)中來收集和展示

.跟蹤原理
也可以通過在trace2的/trace-2方法中增加下面的輸出奢米,打印出traceId和spanId

@RestController
@Slf4j
public class Trace {
    @Autowired
    RestTemplate restTemplate;
    @GetMapping("/trace-2")
    public String trace(HttpServletRequest request) {
        log.info("=====call trace-2====抓韩,Trace ID={},Span ID={}",
                request.getHeader("X-B3-TraceId"),
                request.getHeader("X-B3-SpanId"));
        return "Trace";
    }
}

# trace1應(yīng)用輸出
2018-10-28 13:37:38.477  INFO [trace1,8556870ade8f4c38,8556870ade8f4c38,false] 2423 --- [io-8201-exec-10] s.tracing1.traceController.Trace         : =====call trace-1====
# trace2應(yīng)用輸出
2018-10-28 13:37:38.584  INFO [trace2,8556870ade8f4c38,7ee6e8ed174f3b18,false] 2815 --- [nio-8202-exec-1] s.tracing2.traceController.Trace         : =====call trace-2====,Trace ID=8556870ade8f4c38,Span ID=7ee6e8ed174f3b18

.X-B3-TraceId:一條鏈路(Trace)的唯一標(biāo)識(shí)
.X-B3-SpanId:一個(gè)工作單元(Span)的唯一標(biāo)識(shí)
.X-B3-ParentSpanId:標(biāo)示當(dāng)前工作單元所屬的上一個(gè)工作單元鬓长,Root Span(請求鏈路的第一個(gè)工作單元)的該值為空谒拴。
.X-B3-Sampled:是否被抽樣輸出的標(biāo)志,1標(biāo)示需要輸出涉波,0標(biāo)示不需要
.X-Span-Name:工作單元名稱

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末英上,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子啤覆,更是在濱河造成了極大的恐慌苍日,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件城侧,死亡現(xiàn)場離奇詭異易遣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)嫌佑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門豆茫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人屋摇,你說我怎么就攤上這事揩魂。” “怎么了炮温?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵火脉,是天一觀的道長。 經(jīng)常有香客問我柒啤,道長倦挂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任担巩,我火速辦了婚禮方援,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涛癌。我一直安慰自己犯戏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布拳话。 她就那樣靜靜地躺著先匪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弃衍。 梳的紋絲不亂的頭發(fā)上呀非,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音镜盯,去河邊找鬼姜钳。 笑死坦冠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哥桥。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼激涤,長吁一口氣:“原來是場噩夢啊……” “哼拟糕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起倦踢,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬榮一對情侶失蹤送滞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后辱挥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體犁嗅,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年晤碘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了褂微。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡园爷,死狀恐怖宠蚂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情童社,我是刑警寧澤求厕,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站扰楼,受9級(jí)特大地震影響呀癣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弦赖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一项栏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腾节,春花似錦忘嫉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至劈榨,卻和暖如春访递,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背同辣。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來泰國打工拷姿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惭载,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓响巢,卻偏偏與公主長得像描滔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子踪古,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

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