導航:首頁 > 源碼編譯 > zipkin客戶端源碼

zipkin客戶端源碼

發布時間:2023-03-20 04:28:31

A. Dubbo filter擴展

filter其實是一種責任鏈模式,每個filter只負責完成自己職責的部分,解銷前前除耦合,這種設計模式很利於擴展。
大家可能對Dubbo的filter不太熟悉,但是應該都寫過Servlet的filter,讓我們先來回顧一下Servlet的Filter:

我們重寫doFilter,在chain.doFilter(request, response) 前後做一些切面的工作,比如防XSS攻擊、CROS跨域請求處理、記錄相關日誌等,調用邏輯可以用下圖來概括:

類似於Servlet中的filter,Dubbo也可以通過擴展filter來增強功能,Dubbo服務提供方和服務消費方均支持調用過程攔截,並且Dubbo 自身的大多功能均基於此擴展點實現,下面例舉部分filter:
EchoFilter -> 用於provider的回聲測試,檢測服務是否正常
ContextFilter -> 用於provider接收RpcContext的參數
ConsumerContextFilter -> 用於consumer傳遞RpcContext的參數
ExecuteLimitFilter -> 用於provider的限流
ActiveLimitFilter -> 用於consumer的限流
ExceptionFilter -> 用於provider對異常進行封裝
GenericFilter -> 用於provider的泛化調用,可用於集成通用服務測試框架或為其他語言調用服務提供Restful介面的支持
AccessLogFilter -> 用於provider 的access log記錄
ClassLoaderFilter -> 用於provider切換當前的ClassLoader
MonitorFilter -> 用於bbo monitor模塊對consumer和provider進行監控

Dubbo filter的調用邏輯可以用下圖來概括:

那麼Dubbo是怎麼將多個filter串起來的呢?
答案就位於ProtocolFilterWrapper這個類的buildInvokerChain方法。

看明白這里首先要理解Dubbo的SPI擴展點機制,List<Filter> filters = ExtensionLoader.getExtensionLoader(Filter.class).getActivateExtension(invoker.getUrl(), key, group);這一行是獲取Filter介面的所有被標注為@Activate的擴展點,然後基於回調讓前一個filter調用後一個filter從而串成一個調用鏈,調用的先後順序是由每個filter定義的order屬性決定的(不聲明默認為0),order值越小則調用優先順序越高。

了解了Dubbo filter的作用和原理,那讓我們來看看如何擴展:
Maven 項目結構:

src
  |-main
    |-java
      |-com
        |-xxx
           |-XxxFilter.java (實現Filter介面)

Dubbo自身的過濾器配置都放在resources/META-INF/bbo/internal下,我們擴展的過濾器一版放在resources/META-INF/bbo/下:
     |-resources
      |-META-INF
        |-bbo
          |-com.alibaba.bbo.rpc.Filter (純文本文件,內容為:xxx=com.xxx.XxxFilter)

XxxFilter.java:

META-INF/bbo/com.alibaba.bbo.rpc.Filter:

xxx=com.xxx.XxxFilter

我司生產虧清環境中利用Dubbo filter擴展來記錄服務調用日誌和服務調用鏈追蹤。

1.服務調用日誌記錄:
服務調用日悔棗志記錄分為provider日誌和consumer日誌兩部分,provider日誌記錄的是當前工程作為provider的服務提供日誌,consumer日誌記錄的是當前工程作為consumer的服務消費日誌,以下是部分consumer日誌內容:

日誌會記錄每一次調用的consumer的ip、埠、調用時間、provider的ip、埠、介面請求的時間、調用的方法、調用耗時、調用結果(成功或失敗,失敗則列印異常)、方法入參(可選)、返回值(可選)等。
由於每次調用的入參和返回值的內容比較多,所以方法入參和返回值是否列印都是可以配置的,filter會根據當前配置的日誌等級去列印。

2.調用鏈追蹤:
Dubbo Filter結合brave + zipkin實現RPC調用鏈追蹤和梳理項目間的依賴關系,filter中用brave向zipkin伺服器非同步發送http請求(也可以用kafka),zipkin伺服器對數據進行分析匯總,很容易分析出性能的瓶頸在哪,效果如下:

如果有人對這些具體實現感興趣,筆者會開放源碼

最後提醒一點,filter的實現中不要寫太耗時的方法,會影響性能。

B. 手把手教你學Dapr - 4. 服務調用

通過使用服務調用,您的應用程序可以使用標準的gRPC或HTTP協議與其他應用程序可靠、安全地通信。

先問幾個問題:

此時你會發現這些事情HttpClientFactory沒有幫你完成,而在微服務中這些又是必不可少的能力,接下來看看服務調用都做了什麼

先看一下兩個服務之間的調用順序

默認情況下,調用同一個命名空間的其他服務可以直接使用AppID(假設是:nodeapp)

服務調用也支持跨命名空間調用,在所有受支持的宿主平台上,Dapr AppID遵循FQDN格式,其中包括目標命名空間。

比如調用命名空間:proction,AppID:nodeapp

這在K8s集群中的跨名稱空間調用中特別有用

通過託管平台上的相互(mTLS)身份驗證,包括通過Dapr Sentry服務的自動證書轉移,可以確保Dapr應用程序之間的所有調用的安全。 下圖顯示了自託管應用程序的情況。

應用程序可以控制哪些其他應用程序可以調用它們,以及通過訪問策略授權它們做什麼。 這使您能夠限制具有個人信息的敏感應用程序不被未經授權的應用程序訪問,並結合服務到服務的安全通信,提供了軟吵啟多租戶部署。

在調用失敗和瞬態錯誤的情況下,服務調用執行自動重試,並在回退時間段內執行。

註: 自動重試,默認是開啟的,可以關。但如果不關且業務又不支持冪等是很危險的。建議服務的介面要設計支持冪等,這在微服務里也是一個標配的選擇。

Dapr可以在各種託管平台上運行。 為了啟用服務發現和服務調用,Dapr使用可插拔的名稱解析組件。 例如,K8s名稱解析組件使用K8s DNS服務來解析集群中運行的其他應用程序的位置。 自託管機器可以使用mDNS名稱解析組件。 Consul名稱解析組件可以激李在任何託管環境中使用,包括K8s或自託管環境

一圖勝千言,就使用mDNS輪著調用

默認情況下,將跟蹤應用程序之間的所有調用,並收集指標,以提供應用程序明碰遲的洞察力和診斷,這在生產場景中尤其重要。 這為您提供了服務之間調用的調用圖和指標。

pythonapp 通過Dapr sidecar調用nodeapp,通過服務調用的API及gRPC代理依然是上面見到的那個調用流程,做到了語言無關

創建 ASP.NET Core空 項目,並修改 launchSettings.json ,讓啟動HTTP的啟動埠變為5000

修改 Program.cs 文件

此時一共有4個服務

運行 Assignment.Server :在目錄 dapr-study-roomAssignment04Assignment.Server 打開命令行工具,並執行下面命令

調用服務:再打開一個新的命令行工具,並執行下面命令

可以發現4個命令都調用成功了,但是 Assignment.Server 輸出結果有點意外

是的,沒有 Hello World1! ,那怎麼辦呢?我們把Hello1的命令改一下

invoke調用的輸出除了 App invoked successfully 以外還多了一行 Hello World1!

與此同時 Assignment.Server 的輸出正確了

除此之外 invoke 還有一些參數,比如 --data , --data-file ,喜歡研究Dapr CLI的小夥伴可以繼續嘗試。不過一般情況下用SDK就可以了

創建 控制台應用程序 項目,使用NuGet包管理器添加 Dapr.Client SDK,並修改 Program.cs 文件

看幾個細節

註:

使用命令行工具打開目錄 dapr-study-roomAssignment04Assignment.Client ,然後執行命令

如果你不是用VS Code終端的PowerShell執行dapr run就可能遇到下面的錯誤

即便你沒有遇到也建議了解一下如何支持非默認埠

因為上面使用dapr run的時候沒有指定dapr http port,而默認client訪問的是3500埠

解決的辦法有兩種:

再執行一次 dotnet run 就可以看到正確的輸出結果了

篇幅太長了,舉一反三吧。就是調用 InvokeMethodGrpcAsync ,然後dapr-http-port換成dapr-grpc-port,DAPR_HTTP_PORT換成DAPR_GRPC_PORT

還記得dapr init的時候docker里有個zipkin吧,通過zipkin可以看一下調用跟蹤,通過瀏覽器打開下面地址

此時頁面是空的

根據步驟操作一下就可以看到了

隨便點開一行數據尾部的SHOW,就可以看到調用詳情

Assignment04

https://github.com/doddgu/dapr-study-room

我們的目標是 自由的 、 易用的 、 可塑性強的 、 功能豐富的 、 健壯的 。

所以我們借鑒Building blocks的設計理念,正在做一個新的框架 MASA Framework ,它有哪些特點呢?

目前源碼已開始同步到Github(文檔站點在規劃中,會慢慢完善起來):

MASA.BuildingBlocks

MASA.Contrib

MASA.Utils

MASA.EShop

BlazorComponent

MASA.Blazor

QQ群:7424099

微信群:加技術運營微信(MasaStackTechOps),備注來意,邀請進群

C. SpringBoot&SpringCloud升級踩坑

最近遇到了一個項目,需求是升級springboot版本。項目用到了很多組件,redis、Apollo、zipkin以及SpringCloud的一套組件。升級過程踩了很多坑,我把自己遇到的問題整理了一下供大家學習交流。

SpringBoot 1.4.2 ——> 2.3.2
SpringCloud 1.3.1 ——>Hoxton.SR6
jedis 2.8.2 ——>3.3.0
Zipkin的版本仍然使用11.2.0.4的,沒有做升級
Apollo-client也沒有做升級,使用的是1.6.0的版本

首先,確保SpringBoot和SpringCloud版本對應起來。
在SpringBoot2.x之後的SpringCloud的依賴有一些變化
SpringBoot2.x之前

SpringBoot2.x之後

SpringCloud獲取eureka實例的參數改變了
升級前:

升級後:

我們可以看到源碼上注釋說,這兩個方法在3.0之後肆此不用了。如果我們自己寫了dataSource就需要友清做出相應的修改。
jedis3.0之前的實現方式

jedis之後我們的實現方式

可能是spring熱部署的配置沒有關好雹前閉

如果之前的項目沒有這個問題,那我們加一個配置把重復的bean覆蓋掉就好了

D. Zipkin介紹和使用

Zipkin是一個分布式鏈路跟蹤系統,可以採集時序數據來協助定位延遲等相關問題。數據可以念配神存儲在cassandra,MySQL,ES,mem中。分布式鏈路跟蹤是個老話題,國內也有類似的框仔虧架,比如阿里的skywalking。 zipkin目前和SpringCloud生態結合緊密,有相關的支持。

主要包括客戶端和一個管理服務端。在客戶端採集數據後,發送給服務端,用來展示數據。在每個instrumented的客戶端,寫入了traceId,然後統一收集數據在服務端存儲。這里instrumented翻譯過來是儀器化,設備化,為了簡單我把他稱作 標識實體 ,代表一個接入了zipkin的客戶端。

zipkin包括四個組件,collector,storage,search,webUI。其中collector中重點有兩個

zipkin可以跟蹤多種請求,如async方法,schele,rxjava等,都在 org.springframework.cloud.sleuth.instrument 包下,這里以web請求做介紹。在SpringCloud下用sleuth來做跟蹤處理。具體通過一個攔截器 org.springframework.cloud.sleuth.instrument.web.TraceHandlerInterceptor 實現,如下

zipkin支持mem,MySQL,ES存儲方式,以 io.zipkin.java:zipkin-server:2.6.1 為例,可以通過配置實現。具體配置項可以在 zipkin-server-shared.yaml 中查看,如下:

同時,舉例用MySQL作為存儲時的一張span對象表,如下:

一般來說,分布式的鏈路跟蹤賣慎數據是比較大量的,建議採用ES來存儲,方便支持分區,以及後期的擴展等,比如使用某些欄位來存儲非結構化數據。

以上就是所有內容,下面是一個請求和記錄展示。

E. spring cloud sleuth 和 zipkin 鏈路跟蹤

提供鏈路追蹤。通過sleuth可以很清楚的看出一個請求都經過了哪些服務;可以很方便的理清服務間的調用關系。

可視化錯誤。對於程序未捕捉的異常,可以結合zipkin分析。

分析耗時。通過sleuth可以很方便的看出每個采樣請高畝陵求的耗時,分析出哪些服務調用比較耗時。當服務調用的耗時隨著請求量的增大而增大時,也可以對服務的擴容提供一定的提醒作用。

從官網得知 從2.1.0版開始,Spring Cloud Sleuth支持將跟蹤發送到多個跟蹤系統,且去掉了 spring cloud streaming,那如果只引入sleuth包,不同機器服務之間相互調用是否還能實現鏈路追蹤?經過測試耐族答案是可以的,源碼這里我沒研究,但是從技術角度要自己實現,其實只要在 header 里添加一個值(唯一),在上下游服務之間傳遞,便可行。

所以結論是如果只是單純為了使用鏈路追蹤在控制台看,只引入 sleuth 是已經足夠的。

Zipkin是Twitter的一個開源項目,我們可以使用它來收集各個伺服器上請求鏈路的跟蹤數據,並通過它提供的API介面來輔助查詢跟蹤數據以分布式系統的監控程序,通過UI組件幫助我們及時發現系統中出現的延遲升高問題以及系統性能瓶頸根源。

Collector(收集器組件)-> 主要負責收集外部系統跟蹤信息,轉化為Zipkin內部的Span格式。

Storage(存儲組件)-> 主要負責收到的跟蹤信息的存儲,默認為存儲在內存中,同時支持存儲到Mysql、Cassandra以及ElasticSearch。

API(Query)-> 負責查詢Storage中存儲的數據,提供簡單的JSON API獲取數據,主要提供給web UI使用。

Web UI(展示組件)-> 提供簡單的web界面,方便進行跟蹤信息的查看以及查詢,同時進行相關的戚戚分析。

Instrumented Client 和Instrumented Server,是指分布式架構中使用了Trace工具的兩個應用,Client會調用Server提供的服務,兩者都會向Zipkin上報Trace相關信息。在Client 和 Server通過Transport上報Trace信息後,由Zipkin的Collector模塊接收,並由Storage模塊將數據存儲在對應的存儲介質中,然後Zipkin提供API供UI界面查詢Trace跟蹤信息。Non-Instrumented Server,指的是未使用Trace工具的Server,顯然它不會上報Trace信息。

bff-web-data-platform 稱為 appname -> 應用名稱

368e435f7de29eff 稱為 traceId -> 為了追蹤一個請求完整的流轉過程,可以給每次請求分配一個唯一的 traceId,當請求調用其他服務時,通過傳遞這個 traceId。

368e435f7de29eff 稱為 spanId -> 發生的特定操作的ID

false 稱為 exportable -> 是否應將日誌導出到Zipkin。

無論是使用 sleuth 或是使用 zipkin 都會在控制台上輸出這樣的日誌信息。

借鑒博客
2.1以下版本中文文檔,可以借鑒

F. 分布式鏈路跟蹤sleuth(zipkin+kafka+elasticsearch)

sleuth也不是一個新鮮的東西,說白了就是一個APM的一個濃縮版,spring Cloud Sleuth為 spring Cloud提供了分布式跟蹤的解決方案,埋慧它大量借用了Google Dapper、 Twitter Zipkin和 Apache HTrace的設計

構建了ELK的日誌系統和監控系統這兩個能夠快速的發現系統中的問題,但是由於微服務架構中系統眾多,系統之間的交互還比較復雜,在產生了大量的日誌之後,可以幫助我們定位問題,但是在緊急情況下難以幫助我們快速,是快速的定位和解決問題,這個就調用鏈的設計初衷,在微服務中,調用鏈比較長的時候,如果出現問題,很容易出現踢皮球的情況,這種情況下,打開調用鏈,一看,誰的就是誰的不說不鬧,多好。
市面上比較常見的APM有:pinpoint,Twitter的zipkin,美團的Cat,Google的Dapper,這里值得表揚美團,繼續和金服的pk吧,最牛的還是Google,他發表了一篇Dapper就有好多公司去研究,最終形成自己的產品,不由的讓我想起他的GFS,bigTable在大數據前期google為大數據所做的貢獻,向慷慨的人致敬,懂得分享的人最可愛,嗯,對···進入正題

簡單說一下調用鏈的東西TraceID 鏈路ID 在整個調用鏈中這個東西是不變的
SpanId 步驟ID 經過一個node就會變
ParentSpanID 很同意理解,這個spanId是從哪個span來的,這個設計很重要的

復雜的東西spring boot已經給我們封裝好了
#######sleuth客戶端
在需要跟蹤的微服務中pom.xml加上

在application.yml中添加

pom.xml添加

並且在啟動類上添加

客戶端和服務端都啟動,進入到zipkin服務端

可以根據時間,服務名稱去查詢,點擊可查看調用鏈詳情

因為現在zipkin的調用數據都是存在內存中的,一旦zipkin server重啟,則意味著之前的都沒有了,在這並發高的,一會就把內存擠爆了,所以最終zipkin的數彎改答據是要持久化的,要麼mysql,這里採用ES,畢竟在大數據檢索麵前ES比mysql好很多很多
還有在頁面請求量大的時候zipkin和ES直接聯通存數據,肯定會阻塞,這里就用kafka來解決這個問題

pom.xml需要引入

application.yml添殲羨加

再次啟動,加入數據,觀察ES-head

已經將調用鏈存進去了,這里要感謝spring 將調用鏈集成,方便我們應用

望指正,不吝賜教

G. OpenTelemetry、Spring Cloud Sleuth、Kafka、Jager實現分布式跟蹤

分布式跟蹤可讓您深入了解特定服務纖核在分布式軟體系統中作為整體的一部分是如何執行的。它跟蹤和記錄從起點到目的地的請求以及它們經過的系統。


在本文中,我們將使用 OpenTelemetry、Spring Cloud Sleuth、Kafka 和 Jaeger 在三個 Spring Boot 微服務 中實現分布式跟蹤。


我們先來看看分布式追蹤中的一些基本術語。


跨度:表示系統內的單個工作單元。跨度可以相互嵌套以模擬工作的分解。例如,一個跨度可能正在調用一個 REST 端點,然後另一個子跨度可能是該端點調用另一個,等等在不同的服務中。


Trace:所有共享相同根跨度的跨度集合,或者更簡單地說,將所有跨度創建為原始請求的直接結果。跨度的層次結構(每個跨度在根跨度旁邊都有自己的父跨度)可用於形成有向無環圖,顯示請求在通過各種組件時的路徑。



OpenTelemetry ,也簡稱為 OTel,是一個供應商中立的開源 Observability 框架,用於檢測、生成、收集和導出遙測數據,例如 跟蹤 、 指標 和 日誌 。作為 雲原生 計算基金會 (CNCF) 的孵化項目,OTel 旨在提供與供應商無關的統一庫和 API 集——主要用於收集數據並將其傳輸到某處。OTel 正在成為生成和管理遙測數據的世界標准,並被廣泛採用。



Sleuth 是一個由 Spring Cloud 團隊管理和維護的項目,旨在將分布式跟蹤功能集成到 Spring Boot 應用程序中。它作為一個典型Spring Starter的 . 以下是一些開箱即用的 Sleuth 工具:



Sleuth 添加了一個攔截器,以確保在請求中傳遞所有跟蹤信息。每次調用時,都會毀叢掘創建一個新的 Span。它在收到響應後關閉。


Sleuth 能夠跟蹤您的請求和消息,以便您可以將該通信與相應的日誌條目相關聯。您還可以將跟蹤信息導出到外部系統鄭瞎以可視化延遲。



Jaeger 最初由 Uber 的團隊構建,然後於 2015 年開源。它於 2017 年被接受為雲原生孵化項目,並於 2019 年畢業。作為 CNCF 的一部分,Jaeger 是雲原生 架構 中公認的項目。它的源代碼主要是用 Go 編寫的。Jaeger 的架構包括:



與 Jaeger 類似,Zipkin 在其架構中也提供了相同的組件集。盡管 Zipkin 是一個較老的項目,但 Jaeger 具有更現代和可擴展的設計。對於此示例,我們選擇 Jaeger 作為後端。



讓我們設計三個 Spring Boot 微服務:





這三個微服務旨在:



這是為了觀察 OpenTelemetry 如何結合 Spring Cloud Sleuth 處理代碼的自動檢測以及生成和傳輸跟蹤數據。上面的虛線捕獲了微服務導出的跟蹤數據的路徑,通過OTLP(OpenTelemetry Protocol)傳輸到OpenTelemetry Collector,收集器依次處理並將跟蹤數據導出到後端Jaeger進行存儲和查詢。


使用 monorepo,我們的項目結構如下:




第 1 步:添加 POM 依賴項


這是使用 OTel 和 Spring Cloud Sleuth 實現分布式跟蹤的關鍵。我們的目標是不必手動檢測我們的代碼,因此我們依靠這些依賴項來完成它們設計的工作——自動檢測我們的代碼,除了跟蹤實現、將遙測數據導出到 OTel 收集器等。




第 2 步:OpenTelemetry 配置


OpenTelemetry 收集器端點


對於每個微服務,我們需要在其中添加以下配置application.yml(請參閱下面部分中的示例片段)。spring.sleuth.otel.exporter.otlp.endpoint主要是配置OTel Collector端點。它告訴導出器,在我們的例子中是 Sleuth,通過 OTLP 將跟蹤數據發送到指定的收集器端點http://otel-collector:4317。注意otel-collector端點 URL 來自otel-collector圖像的 docker-compose 服務。


跟蹤數據概率抽樣


spring.sleuth.otel.config.trace-id-ratio-based屬性定義了跟蹤數據的采樣概率。它根據提供給采樣器的分數對一部分跡線進行采樣。概率抽樣允許 OpenTelemetry 跟蹤用戶通過使用隨機抽樣技術降低跨度收集成本。如果該比率小於 1.0,則某些跡線將不會被導出。對於此示例,我們將采樣配置為 1.0、100%。


有關其他 OTel Spring Cloud Sleuth 屬性,請參閱常見應用程序屬性。



OpenTelemetry 配置文件


我們需要項目根目錄下的 OTel 配置文件otel-config.yaml。內容如下。此配置文件定義了 OTel 接收器、處理器和導出器的行為。正如我們所看到的,我們定義了我們的接收器來監聽 gRPC 和 HTTP,處理器使用批處理和導出器作為 jaeger 和日誌記錄。



第 3 步:docker-compose 將所有內容串在一起


讓我們看看我們需要啟動哪些 docker 容器來運行這三個微服務並觀察它們的分布式跟蹤,前三個微服務在上面的部分中進行了解釋。




運行docker-compose up -d以調出所有九個容器:



第 4 步:追蹤數據在行動


快樂之路


現在,讓我們啟動customer-service-bff流程的入口點,以創建新客戶。



啟動 Jaeger UI, http://localhost:16686/ [url=https://link.hu.com/?target=http%3A//localhost%3A16686/%2C]按[/url]服務搜索customer-service-bff,單擊Find Traces按鈕,這是我們看到的創建客戶跟蹤:它跨越三個服務,總共跨越六個,持續時間 82.35 毫秒。



除了 Trace Timeline 視圖(上面的屏幕截圖),Jaeger 還提供了一個圖形視圖(Trace Graph在右上角的下拉菜單中選擇):



三個微服務在 docker 中的日誌輸出顯示相同的跟蹤 id,以紅色突出顯示,並根據其應用程序名稱顯示不同的跨度 id(應用程序名稱及其對應的跨度 id 以匹配的顏色突出顯示)。在 的情況下customer-service,相同的 span id 從 REST API 請求傳遞到 Kafka 發布者請求。






customer-service讓我們在 docker 中暫停我們的PostgreSQL 資料庫,然後重復從customer-service-bff. 500 internal server error正如預期的那樣,我們得到了。檢查 Jaeger,我們看到以下跟蹤,異常堆棧跟蹤抱怨SocketTimeoutException,再次如預期的那樣。



識別長期運行的跨度


Jaeger UI 允許我們搜索超過指定最大持續時間的跟蹤。例如,我們可以搜索所有耗時超過 1000 毫秒的跟蹤。然後,我們可以深入研究長期運行的跟蹤以調查其根本原因。



在這個故事中,我們從 OpenTelemetry、Spring Cloud Sleuth 和 Jaeger 的角度解壓了分布式跟蹤,驗證了 REST API 調用和 Kafka pub/sub 中分布式跟蹤的自動檢測。我希望這個故事能讓你更好地理解這些跟蹤框架和工具,尤其是 OpenTelemetry,以及它如何從根本上改變我們在 分布式系統 中進行可觀察性的方式。

H. sofa-rpc源碼分析 4-全鏈路追蹤技術

一、簡介
sofa-rpc的全鏈路追蹤技術是基於 Sofa-Tracer 實現的,Sofa-Tracer是基於ZipKin(谷歌Dapper)實現的,Sofa-Tracer參考了ZipKin的Trace-span設計;提供了相應的非同步處理機制,每次會將父線程的上下文復制到子線程,為了防止多此非同步調用的場景下,上下文的串用,不會再客戶端相應階段才清理上下文,而是會提帶坦前清理。
sofa-rpc在Sofa-Tracer的基礎上,提供了以下新的特性

二、源碼分析
ClientProxyInvoker.invoke //客戶端調用入口,Trace生產流程

三、總結
1.sofa-rpc的全鏈路追蹤依靠sofa-trace實現,包含上述說的trace/span、數據采樣設計數行大、非同步刷新機制等設計,核心薯豎功能還是在sofa-trace里

I. 深入探究ZIPKIN調用鏈跟蹤——拓撲Dependencies篇

Zipkin的拓撲服務zipkin-dependencies是作為zipkin的一個獨立的離線服務,也就是說,只啟動zipkin服務,是沒法看到拓撲的,還需要自己離線啟動zipkin-dependencues服務。

其中ES配置參數如下:

Zipkin出了支持elasticsearch存儲,還有mysql,cassard,詳細配置信息請看 源碼Readme

1、圖中線條說明

服務之間的線條,遵循以下原則:

2、主調被調次數說明

點開每一個服務,可以看到主調被調,比如我在拓撲圖中點擊
某個服務,可以與此服務有直接調用關系的服務有哪些,效果如下:

其中Uses by表示此服務作為被調服務,被哪些服務調用了;Uses表示此服務調用了哪些其他服務。

在上面的圖中點擊某個主調或被調服務,即可看到具體的調用次數,以及失敗次數,效果如下:

通過拓撲圖,宏觀上,我們可以快速了解服務之間的調用關系,同時也可以知道哪些服務間調用有問題,且可以知道出現問題的一個量級是多少(失敗數,調用總數)。

Zipkin拓撲denpendencies是基於上報的鏈路span數據再次構建出的描述鏈路拓撲的一種新的數據結構。

構建鏈路的第一步就是讀改渣取Span數據。Zipkin外部數據源支持三種,分別是Mysql,Cassandra,Elasticsearch,因此構建拓撲時,將從這三種數據源中讀取Span數據。

讀取Span數據源後,需要對其處理,計算出鏈路的拓撲。因為Span的數據量很大,普通程序計算處理無法完成任務,因此需要用到大數據框架。Zipkin官方選用的是Spark框架。Spark對Span數據進行處理,最後生成拓撲數據DenpendencyLink,然後持久化到存儲中。

前端請求拓撲(DependencyLink)時,即按照查詢條件,查詢已經持久化後的DependencyLink,然後經過UI渲染,進行頁面展示。

啟動Zipkin-dependencies服務時,會傳入幾個參數,分別是時間day和存儲類型storageType。Zipkin-dependencies服務是以天為單位進行建立拓撲,因此day將決定建立那一天的拓撲;而storageType將決定從什麼儲存中讀取數據。

1、獲取日期:

2、獲取存儲類型陵殲陪:

3、根據不同的存儲啟動不同的jOb:

不同的存儲會定義不同Job類,因此有CassandraDependenciesJob,MySQLDependenciesJob,MySQLDependenciesJob,ElasticsearchDependenciesJob。 不同的Job主要區別在於讀取Span的方式不同,而Spark對Span進行處理計算的方式基本都是相同的。 本文主要分析ElasticsearchJOb。

Job中主要邏輯都在run方法中,ElastichserchJob的Run方法定義如下:

主要步驟如下:
1、首先通過Spark的配置屬性Conf,創建一個JavaSparkContext對象sc:

2、然後讀取elasticsearch span數據源:

3、讀取數據源後,就可以對Span進行處理了,首先按照TraceId 進行Group分組:

其中JSON_TRACE_ID Function定義如下:

4、Span按照TraceId Group 分組後,接著對尺蠢Span進行處理, 創建出DenpendencyLink。

5、上面方法最終返回的是個Map類型,將其轉化為pari類型,再對其進行一個receByKey操作:

6、Spark對Span的計算操作到這兒基本就完成了,最後將DependencyLink轉化為Jso形式:

7、對於計算好的拓撲Links,將其持久化到Elasticsearch中:

整個過程到此完畢,其中最復雜也是最核心的邏輯就是計算出鏈路拓撲Denpendencylink,此步驟在Function (logInitializer, decoder)中。接下來詳細分析完成的工作。

首先介紹一下DenpendencyLink數據結構。DenpendencyLink就是最終與頁面交互的拓撲結構數據單元,字端有:

DenpendencyLink類定義如下:

類的定義如下:

其中call方法中,首先完成對同一TraceId的Span解碼:

然後,通過DependencyLinker類構造出DependendyLink,首先構造一個SpanNode Tree:

然後利用深度優先遍歷方法遍歷整個,統計出CallCounts和errorCounts:

其中callCounts和errorCounts定義如下:

最後,再通過callCounts和errorCounts生成List<DependencyLink>:

這樣,最終構建出了DependencyLink。

本文為我的調用鏈系列文章之一,已有文章如下:

祝大家工作順利,天天開心!

J. java培訓課程有什麼內容

像這樣的問題,我已經回答了很多次,現在很多新手,特別是剛剛進入學生的學生,不知道該從哪裡入手,我整理了一些java的知識點,一共分為六個階段,273個技能點,第一階段、第二階段、第三階段、第四階段是必須要掌握的,很多機構忽悠人,就只學到第四階段,第五階段和第六階段就是高薪、高職的保障,就說說想高薪必須得把後面兩個階段的給掌握了,老鐵看了點個贊。

第一階段:java基本功修煉

1.認識計算機硬體

2.計算機組成原理

3.計算機軟體知識

4.計算機網路知識

5.常用網路應用操作

6.認識計算機病毒

7.邏輯訓練

8.初識Java

9.變數和數據類型

10.選擇結構

11.循環結構for

12.循環結構do-while

13.循環結構while

14.多重循環及程序調試

15.循環進階

16.一維數組及經典應用

17.二維數組

18.認識類與對象

19.方法及方法重載

20.封裝與繼承

21.方法重寫與多態

22.項目實戰-汽車租賃系統

23.抽象類和介面

24.異常

25.項目實戰-QuickHit

26.Java中的集合類型

27.List集合

28.Set集合

29.HashMap集合

30.Iterator

31.Collections演算法類及常用方法

32.enum

33.包裝類及裝箱拆箱

34.String、StringBuffer類常用方法操作字元串

35.Date、Calendar

36.Math類常用方法

37.IO/NIO

38.位元組輸入流(InputStream、FileInputStream、BufferedInputStream)

39.位元組輸出流(OutputStream、FileOutputStream、BufferedOutputStream)

40.字元輸入流(Reader、InputStreamReader、FileReader BufferedReader)

41.位元組輸出流(Writer、OutputStreamWriter、FileWriter、BufferedWriter)

42.文件復制

43.Serialize、Deserialize

44.職場晉升力:四象限時間管理與精力管理

45.多線程(Thread、Runnable)

46.ThreadLifeCycle

47.線程的調度

48.線程的同步和死鎖

49.ThreadPool

50.職場晉升力:團隊合作

51.Socket(TCP、UDP)

52.XML概念、優勢、規范

53.XML中特殊字元的處理

54.使用DOM讀取、添加、刪除、解析 XML數據

第二階段:javaweb開發

55.搭建和配置MySQL資料庫

56.資料庫增、刪、查、改語句

57.事務

58.視圖

59.資料庫備份與恢復

60.資料庫用戶管理

61.資料庫設計

62.項目實戰-銀行ATM存取款機系統

63.走進 HTML和CSS

64.列表表格及表單美化

65.CSS 高級操作

66.Bootstrap

67.CSS 組件

68.JavaScript面向對象

69.JavaScript判斷、循環

70.JavaScript閉包

71.JavaScript語法

72.Bootstrap綜合案例

73.HTML5、CSS3

74.jQuery基礎

75.jQuery基本操作

76.jQuery事件與特效

77.jQuery Ajax

78.jQuery插件

79.搭建Web 環境初識JSP

80.JSP九大內置對象

81.JSP實現數據傳遞和保存

82.JDBC

83.單例模式、工廠模式

84.MVC、三層模式

85.Commons-fileupload、CKEditor

86.分頁查詢

87.EL 與 JSTL

88.Servlet與Filter

89.Listener與MVC

90.Ajax 與 jQuery

91.jQuery的Ajax交互擴展

92.項目實戰—使用Ajax技術改進新聞發布系統

93.反射

94.Linux系統的安裝

95.在Linux中管理目錄和文件

96.在Linux中管理用戶和許可權

97.在Linux伺服器環境下安裝軟體和部署項目

98.職場晉升力:職場溝通

第三階段: 企業級框架開發

99. MyBatis 環境搭建

100. SQL 映射文件

101. 動態SQL

102. MyBatis 框架原理

103.SpringIOC

104.構造注入、依賴注入、註解

105. Spring 整合MyBatis(SqlSessionTemplate、MapperFactoryBean、事務

處理)

106. Spring 數據源(屬性文件、JNDI)、Bean 作用域

107. Spring 框架的運行原理

108.SpringMVC 體系概念

109.SpringMVC 之數據綁定、數據效驗、

110.SpringMVC 之視圖及視圖解析

111.SpringMVC 之文件上傳、本地化解析

112.SpringMVC 之靜態資源處理、請求攔截器、異常處理

113.Oracle資料庫環境搭建、安裝

114.Oracle資料庫 SQL、分頁、備份、還原

115.Hibernate 概念、依賴

116.HQL查詢語言

117.Hibernate 中配置關聯映射

118.HQL連接查詢與 Hibernate註解

119.Struts2概念、依賴

120.Struts2配置

121.OGNL表達式

122.Struts2攔截器

123.SSH框架整合

124.使用Maven構建項目

125.使用Struts2實現Ajax

126.Jsoup網路爬蟲

127.多線程網路爬蟲

128.反爬及反反爬策略

129.通用爬蟲設計

130.Echart圖表分析

131.IKAnalyzer分詞

132.企業框架項目實戰-代理商管理系統

133.企業框架項目實戰-SL 會員商城

134.企業框架項目實戰-會員管理系統

135.企業框架項目實戰-互聯網招聘信息採集分析平台

第四階段: 前後端分離開發

136.GitHub

137.Git基礎(checkout、pull、commit、push、merge等)

138.Git進階(多分支協作)

139.GitLab

140.IDEA的使用

141.Maven介紹(概念、倉庫、構建、命令)

142.使用Maven構建WEB項目

143.使用Maven構建多模塊項目

144.使用Maven搭建私服倉庫

145.Scrum框架介紹(三個角色、三個工件、四個會議)

146.ScrumTeam組建團隊

147.產品需求和用戶故事

148.每日立會

149.使用敏捷-Scrum方式開發管理實戰

150.前後端分離、分布式集群架構、垂直架構

151.SSM(SpringMVC+Spring+MyBatis)整合實戰

152.Git、Maven私服Nexus

153.第三方接入技術(微信、阿里)

154.MySQL電商實戰

155.Redis(緩存服務)

156.搜索引擎-Solr

157.集成APIDoc工具-Swagger

158.圖片自動化處理:Tengine+LUA+GraphicsMagic

159.手機、郵箱注冊

160.單點登錄 Token

161.OAuth2.0認證

162.Jsoup網路爬蟲(多線程爬蟲/代理 IP爬蟲)

163.ExecutorService線程池

164.IK中文分詞

165.Postman

166.ReactJS

167.webpack

168.職場晉升力:簡歷撰寫

169.程序猿面試寶典之項目面試

170.大型互聯網旅遊電商項目實戰-愛旅行

第五階段: 分布式微服架構開發

171.SpringBoot環境搭建

172.SpringBoot常用技能

173.SpringBoot整合Redis

174.SpringBoot整合Mybatis

175.微服務架構及架構設計

176.消息隊列

ActiveMQRabbitMQ

177.分布式事務

178.分布式鎖 Redis-setnx

179.Zookeeper注冊中心

180.基於 ActiveMQ實現高並發

181.Docker環境搭建

182.Docker鏡像加速

183.Docker容器管理

184.Docker鏡像管理

185.Docker容器文件備份

186.Dockerfile

187.Docker私服倉庫

188.真實互聯網高並發電商項目實戰-雙十一搶購

189.可視化監控 Portainer

190.DockerCompose 容器編排

191.DockerCompose擴容、縮容

192.DockerSwarm集群編排

193.Jenkins安裝、插件配置

194.Jenkins配置普通任務

195.Jenkins配置管道任務

196.Jenkins自動發布服務

197.Spring CloudEureka

198.Spring CloudFeign

199.Spring CloudRibbon

200.Spring CloudZuul

201.Spring CloudConfig

202.Spring CloudHystrix

203.Spring CloudSleuth

204.Spring BootAdmin

205.Eureka注冊原理探秘

206.SpringCloud 大坑解讀

207.Zipkin

208.Zipkin整合RabbitMQ

209.Zipkin整合MySQL

210.ELK日誌收集

211.Kafka

212.Elasticsearch映射管理

213.Elasticsearch查詢/復合查詢

214.Elasticsearch集群/集群規劃

215.Elasticsearch聚合

216.Elasticsearch集群監控

217.Elasticsearch插件

(Head/BigDesk)

218.Mycat讀寫分離

219.Mycat一主多從

220.Mycat多主多從

221.Mycat數據分片

222.Redis

223.Redis-Redlock

224.Elasticsearch環境搭建

225.Elasticsearch客戶端

226.Elasticsearch索引管理

227.Elasticsearch文檔管理

228.Mycat集群

229.Jmeter 並發測試

230.Jmeter 生成測試報告

231.微信登錄

232.微信支付

233.支付寶支付

234.網路地圖

235.Sonar本地檢測

236.Sonar+Jenkins線上檢測

237.CI/CD

238.SpringBoot改造愛旅行項目實戰

239.大型互聯網票務類電商項目實戰-大覓網

240.ES6概念(les、const)

241.ES6對象和數組

242.ES6函數擴展

243.VUE環境搭建

244.VUE.JS指令

245.VUE 交互

246.VUE 實例生命周期

247.VUE 組件

248.VUE項目環境配置及單文件組件

249.VUE 路由

第六階段:cc服務

250. Spring Cloud Gateway

251. Consul

252. Nacos

253. Eureka、Consu、lNacos、Zookeeper 對比分析

254. Prometheus + Grafana

255. ES 分布式存儲原理

256. NoSQL 資料庫解決方案(Redis、MongoDB)

257. OAuth2.0 認證( authorization code 模式)

258. OAuth2.0 認證( implicit 模式)

259. OAuth2.0 認證( resource owner password credentials 模式)

260.OAuth2.0認證( clientcredentials模式)

261.NAS/FastDFS分布式文件存儲

262.Python基礎

263.Python爬蟲

264. 大數據及 Hadoop 概述

265. 分布式文件系統 HDFS

266. 分布式計算框架MapRece

267. 分布式列式資料庫 HBase

268. Hadoop 綜合應用

269. 面試大局觀

270. 職業規劃

271. 項目面試

272. 具體業務場景化解決方案

273. 更多技術專題持續增加中

有不清楚的可以私信我

閱讀全文

與zipkin客戶端源碼相關的資料

熱點內容
谷歌web伺服器地址 瀏覽:896
安卓鎖屏圖片如何刪除 瀏覽:717
python3多進程編程 瀏覽:711
證明代碼是程序員寫的 瀏覽:392
演算法錯誤發現辦法 瀏覽:407
河南省醫院掛號是哪個app 瀏覽:627
冬日戀歌哪個APP能看 瀏覽:671
委內瑞拉加密貨 瀏覽:8
程序員寫日記哪個軟體好 瀏覽:106
加密機操作手冊 瀏覽:860
dos命令自動關閉 瀏覽:328
心田花開app在哪裡評價 瀏覽:449
求索記錄頻道哪個app可以看 瀏覽:730
金梅瓶pdf下載 瀏覽:985
機器軟體用什麼編程 瀏覽:845
java虛擬機指令 瀏覽:671
shell編程入門書籍 瀏覽:946
大連桶裝水溯源碼售價 瀏覽:302
php怎麼跳轉到電腦 瀏覽:414
如何在電腦上創建新網路連接伺服器 瀏覽:61