實例講解Springboot整合OpenTracing分佈式鏈路追蹤系統

1 分佈式追蹤系統

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

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

三者相互交織重疊如下:

實例講解Springboot整合OpenTracing分佈式鏈路追蹤系統

技術棧上的成熟框架有,

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規範。它是一個輕量級的標準化層,連接應用、類庫和追蹤系統。

實例講解Springboot整合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。架構如下:

實例講解Springboot整合OpenTracing分佈式鏈路追蹤系統

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

實例講解Springboot整合OpenTracing分佈式鏈路追蹤系統

3 實戰整合

本文以Springboot為Web項目,分別整合Jaeger和Zipkin。

3.1 Springboot項目準備

項目中的Controller,提供了兩個Endpoint,tracing和open;在訪問open時,代碼會調用tracing。

<code>@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();
}
}
/<string>/<code>

為了能夠方便看出調用時長信息,特別在代碼中增加了延時Thread.sleep()。

配置Web應用的端口和服務名字:

<code>server.port=80
spring.application.name=opentracing-demo
/<code>

3.2 整合Jaeger

3.2.1 Springboot整合

引用依賴:

<code><dependency>
<groupid>io.opentracing.contrib/<groupid>
<artifactid>opentracing-spring-jaeger-web-starter/<artifactid>
<version>3.1.1/<version>
/<dependency>
/<code>

配置連接屬性:

<code>opentracing.jaeger.enabled=true
opentracing.jaeger.udp-sender.host=localhost
opentracing.jaeger.udp-sender.port=6831
/<code>

3.2.2 Docker運行Jaeger

為了方便,使用docker來運行Jaeger:

<code># 拉取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

/<code>

以上端口的信息如下:

實例講解Springboot整合OpenTracing分佈式鏈路追蹤系統

3.2.3 運行與訪問UI

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

http://localhost/open

http://localhost/tracing

訪問Jaeger UI界面http://localhost:16686/,設置好查詢條件後點擊Find Traces,就能查看到Trace信息了,具體如下:

實例講解Springboot整合OpenTracing分佈式鏈路追蹤系統

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

實例講解Springboot整合OpenTracing分佈式鏈路追蹤系統

3.3 Zipkin

3.3.1 Springboot整合

引用相關依賴:

<code><dependency>
<groupid>io.opentracing.contrib/<groupid>
<artifactid>opentracing-spring-zipkin-web-starter/<artifactid>
<version>0.1.4/<version>
/<dependency>
/<code>

配置相關連接信息:

<code>opentracing.zipkin.enabled=true
opentracing.zipkin.http-sender.base-url=http://localhost:9412/

/<code>

3.3.2 Docker運行Zipkin

通過Docker運行Zipkin實例:

<code># 拉取Zipkin鏡像
docker pull openzipkin/zipkin:2.21
# 運行Zipkin實例
docker run -d -p 9412:9411 openzipkin/zipkin:2.21
/<code>

因為本機的端口9411已經被Jaeger的docker實例佔用,所以改為9412。

3.3.3 運行與訪問UI

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

http://localhost/open

http://localhost/tracing

訪問Zipkin UI界面http://localhost:9412/zipkin/,設置好查詢條件後點擊查詢,就能查看到Trace信息了,具體如下:

實例講解Springboot整合OpenTracing分佈式鏈路追蹤系統

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


分享到:


相關文章: