自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

分布式鏈路追蹤,要怎么玩下?

開(kāi)發(fā) 前端 分布式
在具體介紹分布式鏈路追蹤系統(tǒng)之前,我們首先需要理解下什么是鏈路追蹤?在本專(zhuān)欄前面關(guān)于監(jiān)控系統(tǒng)的介紹中可以知道,監(jiān)控系統(tǒng)的觀(guān)測(cè)數(shù)據(jù)主要來(lái)源于統(tǒng)計(jì)指標(biāo)、日志以及鏈路追蹤這三個(gè)方面。而這些數(shù)據(jù)從類(lèi)型上又可以劃分為兩種:請(qǐng)求級(jí)別、聚合級(jí)別。

 

本文轉(zhuǎn)載自微信公眾號(hào)「無(wú)敵碼農(nóng)」,作者無(wú)敵碼農(nóng) 。轉(zhuǎn)載本文請(qǐng)聯(lián)系無(wú)敵碼農(nóng)公眾號(hào)。

2021年我將調(diào)整好心態(tài)持續(xù)給大家輸出有價(jià)值的技術(shù)干貨。在接下來(lái)的一段時(shí)間我所撰寫(xiě)的技術(shù)內(nèi)容將偏向于“云原生”技術(shù)相關(guān)的內(nèi)容,主要會(huì)涉及Devops、Kubernetes、Service Mesh等內(nèi)容。而之所以偏向于寫(xiě)這些內(nèi)容,一方面是自己的興趣,另一方面也是最近幾年以Kubernetes為基礎(chǔ)設(shè)施的“云原生”技術(shù)體系已經(jīng)成為主流,作為一名研發(fā)人員如果只專(zhuān)注于業(yè)務(wù)代碼的研發(fā),而對(duì)程序運(yùn)行的基礎(chǔ)環(huán)境、架構(gòu)體系缺乏足夠的認(rèn)識(shí)和了解,也是不利于成長(zhǎng)和進(jìn)階的!

當(dāng)然,我也會(huì)持續(xù)分享編程技術(shù)相關(guān)的干貨內(nèi)容,例如有用的編程技巧、以及程序語(yǔ)言(如Java并發(fā)編程、I/O、網(wǎng)絡(luò)等)相關(guān)的技術(shù),但有一點(diǎn)我將盡量減少去寫(xiě)一些市面上已經(jīng)被寫(xiě)爛、重復(fù)N次的技術(shù)內(nèi)容、以及各種雞湯文!以免浪費(fèi)大家時(shí)間!

好了,廢話(huà)不多說(shuō)!本篇文章我將給大家介紹“分布式鏈路追蹤”的內(nèi)容,對(duì)于目前大部分采用微服務(wù)架構(gòu)的公司來(lái)說(shuō),分布式鏈路追蹤都是必備的,無(wú)論它是傳統(tǒng)微服務(wù)體系亦或是新一代Service Mesh的微服務(wù)架構(gòu)!而具體介紹的內(nèi)容,本文不是完全講理論,而是希望從理論到實(shí)踐,引導(dǎo)大家去操作,因?yàn)橹挥羞@樣才能真正從技術(shù)層面有深刻的認(rèn)識(shí)和了解!

分布式鏈路追蹤概述

在具體介紹分布式鏈路追蹤系統(tǒng)之前,我們首先需要理解下什么是鏈路追蹤?在本專(zhuān)欄前面關(guān)于監(jiān)控系統(tǒng)的介紹中可以知道,監(jiān)控系統(tǒng)的觀(guān)測(cè)數(shù)據(jù)主要來(lái)源于統(tǒng)計(jì)指標(biāo)、日志以及鏈路追蹤這三個(gè)方面。而這些數(shù)據(jù)從類(lèi)型上又可以劃分為兩種:請(qǐng)求級(jí)別、聚合級(jí)別。

請(qǐng)求級(jí)別的數(shù)據(jù)主要來(lái)源于真實(shí)的請(qǐng)求,例如一次HTTP調(diào)用、RPC調(diào)用等,本文要介紹的鏈路追蹤就是這種類(lèi)型。而聚合級(jí)別則是接口請(qǐng)求的度量指標(biāo)或者一些參數(shù)數(shù)據(jù)的聚合,如QPS、CPU使用率等數(shù)值。日志和統(tǒng)計(jì)指標(biāo)數(shù)據(jù)既可以是請(qǐng)求級(jí)別,也可以是聚合級(jí)別,因?yàn)樗鼈兛赡軄?lái)自源于真實(shí)的請(qǐng)求,也可能是系統(tǒng)自身診斷時(shí)記錄下來(lái)的信息。

而對(duì)于鏈路追蹤來(lái)說(shuō),它主要的邏輯就是將請(qǐng)求鏈路的完整行為記錄下來(lái),以便可以通過(guò)可視化的形式實(shí)現(xiàn)鏈路查詢(xún)、性能分析、依賴(lài)關(guān)系、拓?fù)鋱D等分布式鏈路追蹤相關(guān)的功能。如下圖所示:

在上圖中假設(shè)微服務(wù)系統(tǒng)中的一次接口調(diào)用總共有兩個(gè)微服務(wù)參與,其調(diào)用關(guān)系分別是A->B->C,其中B服務(wù)還與Redis這樣的第三方服務(wù)產(chǎn)生了調(diào)用關(guān)系、C服務(wù)則還需要調(diào)用MySQL數(shù)據(jù)庫(kù)服務(wù)。所以實(shí)際上鏈路追蹤所做的事情就是詳細(xì)記錄A->B(B->Redis)->C(C->MySQL)這條完整鏈路上的詳細(xì)調(diào)用信息,例如接口響應(yīng)結(jié)果、耗時(shí)等。

那么這條調(diào)用鏈路上的數(shù)據(jù)到底是怎樣被記錄的呢?接下來(lái)我們繼續(xù)以上面的調(diào)用鏈為例分析下鏈路追蹤信息的具體組成和傳遞形式,以便進(jìn)一步理解分布式鏈路追蹤系統(tǒng)的原理和概念。具體邏輯示意圖如下:

如上圖所示,分布式鏈路追蹤所監(jiān)控的對(duì)象就是一次次調(diào)用所產(chǎn)生的鏈路,圖中1-8所示的就是一條完整的鏈路(Trace),系統(tǒng)會(huì)通過(guò)唯一的標(biāo)識(shí)(TraceId)對(duì)此進(jìn)行記錄。而鏈路中的每一個(gè)依賴(lài)調(diào)用都會(huì)生成一個(gè)調(diào)用蹤跡信息(Span),最開(kāi)始生成的Span叫做根Span(Root Span),后續(xù)生成的Span都會(huì)將前一個(gè)Span 的標(biāo)示(Sid)作為本Span信息的父ID(Pid)。

這樣以此類(lèi)推,Span信息就會(huì)隨著鏈路的執(zhí)行被進(jìn)程內(nèi)或跨進(jìn)程進(jìn)行上下文傳遞,通過(guò)Span數(shù)據(jù)鏈就能將一次次鏈路調(diào)用所產(chǎn)生的蹤跡信息串聯(lián)起來(lái),而每一個(gè)Span之上附著的日志信息(Annotation)就是我們進(jìn)行調(diào)用鏈監(jiān)控分析的數(shù)據(jù)來(lái)源。這就是分布式鏈路追蹤的基本原理。

而說(shuō)到這里,你可能會(huì)有疑問(wèn):監(jiān)控這么大的數(shù)據(jù)量,是不是會(huì)很消耗系統(tǒng)資源?的確如此,所以大部分鏈路追蹤系統(tǒng),都會(huì)存在一個(gè)叫做采樣率(Sampling)的設(shè)定,用來(lái)控制系統(tǒng)采集鏈路信息的比例,從而提升系統(tǒng)性能。因?yàn)楹芏鄷r(shí)候,大量的鏈路信息都是相同的,我們需要關(guān)注的可能也只是相對(duì)耗時(shí)較高、出錯(cuò)次數(shù)較多的鏈路,而并沒(méi)有必要100%的進(jìn)行采集。

SkyWalking簡(jiǎn)介

前面我們從基本原理的角度說(shuō)明了鏈路追蹤是什么,那么接下來(lái)我們將介紹下目前最流行的分布式鏈路追蹤系統(tǒng)——SkyWalking。

SkyWalking是一款優(yōu)秀的開(kāi)源APM(Application Performance Management)系統(tǒng),它不僅提供了鏈路追蹤,鏈路分析等分布式追蹤功能,還支持性能指標(biāo)分析、應(yīng)用和服務(wù)依賴(lài)性分析、服務(wù)拓?fù)鋱D分析、報(bào)警等一系列應(yīng)用性能監(jiān)控相關(guān)的功能,可以幫助我們有效地定位問(wèn)題。

而從數(shù)據(jù)收集上看,SkyWalking支持多種不同的數(shù)據(jù)來(lái)源及格式,包括支持Java、.NET Core、NodeJS、PHP和Python等不同語(yǔ)言的無(wú)侵入式Agent探針,以及對(duì)Service Mesh(服務(wù)網(wǎng)格)架構(gòu)的支持等。其具體結(jié)構(gòu)如下圖所示:

如上圖所示,SkyWalking的核心由鏈路收集服務(wù)器(Receiver Cluster)、聚合服務(wù)器(AggregatorCluster)組成。其中Receiver Cluster是整個(gè)后端服務(wù)接入的入口,專(zhuān)門(mén)用于收集服務(wù)的各種指標(biāo)及鏈路信息。

而AggregatorCluster則用于匯總、聚合收集器收集到的數(shù)據(jù),并最終將聚合數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)中,而具體存儲(chǔ)方式可以有多種,例如常見(jiàn)的ElasticSearch、MySQL、TIDB等,我們可以根據(jù)實(shí)際需要進(jìn)行選擇。這些聚合數(shù)據(jù)后面可以用于告警設(shè)置,也可以被GUI/CLI等可視化系統(tǒng)以HTTP的形式訪(fǎng)問(wèn)后進(jìn)行可視化展示。

此外,從數(shù)據(jù)采集邏輯上看,SkyWalking支持多種語(yǔ)言探針及項(xiàng)目協(xié)議,能夠覆蓋目前大部分主流的分布式技術(shù)棧,具體來(lái)說(shuō)主要有以下3種:

  • Metrics System:統(tǒng)計(jì)系統(tǒng)。支持直接從Prometheus中拉取度量指標(biāo)數(shù)據(jù)到SkyWalking,也支持程序自身通過(guò)micrometer推送數(shù)據(jù);
  • Agents:業(yè)務(wù)探針。指在各個(gè)業(yè)務(wù)系統(tǒng)中集成探針?lè)?wù)來(lái)進(jìn)行鏈路追蹤,即鏈路數(shù)據(jù)采集。SkyWalking支持Java、Go、.NET、PHP、NodeJS、Python、Nginx LUA等多種語(yǔ)言的探針。此外,它還支持通過(guò)gRPC或者HTTP的方式來(lái)傳遞數(shù)據(jù);
  • Service Mesh:SkyWalking還支持對(duì)新一代微服務(wù)架構(gòu)Service Mesh的監(jiān)控,可以通過(guò)特定的Service Mesh協(xié)議采集數(shù)據(jù)面、控制面的數(shù)據(jù),實(shí)現(xiàn)對(duì)服務(wù)網(wǎng)格鏈路數(shù)據(jù)的觀(guān)測(cè);

上面的內(nèi)容簡(jiǎn)單介紹了SkyWalking的基本情況,并就其系統(tǒng)架構(gòu)進(jìn)行了簡(jiǎn)單分析。實(shí)際上SkyWalking最近兩年發(fā)展得非???,社區(qū)也非?;钴S,在微服務(wù)鏈路追蹤、應(yīng)用性能監(jiān)控領(lǐng)域被使用得也越來(lái)越廣泛,由于篇幅原因,這里無(wú)法進(jìn)行更深入的分享,感興趣的讀者可以通過(guò)官方文檔或社區(qū)進(jìn)行深入了解!

SkyWalking安裝部署

前面的內(nèi)容分別介紹了分布式鏈路追蹤的基本原理,并著重介紹了SkyWalking!很顯然,寫(xiě)到這里就結(jié)束的話(huà),本文就沒(méi)有啥價(jià)值了,因?yàn)橹皇钦f(shuō)了一堆正確的廢話(huà),看了也就忘了!這顯然也不符合我分享的風(fēng)格,接下來(lái)我們就從實(shí)驗(yàn)的角度來(lái)玩一下SkyWalking。

以下內(nèi)容需要進(jìn)行實(shí)際實(shí)驗(yàn)操作,如果在地鐵上不方便可以先收藏,有時(shí)間再具體實(shí)驗(yàn)玩下!

對(duì)于SkyWalking的部署主要涉及到后端OAP Server和前端UI,根據(jù)實(shí)際需要可以將它們部署在物理機(jī)、虛擬機(jī)或者Kubernetes集群之中。這里為了演示環(huán)境的一致性,我們選擇將SkyWalking的后端服務(wù)及UI分別部署到Kubernetes集群中。

而具體安裝SkyWalking的方式可以通過(guò)官方提供的Kubernetes部署文件采用Helm方式安裝,也可以手動(dòng)編寫(xiě)Kubernetes部署文件,這里為了便于學(xué)習(xí),我們采用后一種方式。具體步驟如下:

1)、在Kubernetes集群中創(chuàng)建一個(gè)單獨(dú)運(yùn)行SkyWalking容器的Namespace。命令如下:

  1. #通過(guò)kubectl連接Kubernetes集群后執(zhí)行,創(chuàng)建namespace命令 
  2. $ kubectl create ns skywalking 

命令執(zhí)行完成后,可以查看Namespace是否創(chuàng)建成功,命令如下:

  1. #查看namespace創(chuàng)建情況 
  2. $ kubectl get ns 
  3. NAME                   STATUS   AGE 
  4. default                Active   10d 
  5. kube-node-lease        Active   10d 
  6. kube-public            Active   10d 
  7. kube-system            Active   10d 
  8. kubernetes-dashboard   Active   10d 
  9. skywalking             Active   46s 

可以看到此時(shí)skywalking空間已經(jīng)成功創(chuàng)建!

2)、編寫(xiě)SkyWalking-UI及OAP Server服務(wù)Kubernetes部署文件

在編寫(xiě)具體的Kubernetes部署文件的過(guò)程中需要指定SkyWalking-UI及OAP Server的容器鏡像,一般來(lái)說(shuō)可以通過(guò)源碼手動(dòng)打包也可以直接使用官方已經(jīng)打包好的鏡像。這里為了方便演示,采用Docker官方鏡像倉(cāng)庫(kù)中已經(jīng)打包好的鏡像。具體如圖所示:

如果上面兩張圖所示,我們分別在Docker Hub官方鏡像倉(cāng)庫(kù)中找到了SkyWalking-UI及OAP Server的官方發(fā)布的容器鏡像版本,接下來(lái)編寫(xiě)具體的部署文件。

編寫(xiě)SkyWalking服務(wù)端Kubernetes部署文件(skywalking-aop.yml),具體內(nèi)容如下:

  1. apiVersion: apps/v1 
  2. kind: Deployment 
  3. metadata: 
  4.   name: oap 
  5.   namespace: skywalking 
  6. spec: 
  7.   replicas: 1 
  8.   selector: 
  9.     matchLabels: 
  10.       app: oap 
  11.       release: skywalking 
  12.   template: 
  13.     metadata: 
  14.       labels: 
  15.         app: oap 
  16.         release: skywalking 
  17.     spec: 
  18.       containers: 
  19.         - name: oap 
  20.           #指定OAP Server容器鏡像及版本信息 
  21.           image: apache/skywalking-oap-server:8.3.0-es7 
  22.           imagePullPolicy: IfNotPresent 
  23.           ports: 
  24.             - containerPort: 11800 
  25.               name: grpc 
  26.             - containerPort: 12800 
  27.               name: rest 
  28. --- 
  29. apiVersion: v1 
  30. kind: Service 
  31. metadata: 
  32.   name: oap 
  33.   namespace: skywalking 
  34.   labels: 
  35.     service: oap 
  36. spec: 
  37.   ports: 
  38.     #restful端口 
  39.     - port: 12800 
  40. name: rest 
  41.      #rpc端口 
  42.     - port: 11800 
  43.       name: grpc 
  44.     - port: 1234 
  45.       name: page 
  46.   selector: 
  47.     app: oap 

以上是一個(gè)標(biāo)準(zhǔn)的Kubernetes部署文件,關(guān)于文件中相關(guān)指令的具體含義可查閱Kubernetes相關(guān)的資料。

編寫(xiě)SkyWalking-UI部署文件(skywalking-ui.yml),具體內(nèi)容如下:

  1. apiVersion: apps/v1 
  2. kind: Deployment 
  3. metadata: 
  4.   name: ui-deployment 
  5.   namespace: skywalking 
  6.   labels: 
  7.     app: ui 
  8. spec: 
  9.   replicas: 1 
  10.   selector: 
  11.     matchLabels: 
  12.       app: ui 
  13.   template: 
  14.     metadata: 
  15.       labels: 
  16.         app: ui 
  17.     spec: 
  18.       containers: 
  19.         - name: ui 
  20.           image: apache/skywalking-ui:8.3.0 
  21.           ports: 
  22.             - containerPort: 8080 
  23.               name: page 
  24.           env: 
  25.             - name: SW_OAP_ADDRESS 
  26.               value: oap:12800 
  27. --- 
  28. apiVersion: v1 
  29. kind: Service 
  30. metadata: 
  31.   name: ui 
  32.   namespace: skywalking 
  33.   labels: 
  34.     service: ui 
  35. spec: 
  36.   ports: 
  37.     - port: 8080 
  38.       name: page 
  39.       nodePort: 31234 
  40.   type: NodePort 
  41.   selector: 
  42.     app: ui 

3)、根據(jù)編寫(xiě)的部署文件,執(zhí)行Kubernetes部署命令

根據(jù)前面步驟中編寫(xiě)的Kubernetes發(fā)布文件,這里我們根據(jù)編寫(xiě)的發(fā)布文件直接執(zhí)行部署命令,具體如下:

  1. #進(jìn)入發(fā)布文件的存儲(chǔ)目錄,直接一次性執(zhí)行全部文件部署命令 
  2. $ kubectl apply -f . 
  3. deployment.apps/oap created 
  4. service/oap created 
  5. deployment.apps/ui-deployment created 
  6. service/ui created 

執(zhí)行完成后通過(guò)命令查看具體部署的情況,命令如下:

  1. #查看skywalking空間中的Pod、Service對(duì)象的運(yùn)行情況 
  2. $ kubectl get all -n skywalking 
  3. NAME                                 READY   STATUS    RESTARTS   AGE 
  4. pod/oap-5f6d6bc4f6-k4mvv             1/1     Running   0          36h 
  5. pod/ui-deployment-868c66449d-fffrt   1/1     Running   0          36h 
  6.  
  7. NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                        AGE 
  8. service/oap   ClusterIP   10.110.112.244   <none>        12800/TCP,11800/TCP,1234/TCP   36h 
  9. service/ui    NodePort    10.100.154.93    <none>        8080:31234/TCP                 36h 
  10.  
  11. NAME                            READY   UP-TO-DATE   AVAILABLE   AGE 
  12. deployment.apps/oap             1/1     1            1           36h 
  13. deployment.apps/ui-deployment   1/1     1            1           36h 
  14.  
  15. NAME                                       DESIRED   CURRENT   READY   AGE 
  16. replicaset.apps/oap-5f6d6bc4f6             1         1         1       36h 
  17. replicaset.apps/ui-deployment-868c66449d   1         1         1       36h 

可以看到部署的SkyWalking服務(wù)都已經(jīng)正常運(yùn)行!如果是第一次部署,拉取鏡像的過(guò)程可能會(huì)比較慢一點(diǎn)。如果在部署過(guò)程中存在問(wèn)題,也可以查看Pod對(duì)象的運(yùn)行日志,例如:

  1. #可以查看aop的啟動(dòng)日志 
  2. $ kubectl logs pod/oap-5f6d6bc4f6-k4mvv -n skywalking 

4)、查看SkyWalking-UI的Web訪(fǎng)問(wèn)地址

經(jīng)過(guò)上述步驟,我們已經(jīng)成功將SkyWalking-UI、OAP Server兩個(gè)服務(wù)運(yùn)行在Kubernetes集群之中。接下來(lái)通過(guò)SkyWalking-UI服務(wù)的映射端口(k8s部署文件中定義是31234端口)訪(fǎng)問(wèn)Web UI,具體可通過(guò)http://NodeIP:31234進(jìn)行訪(fǎng)問(wèn),例如:

  1. #這里的IP為Kubernetes集群向外暴露的節(jié)點(diǎn)入口IP 
  2. http://10.211.55.12:31234/  

如果不知道Kubernetes集群節(jié)點(diǎn)入口IP地址,可以通過(guò)以下命令進(jìn)行查看:

  1. #查詢(xún)SkyWalking-UI所部署的Kubernetes集群Node節(jié)點(diǎn)的IP地址 
  2. $ kubectl describe node kubernetes 
  3. Name:               kubernetes 
  4. Roles:              master 
  5. ... 
  6. Addresses: 
  7.   InternalIP:  10.211.55.12 
  8.   Hostname:    kubernetes 
  9. ... 

訪(fǎng)問(wèn)后的界面顯示效果如下圖所示:

如上圖所示,此時(shí)可以看到SkyWalking已成功運(yùn)行,由于尚無(wú)服務(wù)接入所以暫時(shí)還看不到有任何監(jiān)控?cái)?shù)據(jù)!

后記

如前面所述內(nèi)容我們已經(jīng)在Kubernetes環(huán)境中將分布式鏈路追蹤系統(tǒng)部署成功了,如果在實(shí)驗(yàn)過(guò)程中沒(méi)有K8s環(huán)境的話(huà),可以參考本專(zhuān)欄相關(guān)文章,哪里我介紹了多種方式來(lái)安裝部署Kubernetes。

另外由于還沒(méi)有服務(wù)接入所以暫時(shí)還看不到任何鏈路追蹤數(shù)據(jù),但是由于篇幅的原因這里就不繼續(xù)介紹如何將Java微服務(wù)接入SkyWalking了,但是這個(gè)這個(gè)接入過(guò)程卻是非常有意思的,因?yàn)樗俏覀冏鳛檠邪l(fā)人員,進(jìn)一步理解微服務(wù)程序與分布式鏈路追蹤系統(tǒng)集成、交互的關(guān)鍵!這部分我將作為續(xù)集在下一篇文章中給大家分享,時(shí)間不會(huì)太久,期待大家保持關(guān)注!

 

責(zé)任編輯:武曉燕 來(lái)源: 無(wú)敵碼農(nóng)
相關(guān)推薦

2024-06-07 13:04:31

2020-12-16 09:24:18

Skywalking分布式鏈路追蹤

2024-01-26 07:49:49

Go分布式鏈路

2024-08-21 08:09:17

2020-09-11 09:44:04

微服務(wù)分布式鏈路

2023-11-21 08:25:09

2024-07-09 08:11:56

2024-11-28 08:57:21

分布式鏈路Skywalking

2021-11-08 14:10:37

分布式Spring鏈路

2022-11-26 09:49:07

分布式鏈路追蹤技術(shù)

2022-08-05 10:03:17

分布式微服務(wù)

2023-10-26 00:00:00

分布式系統(tǒng)定位

2024-10-24 08:51:19

分布式鏈路項(xiàng)目

2022-05-23 08:23:24

鏈路追蹤SleuthSpring

2018-10-28 17:54:00

分布式事務(wù)數(shù)據(jù)

2020-05-26 11:59:30

日志鏈路微服務(wù)架構(gòu)

2011-09-13 14:21:00

IRF交換機(jī)基礎(chǔ)分布式鏈路聚合

2022-09-25 22:19:24

Dapr分布式追蹤

2025-03-11 14:16:09

2022-05-25 08:23:32

ZipKinTwitter開(kāi)源項(xiàng)目
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)