戰(zhàn):OpenTracing+Zipkin讓微服務(wù)每次請(qǐng)求清晰可見(jiàn))
nginMesh分布式追蹤實(shí)戰(zhàn)OpenTracingZipkin讓微服務(wù)每次請(qǐng)求清晰可見(jiàn)【免費(fèi)下載鏈接】nginmeshIstio compatible service mesh using NGINX項(xiàng)目地址: https://gitcode.com/gh_mirrors/ng/nginmeshnginMesh 分布式追蹤是這款 Istio 兼容服務(wù)網(wǎng)格的核心可觀測(cè)能力它把 OpenTracing 與 Zipkin 直接內(nèi)嵌到 NGINX Sidecar 代理中讓微服務(wù)的每一次請(qǐng)求都能被完整記錄、全鏈路可見(jiàn)而且業(yè)務(wù)代碼零改造。為什么微服務(wù)需要分布式追蹤一個(gè)典型的微服務(wù)應(yīng)用一次頁(yè)面請(qǐng)求往往要穿越多個(gè)服務(wù)與數(shù)據(jù)庫(kù)當(dāng)服務(wù)數(shù)量增加這次請(qǐng)求到底慢在哪一環(huán)、錯(cuò)在哪個(gè)節(jié)點(diǎn)就成了排查難題。? 分布式追蹤Distributed Tracing為此而生它為每個(gè)請(qǐng)求生成一個(gè) TraceID沿調(diào)用鏈逐跳記錄 Span最終在 Zipkin 這樣的后端匯聚成完整調(diào)用樹(shù)。傳統(tǒng)做法要求每個(gè)業(yè)務(wù)服務(wù)都接入 SDK成本高、易漏埋點(diǎn)。nginMesh 的思路是把追蹤下沉到 Sidecar 代理層由網(wǎng)格統(tǒng)一完成業(yè)務(wù)應(yīng)用完全無(wú)感。nginMesh 分布式追蹤架構(gòu)NGINX Sidecar 如何接入nginMesh 用 NGINX 替代 Envoy 作為數(shù)據(jù)面代理。每個(gè) Pod 內(nèi)運(yùn)行一個(gè) NGINX Sidecar 容器由 Go 編寫(xiě)的 Agent 負(fù)責(zé)與 Istio Pilot 通信、把負(fù)載均衡配置轉(zhuǎn)換成 NGINX 配置并熱加載數(shù)據(jù)面內(nèi)部追蹤能力由兩個(gè)動(dòng)態(tài)加載的 NGINX 模塊提供見(jiàn)istio/agent/nginx/template.go的load_module指令ngx_http_opentracing_module.soOpenTracing 埋點(diǎn)負(fù)責(zé)生成/傳播 Spanngx_http_zipkin_module.so把 Span 上報(bào)給 Zipkin Collector。nginMesh 與 Istio 控制面數(shù)據(jù)面交互架構(gòu)追蹤數(shù)據(jù)隨請(qǐng)求鏈路傳播追蹤能力從哪來(lái)三大 OpenTracing 組件Sidecar 鏡像構(gòu)建時(shí)項(xiàng)目通過(guò)istio/agent/docker-tracing/build_modules.sh完成三步編譯構(gòu)建規(guī)則集中在istio/agent/modules.mkopentracing-cppOpenTracing 官方 C 接口庫(kù)定義 Span、Tracer 等抽象zipkin-cpp-opentracingZipkin 協(xié)議的 OpenTracing 上報(bào)實(shí)現(xiàn)nginx-opentracing將上述能力封裝成 NGINX 動(dòng)態(tài)模塊編譯出兩個(gè).so文件。這套組合意味著 NGINX 側(cè)只需幾行配置就能獲得與語(yǔ)言生態(tài)無(wú)關(guān)的標(biāo)準(zhǔn)追蹤能力。追蹤配置是如何注入到 NGINX 的Agent 在生成nginx.conf時(shí)一旦檢測(cè)到網(wǎng)格開(kāi)啟了追蹤Tracing標(biāo)志就會(huì)寫(xiě)入如下關(guān)鍵配置opentracing on; zipkin_collector_host zipkin.istio-system; zipkin_collector_port 9411; zipkin_service_name productpage; # 取自應(yīng)用 Pod 的 app 標(biāo)簽同時(shí)會(huì)自動(dòng)打上一組有用的追蹤標(biāo)簽x-request-id、HTTP 協(xié)議、User-Agent、請(qǐng)求/響應(yīng)大小以及node_id。每個(gè) location 還會(huì)生成opentracing_operation_name讓 Zipkin 中的 Span 名形如host:port一眼可讀。提示--zipkinAddress參數(shù)由 Sidecar 注入模板下發(fā)模板位于istio/release/install/kubernetes/templates/nginmesh-sidecar-injector-configmap.yaml.tmpl。實(shí)戰(zhàn)3 步部署并驗(yàn)證 Zipkin 鏈路追蹤第 1 步一鍵注入 Sidecar 代理安裝 Istio 0.7.1 后執(zhí)行倉(cāng)庫(kù)提供的注入腳本install/kubernetes/install-sidecar.sh隨后為業(yè)務(wù)命名空間打上istio-injectionenabled標(biāo)簽并部署示例應(yīng)用如 Bookinfo每個(gè)業(yè)務(wù) Pod 就會(huì)自動(dòng)帶上帶追蹤能力的 NGINX Sidecar。第 2 步端口轉(zhuǎn)發(fā)訪問(wèn) Zipkin UI在istio-system命名空間部署 Zipkin 后使用項(xiàng)目自帶工具轉(zhuǎn)發(fā) 9411 端口腳本見(jiàn)istio/release/tools/zipkin-portfoward.shkubectl port-forward zipkin-pod -n istio-system 9411:9411瀏覽器打開(kāi)http://localhost:9411按服務(wù)名如productpage搜索即可看到每次請(qǐng)求跨越 details、reviews、ratings 多個(gè)服務(wù)的完整調(diào)用鏈。?第 3 步用自動(dòng)化測(cè)試驗(yàn)證追蹤項(xiàng)目?jī)?nèi)置了端到端追蹤用例istio/tests/cases/10_zipkin_spec.py它對(duì) Bookinfo 應(yīng)用發(fā)起 10 次真實(shí)請(qǐng)求再查詢 Zipkin 接口斷言返回結(jié)果中包含productpage的追蹤數(shù)據(jù)——追蹤鏈路是否真正打通跑一遍測(cè)試就知道。小結(jié)nginMesh 分布式追蹤的核心價(jià)值零業(yè)務(wù)改造追蹤由 NGINX Sidecar 統(tǒng)一完成業(yè)務(wù)代碼無(wú)需引入任何 SDK標(biāo)準(zhǔn)開(kāi)放基于 OpenTracing Zipkin不鎖定特定后端??網(wǎng)格級(jí)管理開(kāi)關(guān)與上報(bào)地址跟隨 Istio 配置下發(fā)Agent 自動(dòng)熱加載。需要留意項(xiàng)目目前適配 Istio 0.7.1僅支持 Kubernetes 環(huán)境且 TCP/gRPC 流量暫不在追蹤范圍內(nèi)適合學(xué)習(xí)與 POC 場(chǎng)景。更多 Sidecar 實(shí)現(xiàn)細(xì)節(jié)可閱讀istio/agent/README.md?!久赓M(fèi)下載鏈接】nginmeshIstio compatible service mesh using NGINX項(xiàng)目地址: https://gitcode.com/gh_mirrors/ng/nginmesh創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考