回覆列表
  • 1 # ksfzhaohui

    分散式環境下,實現服務端呼叫鏈,市面上有很多開源的框架供選擇,不過理論模型大多都是借鑑Google Dapper論文,常見的APM(Application Performance Management)元件有:

    1.Zipkin

    由Twitter公司開源,開放原始碼分散式的跟蹤系統,用於收集服務的定時資料,以解決微服務架構中的延遲問題,包括資料的收集、儲存、查詢和展現;

    github地址:https://github.com/openzipkin/zipkin

    2.Pinpoint

    Pinpoint是一款對Java編寫的大規模分散式系統的APM工具,由南韓人開源的分散式跟蹤元件;

    github地址:https://github.com/naver/pinpoint

    3.SkyWalking

    是一款華人主導開發的開源應用效能監控系統,包括指標監控,分散式追蹤,分散式系統性能診斷;

    github地址:https://github.com/apache/skywalking

    4.CAT

    CAT 是基於 Java 開發的實時應用監控平臺,為美團點評提供了全面的實時監控告警服務

    github地址:https://github.com/dianping/cat

    類似的還有淘寶的EgleEye,京東的Hydra等;

    本人之前寫過一篇關於zipkin的快速入門文章,如下所示:

    Zipkin快速開始

    Zipkin是什麼

    Zipkin分散式跟蹤系統;它可以幫助收集時間資料,解決在microservice架構下的延遲問題;它管理這些資料的收集和查詢;Zipkin的設計是基於谷歌的Google Dapper論文。每個應用程式向Zipkin報告定時資料,Zipkin UI呈現了一個依賴圖表來展示多少跟蹤請求經過了每個應用程式;如果想解決延遲問題,可以過濾或者排序所有的跟蹤請求,並且可以檢視每個跟蹤請求佔總跟蹤時間的百分比。

    為什麼使用Zipkin

    隨著業務越來越複雜,系統也隨之進行各種拆分,特別是隨著微服務架構和容器技術的興起,看似簡單的一個應用,後臺可能有幾十個甚至幾百個服務在支撐;一個前端的請求可能需要多次的服務呼叫最後才能完成;當請求變慢或者不可用時,我們無法得知是哪個後臺服務引起的,這時就需要解決如何快速定位服務故障點,Zipkin分散式跟蹤系統就能很好的解決這樣的問題。

    Zipkin下載和啟動

    官方提供了三種方式來啟動,這裡使用第二種方式來啟動;

    wget -O zipkin.jar "https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec"java -jar zipkin.jar

    首先下載zipkin.jar,然後直接使用-jar命令執行,要求jdk8以上版本;

    基於Undertow WEB伺服器,提供對外埠:9411,可以開啟瀏覽器訪問http://ip:9411

    詳細參考:https://zipkin.io/pages/quickstart.html

    Zipkin架構跟蹤器(Tracer)位於你的應用程式中,並記錄發生的操作的時間和元資料,提供了相應的類庫,對使用者的使用來說是透明的,收集的跟蹤資料稱為Span;將資料傳送到Zipkin的儀器化應用程式中的元件稱為Reporter,Reporter通過幾種傳輸方式之一將追蹤資料傳送到Zipkin收集器(collector),然後將跟蹤資料進行儲存(storage),由API查詢儲存以向UI提供資料。架構圖如下:

    1.TraceZipkin使用Trace結構表示對一次請求的跟蹤,一次請求可能由後臺的若干服務負責處理,每個服務的處理是一個Span,Span之間有依賴關係,Trace就是樹結構的Span集合;

    2.Span每個服務的處理跟蹤是一個Span,可以理解為一個基本的工作單元,包含了一些描述資訊:id,parentId,name,timestamp,duration,annotations等,例如:

    traceId:標記一次請求的跟蹤,相關的Spans都有相同的traceId;

    id:span id;

    name:span的名稱,一般是介面方法的名稱;

    parentId:可選的id,當前Span的父Span id,透過parentId來保證Span之間的依賴關係,如果沒有parentId,表示當前Span為根Span;

    timestamp:Span建立時的時間戳,使用的單位是微秒(而不是毫秒),所有時間戳都有錯誤,包括主機之間的時鐘偏差以及時間服務重新設定時鐘的可能性,出於這個原因,Span應儘可能記錄其duration;

    duration:持續時間使用的單位是微秒(而不是毫秒);

    annotations:註釋用於及時記錄事件;有一組核心註釋用於定義RPC請求的開始和結束;

    cs:Client Send,客戶端發起請求;sr:Server Receive,伺服器接受請求,開始處理;ss:Server Send,伺服器完成處理,給客戶端應答;cr:Client Receive,客戶端接受應答從伺服器;

    binaryAnnotations:二進位制註釋,旨在提供有關RPC的額外資訊。

    3.Transport

    收集的Spans必須從被追蹤的服務運輸到Zipkin collector,有三個主要的傳輸方式:HTTP, Kafka和Scribe;

    4.Components

    有4個元件組成Zipkin:collector,storage,search,web UI

    collector:一旦跟蹤資料到達Zipkin collector守護程序,它將被驗證,儲存和索引,以供Zipkin收集器查詢;

    storage:Zipkin最初資料儲存在Cassandra上,因為Cassandra是可擴充套件的,具有靈活的模式,並在Twitter中大量使用;但是這個元件可插入,除了Cassandra之外,還支援ElasticSearch和MySQL;

    search:一旦資料被儲存和索引,我們需要一種方法來提取它。查詢守護程序提供了一個簡單的JSON API來查詢和檢索跟蹤,主要給Web UI使用;

    web UI:建立了一個GUI,為檢視痕跡提供了一個很好的介面;Web UI提供了一種基於服務,時間和註釋檢視跟蹤的方法。

    實戰

    使用Zipkin和Brave實現http服務呼叫的跟蹤,Brave 是用來裝備Java程式的類庫,提供了面向標準Servlet、Spring MVC、Http Client、JAX RS、Jersey、Resteasy 和 MySQL 等介面的裝備能力,可以透過編寫簡單的配置和程式碼,讓基於這些框架構建的應用可以向 Zipkin 報告資料。同時 Brave 也提供了非常簡單且標準化的介面,在以上封裝無法滿足要求的時候可以方便擴充套件與定製。

    提供四個工程,分別對應四個服務分別是:zipkin1,zipkin2,zipkin3,zipkin4;zipkin1透過httpclient呼叫zipkin2,然後zipkin2透過httpclient呼叫zipkin3和zipkin4,形成一個呼叫鏈;四個服務都是基於spring-boot來實現,對應的埠分別是8081,8082,8083,8084;

    1.公共maven依賴庫

    2.核心類ZipkinBean提供需要使用的Bean

    3.核心類ZipkinController對外介面

    分別啟動四個服務,然後瀏覽器訪問:http://localhost:8081/service1,正常呼叫結果返回:

    可以觀察zipkin web ui,檢視服務的呼叫鏈:

  • 中秋節和大豐收的關聯?
  • 請問寶寶經常沙眼怎麼辦?從兩週歲左右開始到現在快五週歲了?