通过Dapr实现一个简单的基于.net的微服务电商系统(八)——一步一步教你如何撸Dapr之链路追踪
Dapr提供了一些開箱即用的分布式鏈路追蹤解決方案,今天我們來講一講如何通過dapr的configuration來實現(xiàn)非侵入式鏈路追蹤的
目錄:
一、通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)
二、通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(二)——通訊框架講解
三、通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(三)——一步一步教你如何擼Dapr
四、通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(四)——一步一步教你如何擼Dapr之訂閱發(fā)布
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(五)——一步一步教你如何擼Dapr之狀態(tài)管理
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(六)——一步一步教你如何擼Dapr之Actor服務(wù)
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(七)——一步一步教你如何擼Dapr之服務(wù)限流
附錄:(如果你覺得對你有用,請給個star)
一、電商Demo地址:https://github.com/sd797994/Oxygen-Dapr.EshopSample
二、通訊框架地址:https://github.com/sd797994/Oxygen-Dapr
首先依然簡單聊聊什么是鏈路追蹤以及我們?yōu)槭裁葱枰?知道鏈路追蹤的同學可以跳過。在傳統(tǒng)的單體應用中,我們的每一次請求往往在同一個進程中被一次性處理。而在分布式系統(tǒng)中,我們需要通過不同容器隔離甚至物理機隔離的服務(wù)間協(xié)同作業(yè)來實現(xiàn)某些業(yè)務(wù),同時由于業(yè)務(wù)流轉(zhuǎn)會涉及到接口調(diào)用、事件訂閱、狀態(tài)讀寫、actor調(diào)用等等情況,往往想要追蹤它們形成一個鏈式調(diào)用的記錄會比較困難。這里舉一個例子,某分布式系統(tǒng)集群運行在生產(chǎn)環(huán)境上,某日收到預警某接口調(diào)用非常緩慢。這個時候開發(fā)人員排查發(fā)現(xiàn)該聚合網(wǎng)關(guān)接口調(diào)用了服務(wù)A、B、C但是不知道具體是哪個服務(wù)導致的緩慢,通知A、B、C對應的開發(fā)組人員通過本地調(diào)試發(fā)現(xiàn)A、B、調(diào)用正常,C緩慢,但是C發(fā)現(xiàn)并非由于自身業(yè)務(wù)邏輯緩慢,而是自己調(diào)用D時返回比較緩慢,這時又只得通知D負責的團隊進行業(yè)務(wù)排查,最終D發(fā)現(xiàn)自己的代碼問題,然后逐一修復并發(fā)布到生產(chǎn)環(huán)境解決該問題。這個例子比較極端哈,這里僅舉個例子說明。鏈路追蹤系統(tǒng)就是幫助分布式系統(tǒng)在鏈路調(diào)用時記錄每一個接口的響應時間以及自己依賴的下游接口的響應時間并提供可視化UI方便開發(fā)運維團隊快速排查接口調(diào)用耗時異常定位問題。
傳統(tǒng)的鏈路追蹤一般是通過代碼侵入式的方式由開發(fā)人員集成SDK插入代理,應用上線運行后這些代理即可自動化監(jiān)視我們的應用進程記錄流量流入、流出請求/響應時間并統(tǒng)一上報到鏈路追蹤系統(tǒng),而service mesh由于sidecar的存在可以確保流量在流入/流出應用時一定會經(jīng)過sidecar,所以天生更容易實現(xiàn)鏈路追蹤,從而免于讓開發(fā)人員人工通過SDK的方式去集成一個分布式鏈路追蹤系統(tǒng),接下來就講講我們在dapr下如何來實現(xiàn)它。
首先我們需要在k8s環(huán)境跑起來一個鏈路追蹤系統(tǒng),大家可以看看這里:https://docs.dapr.io/operations/monitoring/tracing/supported-tracing-backends/ 是目前dapr支持的鏈路后端,我這里就選型我比較熟悉的zipkin來實現(xiàn)。zip在k8s中很容易跑起來,這是yaml:
---
apiVersion: apps/v1 kind: Deployment metadata:name: zipkin spec:selector:matchLabels:app: zipkinreplicas: 1template:metadata:labels:app: zipkinspec:containers:- name: zipkinimage: openzipkin/zipkin:latestimagePullPolicy: IfNotPresentports:- containerPort: 9411env:- name: TZvalue: "Asia/Shanghai" --- apiVersion: v1 kind: Service metadata:name: zipkin spec:type: NodePortselector:app: zipkinports:- protocol: TCPport: 9411targetPort: 9411由于需要在本地訪問zip的website,我這里偷懶直接將nodeport暴露到本地k8s集群,方便等會兒通過瀏覽器訪問。現(xiàn)在我們apply一下,稍微等待一段時間k8s拉取鏡像并運行起來后,通過kubectl get svc 查詢zipkin暴露的隨機端口即可通過localhost:nodeport訪問到zipkin的界面:
?
? 接下來就比較簡單了,我們創(chuàng)建一個類型為configuration的配置文件,并注入到每一個需要追蹤的服務(wù)即可,其中samplingRate是指采樣率,而endpointAddress是指我們在k8s集群內(nèi)通過svc能訪問到的zipkin的地址(如果你的zipkin部署在非本集群,則可通過ip or 網(wǎng)址的方式訪問):
apiVersion: dapr.io/v1alpha1 kind: Configuration metadata:name: zipkin spec:metric:enabled: truetracing:samplingRate: "1"zipkin:endpointAddress: "http://zipkin.infrastructure.svc.cluster.local:9411/api/v2/spans"接著我們將這個configuration注入到我們需要的服務(wù)中,這里我們直接看電商demo yaml文件賬戶服務(wù)的情況(紅字部分):
apiVersion: apps/v1 kind: Deployment metadata:name: accountservicenamespace: dapreshoplabels:app: accountservice spec: replicas: 1selector:matchLabels:app: accountserviceminReadySeconds: 5 strategy: type: RollingUpdate rollingUpdate:maxUnavailable: 1 maxSurge: 1template: metadata:labels: app: accountserviceversion: v1annotations:dapr.io/enabled: "true"dapr.io/app-id: "accountservice"dapr.io/app-port: "80"dapr.io/config: "zipkin"spec:containers:- name: webimage: accountservice:releaseimagePullPolicy: NeverreadinessProbe:httpGet:path: v1.0/healthzport: 3500initialDelaySeconds: 5periodSeconds: 10timeoutSeconds : 5failureThreshold : 3ports:- containerPort: 80現(xiàn)在我們來下單看看,訪問admin.dapreshop.com:30882,初始化系統(tǒng)后,訪問m.dapreshop.com:30882,下單一次。接著打開我們的zipkin,查詢run query即可看到最新一條鏈路追蹤記錄如下:
?
? 可以看到鏈路追蹤的root是我們的apigateway,因為客戶端請求是從這里被聚合的。接著apigateway會調(diào)用商品服務(wù)、交易服務(wù)、用戶服務(wù)、以及作業(yè)系統(tǒng)。這里我們再看看我們的代碼看看createorder明細:
?
? 這個用例服務(wù)會調(diào)用用戶服務(wù)獲取一個mockaccount模擬用戶用于下單,接著會調(diào)用一個創(chuàng)建訂單的領(lǐng)域服務(wù)用于下單這里會調(diào)用商品的actor服務(wù)用于原子減扣庫存(此部分可參考之前的actor文章),下單完成后會發(fā)送一個訂單創(chuàng)建成功事件,由作業(yè)系統(tǒng)訂閱并等待5分鐘后進行未支付訂單取消操作,整個下單流程如下:
?
? 整個流程相對比較簡單,通過在daprd sidecar上申明了zipkin configuration后 daprd會忠實的將我們的請求轉(zhuǎn)化為鏈路追蹤記錄并上報zipkin,我們點開zipkin那條記錄查看明細如下:
?
? 可以非常清楚的看到我們的訂單創(chuàng)建調(diào)用的賬戶服務(wù)的mockaccount接口,然后調(diào)用了商品服務(wù)的商品信息接口,接著調(diào)用數(shù)個商品actor進行庫存減扣,最終持久化我們的訂單后發(fā)起一個事件并且成功的被作業(yè)系統(tǒng)訂閱。每一個接口請求了多少時間被清楚的記錄了下來,這樣在生產(chǎn)環(huán)境下就很容易排除慢接口的問題而不用像上面提到的那樣各個團隊忙的焦頭爛額了
dapr目前還提供了其他的一些鏈路追蹤客戶端,但是整體大的流程基本如本文所述,今天的分享就到這里,希望大家多多支持dapr,多多轉(zhuǎn)發(fā)fork+star。下一次我們將分享一下如何集成一個第三方的oauth授權(quán)服務(wù)來實現(xiàn)oauth。
相關(guān)文章:
Dapr能否引領(lǐng)云原生中間件的未來?
云原生 | 阿里巴巴的Dapr實踐與探索
Dapr | 云原生的抽象與實現(xiàn)
Dapr 可視化指南
Dapr 知多少 | 分布式應用運行時
Dapr 正式發(fā)布 1.0
Dapr 交通流量控制示例
Dapr是如何簡化微服務(wù)的開發(fā)和部署
微軟開源微服務(wù)運行時Dapr,賦能云原生應用開發(fā)
YARP實現(xiàn)Dapr服務(wù)調(diào)用的反向代理
Dapr微服務(wù)應用開發(fā)系列0:概述
Dapr微服務(wù)應用開發(fā)系列1:環(huán)境配置
Dapr微服務(wù)應用開發(fā)系列2:Hello World與SDK初接觸
Dapr微服務(wù)應用開發(fā)系列3:服務(wù)調(diào)用構(gòu)件塊
Dapr微服務(wù)應用開發(fā)系列4:狀態(tài)管理構(gòu)件塊
Dapr微服務(wù)應用開發(fā)系列5:發(fā)布訂閱構(gòu)建塊
Windows環(huán)境下Dapr入門
云原生 | .NET 5 with Dapr 初體驗
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(二)——通訊框架講解
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(三)——一步一步教你如何擼Dapr
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(四)——一步一步教你如何擼Dapr之訂閱發(fā)布
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(五)——一步一步教你如何擼Dapr之狀態(tài)管理
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(六)——一步一步教你如何擼Dapr之Actor服務(wù)
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(七)——一步一步教你如何擼Dapr之服務(wù)限流
總結(jié)
以上是生活随笔為你收集整理的通过Dapr实现一个简单的基于.net的微服务电商系统(八)——一步一步教你如何撸Dapr之链路追踪的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Microsoft宣布将停止支持多个 .
- 下一篇: java信息管理系统总结_java实现科