天天看點

Feign 服務調用使用 Zipkin 鍊路追蹤

分布式微服務時代,友善了業務的快速增長和服務的穩定,但是系統出現問題後,面對同業務多服務排查起來令人頭大。這時候上司就想着內建分布式追蹤系統。Zipkin 是 Twitter 的一個開源項目,基于 Google Dapper 實作。可以使用它來收集各個伺服器上請求鍊路的跟蹤資料,并通過它提供的 REST API 接口來輔助我們查詢跟蹤資料以實作對分布式系統的監控程式,進而及時地發現系統中出現的延遲升高問題并找出系統性能瓶頸的根源。除了面向開發的 API 接口之外,它也提供了友善的 UI 元件幫助我們直覺的搜尋跟蹤資訊和分析請求鍊路明細,比如:可以查詢某段時間内各使用者請求的處理時間等。

Zipkin 服務依賴環境

Centos 7 Mysql 8

Zipkin 用戶端項目版本

Springboot 2.2.5.RELEASE Springcloudalibaba 2.2.1.RELEASE

官方說明 如果伺服器安裝了 JDK8 以及更高的,那麼 Jar 包方式啟動是最快的入門方式。

可以本地下載下傳好 Jar 然後上傳伺服器再執行,也可以伺服器直接下載下傳再執行

下載下傳最新 Jar 包

伺服器下載下傳指令

Jar 服務啟動

其他環境變量參數配置

屬性

環境變量

描述

zipkin.collector.rabbitmq.concurrency

RABBIT_CONCURRENCY

并發消費者數量,預設為 1

zipkin.collector.rabbitmq.connection-timeout

RABBIT_CONNECTION_TIMEOUT

建立連接配接時的逾時時間,預設為 60000 毫秒,即 1 分鐘

zipkinzipkin.collector.rabbitmq.queue

RABBIT_QUEUE

從中擷取 span 資訊的隊列,預設為 zipkin

zipkin.collector.rabbitmq.uri

RABBIT_URI

符合 RabbitMQ URI 規範 的 URI,例如 amqp://user:pass@host:10000/vhost

如果設定了 URL,則以下屬性将被忽略

zipkin.collector.rabbitmq.addresses

RABBIT_ADDRESSES

用逗号分隔的 RabbitMQ 位址清單,例如 localhost:5672,localhost:5673

zipkin.collector.rabbitmq.password

RABBIT_PASSWORD

連接配接到 RabbitMQ 時使用的密碼,預設為 guest

zipkinzipkinzipkin.collector.rabbitmq.username

RABBIT_USER

連接配接到 RabbitMQ 時使用的使用者名,預設為 guest

zipkin.collector.rabbitmq.virtual-host

RABBIT_VIRTUAL_HOST

使用的 RabbitMQ virtual host,預設為 /

zipkin.collector.rabbitmq.use-ssl

RABBIT_USE_SSL

設定為 true 則用 SSL 的方式與 RabbitMQ 建立連結

注意: 存儲媒體由預設的記憶體改為 Mysql,需要先建資料庫 Zipkin,然後導入 zipkin 的預設庫,建完庫後執行如下内容即可

項目內建使用 2 子產品來說明,子產品名為 consumer 和 provider。主要以 Rabbit 連接配接方式來介紹,也會注釋說下 Web 的方式

Feign 服務調用使用 Zipkin 鍊路追蹤

consumer

provider

分别啟動 consumer、provider,然後浏覽器調用 consumer 的測試接口

來看下上面的日志資訊,==[consumer,dd07a4eaac415456,dd07a4eaac415456,true]== ,含義為[項目名, TraceId(相同視為一請求), SpanId(每個服務節點唯一), 是否被 Zipkin 收錄]

這裡使用的是 Springboot 自帶的日志架構 Logback,如果使用 Log4j2,則需要修改 Pattern 添加鍊路資訊,參考如下内容。

浏覽器位址欄通路

Feign 服務調用使用 Zipkin 鍊路追蹤
Feign 服務調用使用 Zipkin 鍊路追蹤

可以看出來一個請求鍊路順序為 consumer->provider,還可以看到調用花費的時間,到此就算配置成功了。

spring-cloud-alibaba-seata 2.2.0.RELEASE seata-spring-boot-starter 1.4.0

如果微服務中使用分布式事務 Seata,那內建 Zipkin 後, 就會出現問題服務調用服務失敗的問題如下

主要原因是 pom 引入的 Zipkin 包含 Sleuth,而 Sleuth 的配置類 TraceFeignClientAutoConfiguration 和 Seata 的配置類 SeataFeignClientAutoConfiguration 都建立了 Bean:feignHystrixBuilder,沖突導緻上面的錯誤。

每個服務工程配置 Seata 攔截器類 SetSeataInterceptor ,以攔截器的方式傳遞 XID

啟動類排除 SeataFeignClientAutoConfiguration.class

記錄如有不對煩請指出,先行感謝

繼續閱讀