<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          鏈路追蹤自從用了SkyWalking,睡的真香!

          共 8047字,需瀏覽 17分鐘

           ·

          2021-11-26 20:11

          ?

          ?本篇文章介紹鏈路追蹤的另外一種解決方案Skywalking,文章目錄如下:


          什么是Skywalking?

          skywalking是一個(gè)優(yōu)秀的國產(chǎn)開源框架2015年由個(gè)人吳晟(華為開發(fā)者)開源 , 2017年加入Apache孵化器。短短兩年就被Apache收入麾下,實(shí)力可見一斑。
          skywalking支持dubbo,SpringCloud,SpringBoot集成,代碼無侵入,通信方式采用GRPC,性能較好,實(shí)現(xiàn)方式是java探針,支持告警,支持JVM監(jiān)控,支持全局調(diào)用統(tǒng)計(jì)等等,功能較完善。

          Skywalking和Spring Cloud Sleuth+ZipKin如何選型?

          Skywalking相比于zipkin還是有很大的優(yōu)勢的,如下:
          • skywalking采用字節(jié)碼增強(qiáng)的技術(shù)實(shí)現(xiàn)代碼無侵入,zipKin代碼侵入性比較高
          • skywalking功能比較豐富,報(bào)表統(tǒng)計(jì),UI界面更加人性化
          個(gè)人建議:如果是新的架構(gòu),建議優(yōu)先選擇skywalking。

          Skywalking架構(gòu)是怎樣的?

          skywalking和zipkin一樣,也分為服務(wù)端和客戶端,服務(wù)端負(fù)責(zé)收集日志數(shù)據(jù)并且展示,架構(gòu)如下:
          上述架構(gòu)圖中主要分為四個(gè)部分,如下:
          • 上面的Agent:負(fù)責(zé)收集日志數(shù)據(jù),并且傳遞給中間的OAP服務(wù)器
          • 中間的OAP:負(fù)責(zé)接收 Agent 發(fā)送的 Tracing 和Metric的數(shù)據(jù)信息,然后進(jìn)行分析(Analysis Core) ,存儲(chǔ)到外部存儲(chǔ)器( Storage ),最終提供查詢( Query )功能。
          • 左面的UI:負(fù)責(zé)提供web控制臺(tái),查看鏈路,查看各種指標(biāo),性能等等。
          • 右面Storage:負(fù)責(zé)數(shù)據(jù)的存儲(chǔ),支持多種存儲(chǔ)類型。
          看了架構(gòu)圖之后,思路很清晰了,Agent負(fù)責(zé)收集日志傳輸數(shù)據(jù),通過GRPC的方式傳遞給OAP進(jìn)行分析并且存儲(chǔ)到數(shù)據(jù)庫中,最終通過UI界面將分析的統(tǒng)計(jì)報(bào)表、服務(wù)依賴、拓?fù)潢P(guān)系圖展示出來。

          服務(wù)端如何搭建?

          skywalking同樣是通過jar包方式啟動(dòng),需要下載jar包,地址:https://skywalking.apache.org/downloads/

          1、下載安裝包

          選擇V8.7.0這個(gè)版本,如下圖:
          可以按照自己的需要選擇其他版本
          解壓之后完整目錄如下圖:
          重要的目錄結(jié)構(gòu)分析如下:
          • agent:客戶端需要指定的目錄,其中有一個(gè)jar,就是負(fù)責(zé)和客戶端整合收集日志
          • bin:服務(wù)端啟動(dòng)的腳本
          • config:一些配置文件的目錄
          • logs:oap服務(wù)的日志目錄
          • oap-libs:oap所需的依賴目錄
          • webapp:UI服務(wù)的目錄

          2、配置修改

          啟動(dòng)之前需要對配置文件做一些修改,修改如下:
          1、/config/application.yml
          這個(gè)是oap服務(wù)的配置文件,需要修改注冊中心為nacos,如下圖:
          配置①:修改默認(rèn)注冊中心選擇nacos,這樣就不用在啟動(dòng)參數(shù)中指定了。
          配置②:修改nacos的相關(guān)配置,由于我是本地的,則不用改動(dòng),根據(jù)自己情況修改。
          2、webapp/webapp.yml
          這個(gè)是UI服務(wù)的配置文件,其中有一個(gè)server.port配置,是UI服務(wù)的端口,默認(rèn)8080,我將其改成8888,避免端口沖突,如下圖:

          3、啟動(dòng)服務(wù)

          啟動(dòng)命令在/bin目錄下,這里需要啟動(dòng)兩個(gè)服務(wù),如下:
          • oap服務(wù):對應(yīng)的啟動(dòng)腳本oapService.bat,Linux下對應(yīng)的后綴是sh
          • UI服務(wù):對應(yīng)的啟動(dòng)腳本webappService.bat,Linux下對應(yīng)的后綴是sh
          當(dāng)然還有一個(gè)startup.bat啟動(dòng)文件,可以直接啟動(dòng)上述兩個(gè)服務(wù),我們可以直接使用這個(gè)腳本,直接雙擊,將會(huì)彈出兩個(gè)窗口則表示啟動(dòng)成功,如下圖:
          此時(shí)直接訪問:http://localhost:8888/,直接進(jìn)入U(xiǎn)I端,如下圖:

          客戶端如何搭建?

          客戶端也就是單個(gè)微服務(wù),由于Skywalking采用字節(jié)碼增強(qiáng)技術(shù),因此對于微服務(wù)無代碼侵入,只要是普通的微服務(wù)即可,不需要引入什么依賴。
          還是上一篇Spring Cloud Sleuth的三個(gè)服務(wù),如下:
          • skywalking-product1001:商品微服務(wù)
          • skywalking-order1002:訂單微服務(wù)
          • skywalking-gateway1003:網(wǎng)關(guān)微服務(wù)
          案例源碼已經(jīng)上傳,關(guān)注公眾號(hào):碼猿技術(shù)專欄,回復(fù)關(guān)鍵詞 9528獲取!
          案例源碼結(jié)構(gòu)目錄如下圖:
          想要傳輸數(shù)據(jù)必須借助skywalking提供的agent,只需要在啟動(dòng)參數(shù)指定即可,命令如下:

          -javaagent:E:\springcloud\apache-skywalking-apm-es7-8.7.0\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
          -Dskywalking.agent.service_name=skywalking-product-service
          -Dskywalking.collector.backend_service=127.0.0.1:11800

          上述命令解析如下:
          • -javaagent:指定skywalking中的agent中的skywalking-agent.jar的路徑
          • -Dskywalking.agent.service_name:指定在skywalking中的服務(wù)名稱,一般是微服務(wù)的spring.application.name
          • -Dskywalking.collector.backend_service:指定oap服務(wù)綁定的地址,由于這里是本地,并且oap服務(wù)默認(rèn)的端口是11800,因此只需要配置為127.0.0.1:11800
          上述參數(shù)可以在命令行通過java -jar xxx指定,在IDEA中操作如下圖:
          上述三個(gè)微服務(wù)都需要配置skywalking的啟動(dòng)配置,配置成功后正常啟動(dòng)即可。
          注意:agent的jar包路徑不能包含中文,不能有空格,否則運(yùn)行不成功。
          成功啟動(dòng)后,直接通過網(wǎng)關(guān)訪問:http://localhost:1003/order/get/12,返回如下信息:
          此時(shí)查看skywalking的UI端,可以看到三個(gè)服務(wù)已經(jīng)監(jiān)控成功了,如下圖:
          服務(wù)之前的依賴關(guān)系也是可以很清楚的看到,如下圖:
          請求鏈路的信息也是能夠很清楚的看到,比如請求的url,執(zhí)行時(shí)間、調(diào)用的服務(wù),如下圖:
          感覺怎樣?是不是很高端,比zipkin的功能更加豐富。

          數(shù)據(jù)如何持久化?

          你會(huì)發(fā)現(xiàn)只要服務(wù)端重啟之后,這些鏈路追蹤數(shù)據(jù)將會(huì)丟失了,因?yàn)閟kywalking默認(rèn)持久化的方式是存儲(chǔ)在內(nèi)存中。
          當(dāng)然這里也是可以通過插拔方式的替換掉存儲(chǔ)中間件,企業(yè)中往往是使用ES存儲(chǔ),這章介紹一下MySQL的方式存儲(chǔ)。

          1、修改配置文件

          修改config/application.yml文件中的存儲(chǔ)方式,總共需要修改兩處地方。
          • 修改默認(rèn)的存儲(chǔ)方式為mysql,如下圖:
          • 修改Mysql相關(guān)的信息,比如用戶名、密碼等,如下圖:

          2、添加MySQL的jdbc依賴

          默認(rèn)的oap中是沒有jdbc驅(qū)動(dòng)依賴,因此需要我們手動(dòng)添加一下,只需要將驅(qū)動(dòng)的jar放在oap-libs文件夾中,如下圖:
          好了,已經(jīng)配置完成,啟動(dòng)服務(wù)端,在skywalking這個(gè)數(shù)據(jù)庫中將會(huì)自動(dòng)創(chuàng)建表,如下圖:
          這里就不再測試了,自己耍耍吧.......

          日志監(jiān)控如何做?

          在skywalking的UI端有一個(gè)日志的模塊,用于收集客戶端的日志,默認(rèn)是沒有數(shù)據(jù)的,那么需要如何將日志數(shù)據(jù)傳輸?shù)絪kywalking中呢?
          日志框架的種類很多,比較出名的有l(wèi)og4j,logback,log4j2,就以logback為例子介紹一下如何配置,官方文檔如下:
          • log4j:https://skywalking.apache.org/docs/skywalking-java/v8.8.0/en/setup/service-agent/java-agent/application-toolkit-log4j-1.x/
          • log4j2:https://skywalking.apache.org/docs/skywalking-java/v8.8.0/en/setup/service-agent/java-agent/application-toolkit-log4j-2.x/
          • logback:https://skywalking.apache.org/docs/skywalking-java/v8.8.0/en/setup/service-agent/java-agent/application-toolkit-logback-1.x/

          1、添加依賴

          根據(jù)官方文檔,需要先添加依賴,如下:

          <dependency>
             <groupId>org.apache.skywalking</groupId>
             <artifactId>apm-toolkit-logback-1.x</artifactId>
             <version>${project.release.version}</version>
          </dependency>

          2、添加配置文件

          新建一個(gè)logback-spring.xml放在resource目錄下,配置如下圖:
          以上配置全部都是拷貝官方文檔的
          配置完成之后,啟動(dòng)服務(wù),訪問:http://localhost:1003/order/get/12。
          控制臺(tái)打印的日志如下圖:
          可以看到已經(jīng)打印出了traceId。
          skywalking中的日志模塊輸出的日志如下圖:
          日志已經(jīng)傳輸?shù)搅藄kywalking中..............
          注意:如果agentoap服務(wù)不在同一臺(tái)服務(wù)器上,需要在/agent/config/agent.config配置文件末尾添加如下配置:

          plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:10.10.10.1}
          plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}
          plugin.toolkit.log.grpc.reporter.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760}
          plugin.toolkit.log.grpc.reporter.upstream_timeout=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}

          配置分析如下圖:

          性能剖析如何做?

          skywalking在性能剖析方面真的是非常強(qiáng)大,提供到基于堆棧的分析結(jié)果,能夠讓運(yùn)維人員一眼定位到問題。
          新建一個(gè)/order/list接口,如下:
          上述代碼中休眠了2秒,看看如何在skywalking中定位這個(gè)問題。
          在性能剖析模塊->新建任務(wù)->選擇服務(wù)、填寫端點(diǎn)、監(jiān)控時(shí)間,操作如下圖:
          上圖中選擇了最大采樣數(shù)為5,則直接訪問5次:http://localhost:1003/order/list,然后選擇這個(gè)任務(wù)將會(huì)出現(xiàn)監(jiān)控到的數(shù)據(jù),如下圖:
          上圖中可以看到{GET}/order/list這個(gè)接口上耗費(fèi)了2秒以上,因此選擇這個(gè)接口點(diǎn)擊分析,可以看到詳細(xì)的堆棧信息,如下圖:
          如何定位到睡眠2秒鐘的那一行代碼呢?直接往下翻,如下圖:
          是不是很清楚了,在OrderController這個(gè)接口線程睡眠了兩秒........

          監(jiān)控告警如何做?

          對于服務(wù)的異常信息,比如接口有較長延遲,skywalking也做出了告警功能,如下圖:
          skywalking中有一些默認(rèn)的告警規(guī)則,如下:
          • 最近3分鐘內(nèi)服務(wù)的平均響應(yīng)時(shí)間超過1秒
          • 最近2分鐘服務(wù)成功率低于80%
          • 最近3分鐘90%服務(wù)響應(yīng)時(shí)間超過1秒
          • 最近2分鐘內(nèi)服務(wù)實(shí)例的平均響應(yīng)時(shí)間超過1秒
          當(dāng)然除了以上四種,隨著Skywalking不斷迭代也會(huì)新增其他規(guī)則,這些規(guī)則的配置在config/alarm-settings.yml配置文件中,如下圖:
          每個(gè)規(guī)則都由相同的屬性組成,這些屬性的含義如下圖:
          如果想要調(diào)整默認(rèn)的規(guī)則,比如監(jiān)控返回的信息,監(jiān)控的參數(shù)等等,只需要改動(dòng)上述配置文件中的參數(shù)即可。
          當(dāng)然除了以上默認(rèn)的幾種規(guī)則,skywalking還適配了一些鉤子(webhooks)。其實(shí)就是相當(dāng)于一個(gè)回調(diào),一旦觸發(fā)了上述規(guī)則告警,skywalking則會(huì)調(diào)用配置的webhook,這樣開發(fā)者就可以定制一些處理方法,比如發(fā)送郵件微信釘釘通知運(yùn)維人員處理。
          當(dāng)然這個(gè)鉤子也是有些規(guī)則的,如下:
          • POST請求
          • application/json 接收數(shù)據(jù)
          • 接收的參數(shù)必須是AlarmMessage中指定的參數(shù)。
          注意:AlarmMessage這個(gè)類隨著skywalking版本的迭代可能出現(xiàn)不同,一定要到對應(yīng)版本源碼中去找到這個(gè)類,拷貝其中的屬性。這個(gè)類在源碼的路徑:org.apache.skywalking.oap.server.core.alarm,如下圖:
          新建一個(gè)告警模塊:skywalking-alarm1004,其中利用webhook定義一個(gè)接口,如下:
          接口定制完成后,只需要在config/alarm-settings.yml配置文件中添加這個(gè)鉤子,如下圖:
          好了,這就已經(jīng)配置完成了,測試也很簡單,還是調(diào)用上面案例中的睡眠兩秒的接口:http://localhost:1003/order/list,多調(diào)用幾次,則會(huì)觸發(fā)告警,控制臺(tái)打印日志如下:

          總結(jié)

          本篇文章介紹了鏈路追蹤解決方案Skywalking,主要講解了服務(wù)端搭建、客戶端搭建、數(shù)據(jù)持久化、日志監(jiān)控、性能剖析這幾個(gè)知識(shí)點(diǎn),每個(gè)知識(shí)點(diǎn)都非常重要。

          有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)

          歡迎大家關(guān)注Java之道公眾號(hào)


          好文章,我在看??

          瀏覽 58
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产对白国语对白 | 国产 日韩 欧美视频 | 豆花视频国产一区 | 操一操夜夜 | 日美一级AV |