【Springboot】例項講解Springboot整合OpenTracing分散式鏈路追蹤系統(Jaeger和Zipkin)

南瓜慢說發表於2020-04-05

1 分散式追蹤系統

隨著大量公司把單體應用重構為微服務,對於運維人員的責任就更加重大了。架構更復雜、應用更多,要從中快速診斷出問題、找到效能瓶頸,並不是一件容易的事。因此,也隨著誕生了一系列面向DevOps的診斷與分析系統,主要是以下三個系統:

  • 集中式日誌系統(Logging)
  • 集中式度量系統(Metrics)
  • 分散式追蹤系統(Tracing)

三者相互交織重疊如下:

loggin_metrics_tracing

技術棧上的成熟框架有,

Logging:Log4j、ELK等,

Metrics:Prometheus、InfluxDB、Grafana等

Tracing:Jaeger和Zipkin等。

分散式追蹤系統在Google發表一篇文章Dapper, a Large-Scale Distributed Systems Tracing Infrastructure後快速發展。Tracing系統一般核心步驟有三個:程式碼埋點、資料儲存、查詢展示。

歷史洪流滾滾向前,大浪淘沙,現在比較流行的有JaegerZipkin

2 OpenTracing

由於Tracing的技術發展迅速,為了解決相容性問題,有了OpenTracing規範。它是一個輕量級的標準化層,連線應用、類庫和追蹤系統。

interface

OpenTracing的優勢:

(1)OpenTracing已經進入CNCF(雲原生計算基金會,口號是堅持和整合開源技術來編排容器作為微服務架構的一部分),正在為全球的分散式追蹤,提供統一的概念和資料標準。

(2)OpenTracing通過提供平臺無關、廠商無關的API,使得開發人員能夠方便新增和更換追蹤系統的實現。

2.1 相關概念

Trace:貫穿一個分散式系統的事務追蹤描述,其實就是由許多個Span組成的有向無環圖。

Span:被命名的與記錄時間的呼叫操作,如一個Http GET請求;Span有巢狀關係,如果一個請求會呼叫其它服務,就會生成子Span

Tag:一組由鍵值對構成的標籤集合,鍵值型別必須為字串。它可以帶上許多有用資訊,如請求方法、請求URL、返回狀態碼等。

Log:一組Span的日誌集合。

2.2 OpenTracing的實現

JaegerUber推出的一款開源分散式追蹤系統,相容OpenTracing API。架構如下:

Jaeger Architecture

Zipkin是由Twitter推出的開源的分散式追蹤系統,架構圖如下:

Zipkin architecture

3 實戰整合

本文以Springboot為Web專案,分別整合JaegerZipkin

3.1 Springboot專案準備

專案中的Controller,提供了兩個Endpoint,tracingopen;在訪問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
複製程式碼

以上埠的資訊如下:

Jaeger Ports

3.2.3 執行與訪問UI

啟動Web應用和Jaeger後,訪問服務:

http://localhost/open

http://localhost/tracing

訪問Jaeger UI介面http://localhost:16686/,設定好查詢條件後點選`Find Traces`,就能檢視到Trace資訊了,具體如下:

Jaeger UI

選擇一條Trace點進去後,可以看到詳細資訊,非常有利於我們分析,具體如下:

Jaeger UI Details

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後,訪問服務:

http://localhost/open

http://localhost/tracing

訪問Zipkin UI介面http://localhost:9412/zipkin/,設定好查詢條件後點選查詢,就能檢視到Trace資訊了,具體如下:

Zipkin UI

選擇一條Trace點選進去,同樣可以看到許多詳細資訊,這裡不在展示。

4 總結

本文通過程式碼案例詳細講解了Springboot整合OpenTracing的兩個實現(JaegerZipkin),demo的程式碼可關注公眾號後臺回覆”OpenTracing“獲取。

參考連結:

OpenTracing概念:opentracing.io/docs/overvi…

Jaeger架構圖:www.jaegertracing.io/docs/1.17/a…

Zipkip架構圖:zipkin.io/pages/archi…

Jaeger Docker資訊:www.jaegertracing.io/docs/1.17/g…

Zipkin Docker資訊:hub.docker.com/r/openzipki…

Jaeger Spring整合專案:github.com/opentracing…

Zipkin Spring整合專案:github.com/opentracing…


歡迎關注公眾號<南瓜慢說>,將持續為你更新...

多讀書,多分享;多寫作,多整理。

相關文章