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

通過之前的N篇博文介紹辆毡,實際上我們已經(jīng)能夠通過使用它們搭建起一個基礎(chǔ)的微服務(wù)架構(gòu)系統(tǒng)來實現(xiàn)我們的業(yè)務(wù)需求了菜秦。但是,隨著業(yè)務(wù)的發(fā)展舶掖,我們的系統(tǒng)規(guī)模也會變得越來越大球昨,各微服務(wù)間的調(diào)用關(guān)系也變得越來越錯綜復(fù)雜。通常一個由客戶端發(fā)起的請求在后端系統(tǒng)中會經(jīng)過多個不同的微服務(wù)調(diào)用來協(xié)同產(chǎn)生最后的請求結(jié)果访锻,在復(fù)雜的微服務(wù)架構(gòu)系統(tǒng)中褪尝,幾乎每一個前端請求都會形成一條復(fù)雜的分布式服務(wù)調(diào)用鏈路,在每條鏈路中任何一個依賴服務(wù)出現(xiàn)延遲過高或錯誤的時候都有可能引起請求最后的失敗期犬。這時候?qū)τ诿總€請求全鏈路調(diào)用的跟蹤就變得越來越重要河哑,通過實現(xiàn)對請求調(diào)用的跟蹤可以幫助我們快速的發(fā)現(xiàn)錯誤根源以及監(jiān)控分析每條請求鏈路上的性能瓶頸等好處。

針對上面所述的分布式服務(wù)跟蹤問題龟虎,Spring Cloud Sleuth提供了一套完整的解決方案璃谨。在本章中,我們將詳細介紹如何使用Spring Cloud Sleuth來為我們的微服務(wù)架構(gòu)增加分布式服務(wù)跟蹤的能力。

快速入門

在介紹各種概念與原理之前佳吞,我們先通過實現(xiàn)一個簡單的示例拱雏,對存在服務(wù)調(diào)用的應(yīng)用增加一些sleuth的配置實現(xiàn)基本的服務(wù)跟蹤功能,以此來對Spring Cloud Sleuth有一個初步的了解底扳,隨后再逐步展開介紹實現(xiàn)過程中的各個細節(jié)部分铸抑。

準備工作

在引入Sleuth之前,我們先按照之前章節(jié)學(xué)習(xí)的內(nèi)容來做一些準備工作衷模,構(gòu)建一些基礎(chǔ)的設(shè)施和應(yīng)用:

  • 服務(wù)注冊中心:eureka-server鹊汛,這里不做贅述,直接使用之前構(gòu)建的工程阱冶〉蟊铮或者直接使用我的公益eureka注冊中心,下面的例子使用該注冊中心木蹬。

  • 微服務(wù)應(yīng)用:trace-1至耻,實現(xiàn)一個REST接口/trace-1,調(diào)用該接口后將觸發(fā)對trace-2應(yīng)用的調(diào)用镊叁。具體實現(xiàn)如下:

    • 創(chuàng)建一個基礎(chǔ)的Spring Boot應(yīng)用尘颓,在pom.xml中增加下面依賴:
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.10.RELEASE</version>
    <relativePath/> 
</parent>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<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)用主類,并實現(xiàn)/trace-1接口意系,并使用RestTemplate調(diào)用trace-2應(yīng)用的接口泥耀。具體如下:
@RestController
@EnableDiscoveryClient
@SpringBootApplication
public class TraceApplication {

    private final Logger logger = Logger.getLogger(getClass());

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @RequestMapping(value = "/trace-1", method = RequestMethod.GET)
    public String trace() {
        logger.info("===call trace-1===");
        return restTemplate().getForEntity("http://trace-2/trace-2", String.class).getBody();
    }

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

}
  • application.properties中將eureka.client.serviceUrl.defaultZone參數(shù)指向eureka-server的地址饺汹,具體如下:
spring.application.name=trace-1
server.port=9101

eureka.client.serviceUrl.defaultZone=http://eureka.didispace.com/eureka/
  • 微服務(wù)應(yīng)用:trace-2蛔添,實現(xiàn)一個REST接口/trace-2,供trace-1調(diào)用兜辞。具體實現(xiàn)如下:

    • 創(chuàng)建一個基礎(chǔ)的Spring Boot應(yīng)用迎瞧,pom.xml中的依賴與trace-1相同

    • 創(chuàng)建應(yīng)用主類,并實現(xiàn)/trace-2接口逸吵,具體實現(xiàn)如下:

@RestController
@EnableDiscoveryClient
@SpringBootApplication
public class TraceApplication {

    private final Logger logger = Logger.getLogger(getClass());

    @RequestMapping(value = "/trace-2", method = RequestMethod.GET)
    public String trace() {
        logger.info("===<call trace-2>===");
        return "Trace";
    }

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

}
  • application.properties中將eureka.client.serviceUrl.defaultZone參數(shù)指向eureka-server的地址凶硅,另外還需要設(shè)置不同的應(yīng)用名和端口號扫皱,具體如下:
spring.application.name=trace-2
server.port=9102
eureka.client.serviceUrl.defaultZone=http://eureka.didispace.com/eureka/

在實現(xiàn)了上面內(nèi)容之后足绅,我們可以將eureka-servertrace-1韩脑、trace-2三個應(yīng)用都啟動起來氢妈,并通過postman或curl等工具來對trace-1的接口發(fā)送請求http://localhost:9101/trace-1,我們可以得到返回值Trace段多,同時還能在它們的控制臺中分別獲得下面的輸出:

-- trace-1
INFO 25272 --- [nio-9101-exec-2] ication$$EnhancerBySpringCGLIB$$36e12c68 : ===<call trace-1>===

-- trace-2
INFO 7136 --- [nio-9102-exec-1] ication$$EnhancerBySpringCGLIB$$52a02f0b : ===<call trace-2>===

實現(xiàn)跟蹤

在完成了準備工作之后首量,接下來我們開始進行本章的主題內(nèi)容,為上面的trace-1trace-2來添加服務(wù)跟蹤功能。通過Spring Cloud Sleuth的封裝加缘,我們?yōu)閼?yīng)用增加服務(wù)跟蹤能力的操作非常簡單鸭叙,只需要在trace-1trace-2pom.xml依賴管理中增加spring-cloud-starter-sleuth依賴即可,具體如下:

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

到這里拣宏,實際上我們已經(jīng)為trace-1trace-2實現(xiàn)服務(wù)跟蹤做好了基礎(chǔ)的準備沈贝,重啟trace-1trace-2后,再對trace-1的接口發(fā)送請求http://localhost:9101/trace-1勋乾。此時缀程,我們可以從它們的控制臺輸出中,窺探到sleuth的一些端倪市俊。

-- trace-1
INFO [trace-1,f410ab57afd5c145,a9f2118fa2019684,false] 25028 --- [nio-9101-exec-1] ication$$EnhancerBySpringCGLIB$$d8228493 : ===<call trace-1>===

-- trace-2
INFO [trace-2,f410ab57afd5c145,e9a377dc2268bc29,false] 23112 --- [nio-9102-exec-1] ication$$EnhancerBySpringCGLIB$$e6cb4078 : ===<call trace-2>===

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

  • 第一個值:trace-1撩满,它記錄了應(yīng)用的名稱,也就是application.propertiesspring.application.name參數(shù)配置的屬性绅你。
  • 第二個值:f410ab57afd5c145伺帘,Spring Cloud Sleuth生成的一個ID,稱為Trace ID忌锯,它用來標識一條請求鏈路伪嫁。一條請求鏈路中包含一個Trace ID,多個Span ID偶垮。
  • 第三個值:a9f2118fa2019684张咳,Spring Cloud Sleuth生成的另外一個ID,稱為Span ID似舵,它表示一個基本的工作單元脚猾,比如:發(fā)送一個HTTP請求。
  • 第四個值:false砚哗,表示是否要將該信息輸出到Zipkin等服務(wù)中來收集和展示龙助。

上面四個值中的Trace IDSpan ID是Spring Cloud Sleuth實現(xiàn)分布式服務(wù)跟蹤的核心。在一次服務(wù)請求鏈路的調(diào)用過程中蛛芥,會保持并傳遞同一個Trace ID提鸟,從而將整個分布于不同微服務(wù)進程中的請求跟蹤信息串聯(lián)起來,以上面輸出內(nèi)容為例仅淑,trace-1trace-2同屬于一個前端服務(wù)請求來源称勋,所以他們的Trace ID是相同的,處于同一條請求鏈路中漓糙。

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

本文完整示例:

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

如果您對這些感興趣铣缠,歡迎star、follow、收藏蝗蛙、轉(zhuǎn)發(fā)給予支持蝇庭!

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哮内,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子壮韭,更是在濱河造成了極大的恐慌北发,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喷屋,死亡現(xiàn)場離奇詭異琳拨,居然都是意外死亡,警方通過查閱死者的電腦和手機屯曹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門狱庇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人恶耽,你說我怎么就攤上這事密任。” “怎么了偷俭?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵浪讳,是天一觀的道長。 經(jīng)常有香客問我涌萤,道長淹遵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任形葬,我火速辦了婚禮合呐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘笙以。我一直安慰自己,他們只是感情好冻辩,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布猖腕。 她就那樣靜靜地躺著,像睡著了一般恨闪。 火紅的嫁衣襯著肌膚如雪倘感。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天咙咽,我揣著相機與錄音老玛,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛蜡豹,可吹牛的內(nèi)容都是我干的麸粮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼镜廉,長吁一口氣:“原來是場噩夢啊……” “哼弄诲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起娇唯,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤齐遵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后塔插,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梗摇,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年想许,在試婚紗的時候發(fā)現(xiàn)自己被綠了留美。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡伸刃,死狀恐怖谎砾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捧颅,我是刑警寧澤景图,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站碉哑,受9級特大地震影響挚币,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扣典,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一妆毕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贮尖,春花似錦笛粘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至关斜,卻和暖如春示括,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背痢畜。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工垛膝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鳍侣,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓吼拥,卻偏偏與公主長得像倚聚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子扔罪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

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