分散式鏈路追蹤Jaeger + 微服務Pig在Rainbond上的實踐分享
隨著微服務架構的流行,客戶端發起的一次請求可能需要涉及到多個或 N 個服務,致使我們對服務之間的監控和排查變得更加複雜。
舉個例子:
某條業務線的某個介面呼叫服務端時快時慢,這時就需要排查各個服務的日誌進行分析,調動各個服務的開發人員聯動排查,這種排查費時又費力。對於 ToB 的業務有時候還拿不到日誌,難搞哦!
因此,就需要可以幫助理解系統行為、用於分析效能問題的工具,以便發生故障的時候,能夠快速定位和解決問題,那就是 APM (Application Performance Monitor)。目前流行的 APM 開源工具有很多,比如:Zipkin,Skywalking,Pinpoint、Jaeger 等等,本文將主要介紹 Jaeger 。
Jaeger 是 Uber 技術團隊釋出的開源分散式跟蹤系統,它用於監控和故障排查基於微服務的分散式系統:
- 分散式上下文傳播、事務監控
- 根本原因、服務依賴分析
- 效能/延遲優化
- OpenTracing 啟發的資料模型
- 多個儲存後端:Cassandra, Elasticsearch, memory.
- 系統拓撲圖
- 服務效能監控(SPM)
- 自適應取樣
Jaeger 架構
Component | Description |
---|---|
Jaeger Client | Jaeger Client SDK |
Jaeger Agent | 收集 Client 資料 |
Jaeger Collector | 收集 Jaeger Agent 資料,有 pull/push 兩種方式 |
DB Storage | Collector 需要儲存後端,Collector 拿到的資料將存在 Elasticsearch 或 Cassandra。 |
Spark jobs | 用於生成拓撲圖 UI 資料 |
Jaeger Query Service & UI | 負責從 Storage 查詢資料並提供 API 和 UI |
如何在Rainbond上整合?
1.整合 OpenTelemetry Client:
v1.36 版本以前 Jaeger Client 是基於 OpenTracing API
實現的客戶端庫,Jaeger Client 結合 Jaeger Agent 一起使用,傳送 span 到 Jaeger Collector。
v1.36 版本以後被棄用。使用OpenTelemetry 替代 Jaeger Client and Jaeger Agent,詳情見 Jaeger and OpenTelemetry 。
OpenTelemetry
是無侵入的,只需在 Java 程序啟動時新增 javaagent
,例: java -javaagent:path/to/opentelemetry-javaagent.jar -jar myapp.jar
。
那麼在 Rainbond 上就可以通過外掛將 OpenTelemetry javaagent
下載到元件中並修改啟動命令。
2.連線到 Jaeger-Collector:
將所有安裝了 OpenTelemetry javaagent
外掛的微服務元件都通過依賴連線到 Jaeger Collector
。
實踐步驟
實踐中將使用 Spring Cloud Pig 進行演示,Gitee: https://gitee.com/zhangbigqi/pig
Rainbond 部署請參閱文件快速安裝 。
1. Spring Cloud Pig 原始碼部署
通過原始碼部署 Spring Cloud Pig
微服務框架就不詳細介紹部署了,請參閱:
2. OpenTelemetry 外掛安裝
從應用商店安裝 opentelemetry-java-agent
初始化外掛,該外掛的作用是下載 opentelemetry-javaagent.jar
到微服務元件內,可以在 Java 啟動項中指定。
- 團隊檢視 -> 外掛 -> 從應用商店安裝外掛 -> 搜尋
opentelemetry-java-agent
並安裝。
3. 部署 Jaeger
在開源應用商店中搜索 Jaeger
並安裝到指定應用中。
4. OpenTelemetry Agent 外掛配置
1.開通 OpenTelemetry Agent 外掛
以 pig-gateway
為例,在元件 -> 外掛中開通 opentelemetry-java-agent
外掛並更新元件生效,微服務內的其他元件均需要開通外掛並更新或重啟元件生效。
2.配置環境變數
為所有微服務元件配置環境變數。
變數名 | 變數值 | 說明 |
---|---|---|
OTEL_TRACES_EXPORTER | jaeger | 選擇 Jaeger exporter |
OTEL_EXPORTER_JAEGER_ENDPOINT | http://127.0.0.1:14250 | Jaeger Collector gRPC endpoint |
OTEL_EXPORTER_JAEGER_TIMEOUT | 10000 | 超時時間(毫秒) |
OTEL_METRICS_EXPORTER | none | Metrics 匯出器 |
JAVA_OPTS | -javaagent:/agent/opentelemetry-javaagent.jar | Java 啟動引數 |
可使用 應用配置組
統一配置並應用到所有元件中。
3.配置元件服務名稱
為所有微服務元件配置環境變數 OTEL_SERVICE_NAME
,配置元件的 Jaeger 服務名稱,如: OTEL_SERVICE_NAME=pig-gateway
OTEL_SERVICE_NAME=pig-auth
5.建立依賴關係
將所有微服務元件新增依賴連線到 Jaeger Collector
。
因 Jaeger
部署在另外一個應用,需要進入 元件 -> 依賴 -> 新增 Jaeger Collector
依賴,就可以在當前應用的拓撲圖看到 Jaeger Collector
元件,剩下的元件都可通過拓撲圖編輯模式進行依賴連線。更新或重啟所有微服務元件使依賴關係生效。
6. Jaeger 快速使用
-
訪問 Spring Cloud Pig UI 進行登入,使其產生資料。
-
訪問
Jaeger-Query
的16686
埠,開啟對外服務即可訪問Jaeger UI
。 -
在 Jaeger Search 頁面中搜索微服務 Pig-gateway 的 Traces
-
Service:選擇微服務的元件
-
Operation:選擇操作型別,例:GET POST、介面、類.....
-
Tags:根據響應頭篩選,例:http.status_code=200 error=true
-
Lookback:選擇時間
-
Max Duration:最大持續時間;Min Duration:最小持續時間。
-
Limit Results:限制返回結果數量。
-
- 找到 Pig-gateway HTTP POST 的 Traces 幷包含了 pig-auth Span並進入,可看到很清晰的展示了服務之間一層一層的呼叫以及介面的響應時間,這樣我們就可以排查到底是哪個服務呼叫的慢或者呼叫有問題。
Jaeger 拓撲圖生成
拓撲圖預設不會生成,使用 spark-dependencies
元件生成拓撲圖資料,這是一個 Spark 作業,它從儲存中收集 span,分析服務之間的連結,並將它們儲存起來以供以後在 UI 中展示。請參閱 Jaeger Spark dependencies 。
spark-dependencies
元件佔用資源較大,不使用時可關閉,需要生成拓撲圖資料時將其啟動即可。
最後
有了 APM 系統後,使我們可以更好的分析業務效能、排查故障等。
結合 Rainbond 作為基座不管是 Spring Cloud
還是 Jaeger
或其他 APM
都可以很方便、快捷的部署使用,從繁瑣的部署、配置中解放出來,讓我們更多的關注於業務層。
- 爆肝整理5000字!HTAP的關鍵技術有哪些?| StoneDB學術分享會#3
- Java併發程式設計解析 | 基於JDK原始碼解析Java領域中ReentrantLock鎖的設計思想與實現原理 (一)
- 【程式碼級】全鏈路壓測的整體架構設計,以及5種實現方案(流量染色、資料隔離、介面隔離、零侵入、服務監...
- 電商行業:全鏈路監測廣告投放效果,用資料驅動業務增長
- 如何給玩偶建模並讓它跳個舞?
- 原來 Rust 當然 Lint 是這樣工作的
- 基於 Zadig 的 GitOps 實踐
- What's new in dubbo-go-pixiu 0.5.1
- 負載均衡原理分析與原始碼解讀
- 利用 SonarScanner 靜態掃描 Rainbond 上的 Maven 專案
- 分散式鏈路追蹤Jaeger 微服務Pig在Rainbond上的實踐分享
- 收藏!0基礎開源資料視覺化平臺FlyFish大屏開發指南
- 從開源的視角,解析SAP經典ERP “三十年不用變”的架構設計 薦 轉
- 從碼農轉型大音樂家,你需要這些音樂製作處理工具
- 五分鐘給你的 gRPC 服務加上 HTTP 介面
- 【詳細教程】一文參透MongoDB聚合查詢 原 薦
- 【超詳細】手把手教你搭建MongoDB叢集 原 薦
- 從伺服器到雲託管,到底經歷了什麼?
- 敏捷需求管理篇|如何從0-1寫好一個使用者故事
- go-zero微服務實戰系列(四、CRUD熱熱身)