分布式追蹤技術(shù):Zipkin, Sleuth 和 ELK 處理微服務(wù)分布式追蹤

本文轉(zhuǎn)載自:https://www.datawisher.cn/

什么是分布式追蹤

微服務(wù)的主要挑戰(zhàn)之一是調(diào)試問題和監(jiān)視問題的能力道伟。一個(gè)簡(jiǎn)單的操作可以觸發(fā)一系列的微服務(wù)調(diào)用,在被調(diào)用的微服務(wù)中跟蹤這些操作是非常繁瑣的。這是因?yàn)槊總€(gè)微服務(wù)都在與其他微服務(wù)隔離的環(huán)境中運(yùn)行,因此它們不會(huì)共享數(shù)據(jù)庫或日志文件等資源。除此之外赤套,我們可能還需要跟蹤為什么某個(gè)微服務(wù)調(diào)用在給定的業(yè)務(wù)流中花費(fèi)了如此多的時(shí)間。

分布式跟蹤模式解決了開發(fā)人員在構(gòu)建微服務(wù)時(shí)面臨的上述挑戰(zhàn)珊膜。在使用Spring Boot和Spring Cloud框架創(chuàng)建微服務(wù)時(shí),有一些有用的開源工具可用于分布式跟蹤宣脉。

Spring Cloud Sleuth: 一個(gè)Spring Cloud庫车柠,通過在HTTP請(qǐng)求頭文件上添加trace和span id,可以跟蹤后續(xù)微服務(wù)的進(jìn)度塑猖。該庫基于MDC(映射診斷上下文)概念竹祷,可以輕松提取放入上下文中的值并將它們顯示在日志中。

Zipkin: 基于java的分布式跟蹤應(yīng)用程序羊苟,幫助收集獨(dú)立服務(wù)之間傳播的每個(gè)請(qǐng)求的時(shí)間數(shù)據(jù)塑陵。它有一個(gè)簡(jiǎn)單的管理控制臺(tái),我們可以在其中看到后續(xù)服務(wù)生成的時(shí)間統(tǒng)計(jì)信息的可視化蜡励。

ELK棧: 三個(gè)開源工具- Elasticsearch, Logstash和Kibana組成了ELK棧令花。它們用于實(shí)時(shí)搜索阻桅、分析和可視化日志數(shù)據(jù)。Elasticsearch是一個(gè)搜索和分析引擎兼都。Logstash是一個(gè)服務(wù)器端數(shù)據(jù)處理管道嫂沉,它同時(shí)從多個(gè)源獲取數(shù)據(jù),對(duì)其進(jìn)行轉(zhuǎn)換扮碧,然后將其發(fā)送給Elasticsearch存儲(chǔ)趟章。Kibana讓我們用圖表和圖形來可視化這些數(shù)據(jù)。

如何把他們整合到一起工作

當(dāng)進(jìn)行HTTP調(diào)用時(shí)慎王,該調(diào)用被Sleuth截獲蚓土,并將必要的標(biāo)記添加到請(qǐng)求頭中。服務(wù)接收到HTTP響應(yīng)后赖淤,將數(shù)據(jù)異步發(fā)送到Zipkin蜀漆,以防止與跟蹤系統(tǒng)相關(guān)的延遲或故障延遲或破壞流。

Sleuth將兩種類型的ID添加到日志文件中漫蛔,一種稱為trace ID嗜愈,另一種稱為span ID。span ID表示基本的工作單元莽龟,例如發(fā)送HTTP請(qǐng)求蠕嫁。trace ID包含一組span ID,形成樹狀結(jié)構(gòu)毯盈。當(dāng)一個(gè)微服務(wù)調(diào)用下一個(gè)微服務(wù)時(shí)剃毒,trace ID將保持不變。

為方便起見搂赋,本例中的日志直接發(fā)布到Logstash赘阀,但是我們也可以使用Beats。Beats是一個(gè)簡(jiǎn)單的數(shù)據(jù)傳送器脑奠,它要么位于服務(wù)器上基公,要么位于容器上,監(jiān)聽日志文件的位置宋欺,然后將它們發(fā)送到Logstash進(jìn)行轉(zhuǎn)換轰豆,或發(fā)送到Elasticsearch。

安裝

1. 安裝Zipkin

curl -sSL https://zipkin.io/quickstart.sh | bash -sjava -jar zipkin.jar

通過訪問http://localhost:9411/zipkin/ 上的Zipkin web接口來驗(yàn)證設(shè)置齿诞。

2. 安裝ELK棧

在官網(wǎng)下載ELK, https://www.elastic.co/cn/start

$ bin/elasticsearch

$ bin/kibana

創(chuàng)建 logstash-microserver.conf 文件

input {
  tcp {
    port => 5044
  }
}

filter {
  json {
    source => "message"
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    manage_template => false
    index => "logstash-local"
  }
}

端口5601上啟動(dòng)Kibana酸休,在端口9200上啟動(dòng)ElasticSearch,在端口5044上啟動(dòng)LogStash祷杈。

通過訪問 http://localhost:5601 上的web控制臺(tái)來驗(yàn)證kibana設(shè)置斑司。

使用下面的curl命令驗(yàn)證Elasticsearch

curl http://localhost:9200/_cat/indices

至此,所有安裝完成但汞!

項(xiàng)目實(shí)戰(zhàn)

創(chuàng)建3個(gè)微服務(wù)

microserver-amanda(28081)

microserver-bastone (28082)

microserver-cospa (28083)

image

修改 pom.xml

添加Sleuth和Zipkin依賴, 同時(shí)添加logstashd的logback依賴宿刮。

    <!-- Zipkin and Sleuth -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-zipkin</artifactId>
    </dependency>

    <!-- 添加了Zipkin的話互站,Sleuth可以不用重復(fù)依賴了 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-sleuth</artifactId>
    </dependency>

   <!-- Dependencies for LogStash -->
   <dependency>
        <groupId>net.logstash.logback</groupId>
        <artifactId>logstash-logback-encoder</artifactId>
        <version>5.3</version>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.2.3</version>
    </dependency>

配置 application.properties

推送數(shù)據(jù)到Zipkin


# Zipkin info
spring.zipkin.base-url=http://localhost:9411/
spring.sleuth.sampler.probability=1

修改 logback.xml

推送日志到Logstash。appender使用異步TCP將運(yùn)行在端口5044上的所有日志發(fā)布到Logstash糙置。同樣云茸,Beats也可以用于將日志發(fā)送到Logstash。

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>localhost:5044</destination>
        <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <mdc/>
                <context/>
                <version/>
                <logLevel/>
                <loggerName/>
                <message/>
                <pattern>
                    <pattern>
                        {
                            "appName": "microserver-amanda"
                        }
                    </pattern>
                </pattern>
                <threadName/>
                <stackTrace/>
            </providers>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="logstash"/>
    </root>

    <logger name="org.springframework" level="INFO"/>
    <logger name="com.explore" level="INFO"/>
</configuration>

所有需要使用分布式跟蹤功能的服務(wù)谤饭,都需要按上面的就行修改配置标捺。

運(yùn)行所有服務(wù)

在kibana上創(chuàng)建index,名叫logstash-local揉抵,可通過過濾條件查看所有日志亡容。

image

zipkin顯示的鏈路追蹤圖


image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市冤今,隨后出現(xiàn)的幾起案子闺兢,更是在濱河造成了極大的恐慌,老刑警劉巖戏罢,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屋谭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡龟糕,警方通過查閱死者的電腦和手機(jī)桐磁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讲岁,“玉大人我擂,你說我怎么就攤上這事』貉蓿” “怎么了校摩?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)阶淘。 經(jīng)常有香客問我衙吩,道長(zhǎng),這世上最難降的妖魔是什么溪窒? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任坤塞,我火速辦了婚禮,結(jié)果婚禮上霉猛,老公的妹妹穿的比我還像新娘。我一直安慰自己珠闰,他們只是感情好惜浅,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伏嗜,像睡著了一般坛悉。 火紅的嫁衣襯著肌膚如雪伐厌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天裸影,我揣著相機(jī)與錄音挣轨,去河邊找鬼。 笑死轩猩,一個(gè)胖子當(dāng)著我的面吹牛卷扮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播均践,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼晤锹,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了彤委?” 一聲冷哼從身側(cè)響起鞭铆,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎焦影,沒想到半個(gè)月后车遂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斯辰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年舶担,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椒涯。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柄沮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出废岂,到底是詐尸還是另有隱情祖搓,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布湖苞,位于F島的核電站拯欧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏财骨。R本人自食惡果不足惜镐作,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望隆箩。 院中可真熱鬧该贾,春花似錦、人聲如沸捌臊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至逞力,卻和暖如春曙寡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背寇荧。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國打工举庶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人揩抡。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓户侥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親捅膘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子添祸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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