【Springboot】實例講解Springboot整合OpenTracing分散式鏈路追蹤系統(Jaeger和Zipkin)
- 2020 年 4 月 5 日
- 筆記
1 分散式追蹤系統
隨著大量公司把單體應用重構為微服務,對於運維人員的責任就更加重大了。架構更複雜、應用更多,要從中快速診斷出問題、找到性能瓶頸,並不是一件容易的事。因此,也隨著誕生了一系列面向DevOps
的診斷與分析系統,主要是以下三個系統:
- 集中式日誌系統(Logging)
- 集中式度量系統(Metrics)
- 分散式追蹤系統(Tracing)
三者相互交織重疊如下:
技術棧上的成熟框架有,
Logging:Log4j、ELK等,
Metrics:Prometheus、InfluxDB、Grafana等
Tracing:Jaeger和Zipkin等。
分散式追蹤系統在Google發表一篇文章Dapper, a Large-Scale Distributed Systems Tracing Infrastructure後快速發展。Tracing系統一般核心步驟有三個:程式碼埋點、數據存儲、查詢展示。
歷史洪流滾滾向前,大浪淘沙,現在比較流行的有Jaeger
和Zipkin
。
2 OpenTracing
由於Tracing
的技術發展迅速,為了解決兼容性問題,有了OpenTracing規範。它是一個輕量級的標準化層,連接應用、類庫和追蹤系統。
OpenTracing的優勢:
(1)OpenTracing已經進入CNCF
(雲原生計算基金會,口號是堅持和整合開源技術來編排容器作為微服務架構的一部分),正在為全球的分散式追蹤,提供統一的概念和數據標準。
(2)OpenTracing通過提供平台無關、廠商無關的API
,使得開發人員能夠方便添加和更換追蹤系統的實現。
2.1 相關概念
Trace
:貫穿一個分散式系統的事務追蹤描述,其實就是由許多個Span
組成的有向無環圖。
Span
:被命名的與記錄時間的調用操作,如一個Http GET請求;Span
有嵌套關係,如果一個請求會調用其它服務,就會生成子Span
。
Tag
:一組由鍵值對構成的標籤集合,鍵值類型必須為字元串。它可以帶上許多有用資訊,如請求方法、請求URL、返回狀態碼等。
Log
:一組Span
的日誌集合。
2.2 OpenTracing的實現
Jaeger
是Uber
推出的一款開源分散式追蹤系統,兼容OpenTracing API
。架構如下:
Zipkin
是由Twitter
推出的開源的分散式追蹤系統,架構圖如下:
3 實戰整合
本文以Springboot為Web項目,分別整合Jaeger
和Zipkin
。
3.1 Springboot項目準備
項目中的Controller
,提供了兩個Endpoint,tracing
和open
;在訪問open
時,程式碼會調用tracing
。
@RestController public class TracingController { @Autowired private RestTemplate restTemplate; @Value("${server.port}") private int port; @RequestMapping("/tracing") public String tracing() throws InterruptedException { Thread.sleep(100); return "tracing"; } @RequestMapping("/open") public String open() throws InterruptedException { ResponseEntity<String> response = restTemplate.getForEntity("http://localhost:" + port + "/tracing", String.class); Thread.sleep(200); return "open " + response.getBody(); } }
為了能夠方便看出調用時長資訊,特別在程式碼中增加了延時Thread.sleep()
。
配置Web應用的埠和服務名字:
server.port=80 spring.application.name=opentracing-demo
3.2 整合Jaeger
3.2.1 Springboot整合
引用依賴:
<dependency> <groupId>io.opentracing.contrib</groupId> <artifactId>opentracing-spring-jaeger-web-starter</artifactId> <version>3.1.1</version> </dependency>
配置連接屬性:
opentracing.jaeger.enabled=true opentracing.jaeger.udp-sender.host=localhost opentracing.jaeger.udp-sender.port=6831
3.2.2 Docker運行Jaeger
為了方便,使用docker
來運行Jaeger
:
# 拉取jaeger鏡像 docker pull jaegertracing/all-in-one:1.17 # 運行jaeger實例, docker run -d --name jaeger -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p 5775:5775/udp -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778 -p 16686:16686 -p 14268:14268 -p 14250:14250 -p 9411:9411 jaegertracing/all-in-one:1.17
以上埠的資訊如下:
3.2.3 運行與訪問UI
啟動Web應用和Jaeger後,訪問服務:
訪問Jaeger UI介面http://localhost:16686/,設置好查詢條件後點擊Find Traces
,就能查看到Trace資訊了,具體如下:
選擇一條Trace點進去後,可以看到詳細資訊,非常有利於我們分析,具體如下:
3.3 Zipkin
3.3.1 Springboot整合
引用相關依賴:
<dependency> <groupId>io.opentracing.contrib</groupId> <artifactId>opentracing-spring-zipkin-web-starter</artifactId> <version>0.1.4</version> </dependency>
配置相關連接資訊:
opentracing.zipkin.enabled=true opentracing.zipkin.http-sender.base-url=http://localhost:9412/
3.3.2 Docker運行Zipkin
通過Docker運行Zipkin實例:
# 拉取Zipkin鏡像 docker pull openzipkin/zipkin:2.21 # 運行Zipkin實例 docker run -d -p 9412:9411 openzipkin/zipkin:2.21
因為本機的埠9411已經被Jaeger的docker實例佔用,所以改為9412。
3.3.3 運行與訪問UI
啟動Web應用和Zipkin後,訪問服務:
訪問Zipkin UI介面http://localhost:9412/zipkin/,設置好查詢條件後點擊查詢,就能查看到Trace資訊了,具體如下:
選擇一條Trace點擊進去,同樣可以看到許多詳細資訊,這裡不在展示。
4 總結
本文通過程式碼案例詳細講解了Springboot整合OpenTracing的兩個實現(Jaeger
和Zipkin
),demo的程式碼可關注公眾號後台回復」OpenTracing「獲取。
參考鏈接:
OpenTracing概念:https://opentracing.io/docs/overview/tags-logs-baggage/
Jaeger架構圖:https://www.jaegertracing.io/docs/1.17/architecture/
Zipkip架構圖:https://zipkin.io/pages/architecture.html
Jaeger Docker資訊:https://www.jaegertracing.io/docs/1.17/getting-started/
Zipkin Docker資訊:https://hub.docker.com/r/openzipkin/zipkin
Jaeger Spring整合項目:https://github.com/opentracing-contrib/java-spring-jaeger
Zipkin Spring整合項目:https://github.com/opentracing-contrib/java-spring-zipkin
歡迎關注公眾號<南瓜慢說>,將持續為你更新…
多讀書,多分享;多寫作,多整理。