1. 程式人生 > >跟我學SpringCloud | 第十六篇:微服務利劍之APM平臺(二)Pinpoint

跟我學SpringCloud | 第十六篇:微服務利劍之APM平臺(二)Pinpoint

目錄

  • SpringCloud系列教程 | 第十六篇:微服務利劍之APM平臺(二)Pinpoint
    • 1. Pinpoint概述
    • 2. Pinpoint主要特性
    • 3. Pinpoint優勢
    • 4. Pinpoint架構簡介
    • 5. Pinpoint資料結構簡介
    • 6. Pinpoint版本依賴
    • 7. Spring Cloud與Pinpoint實戰
    • 8. 小結

SpringCloud系列教程 | 第十六篇:微服務利劍之APM平臺(二)Pinpoint

Springboot: 2.1.7.RELEASE

SpringCloud: Greenwich.SR2

1. Pinpoint概述

Pinpoint是一個由韓國人編寫的為大型分散式系統服務的鏈路跟蹤平臺,並提供大量鏈路跟蹤資料分析彙總解決方案。自2012年7月開始開發,與2015年1月做為一個開源專案推出。

2. Pinpoint主要特性

  • 分散式事務跟蹤,跟蹤跨分散式應用的訊息。
  • 自動檢測應用拓撲,幫助你搞清楚應用的架構。
  • 水平擴充套件以便支援大規模伺服器叢集。
  • 提供程式碼級別的可見性以便輕鬆定位失敗點和瓶頸。
  • 使用位元組碼增強技術,新增新功能而無需修改程式碼。

3. Pinpoint優勢

  • 無入侵:採用位元組碼增強技術,新增功能無需修改程式碼。
  • 效能高:對效能的影響非常小(資源使用量最小僅增加3%),非同步資料傳輸,採用UDP協議讓出網路連線優先順序。

4. Pinpoint架構簡介

先看一下官方提供的架構圖,如圖:

Pinpoint主要包含了4個元件:

  • Pinpoint Agent:探針,附加到用於分析的Java服務
  • Pinpoint Collector:資料收集元件,部署在Web容器上
  • Pinpoint Web UI:資料展示元件,部署在Web容器上
  • HBase Storage:資料儲存元件

架構圖從上往下看,首先是通過Agent元件收集需要的資料,通過UPD/TCP的方式將資料傳送給Collector,由Collector將資料分析整理過後存入HBase,通過Web UI元件將分析好的資料從HBase中讀出,展示在現代化的UI介面上。

5. Pinpoint資料結構簡介

Pinpoint中,核心資料結構由Span, Trace, 和 TraceId組成。

  • Span: RPC (遠端過程呼叫/remote procedure call)跟蹤的基本單元; 當一個RPC呼叫到達時指示工作已經處理完成幷包含跟蹤資料。為了確保程式碼級別的可見性,Span擁有帶SpanEvent標籤的子結構作為資料結構。每個Span包含一個TraceId。
  • Trace: 多個Span的集合; 由關聯的RPC (Spans)組成. 在同一個trace中的span共享相同的TransactionId。Trace通過SpanId和ParentSpanId整理為繼承樹結構.
  • TraceId: 由 TransactionId, SpanId, 和 ParentSpanId 組成的key的集合. TransactionId 指明訊息ID,而SpanId 和 ParentSpanId 表示RPC的父-子關係。
    • TransactionId (TxId): 在分散式系統間單個事務傳送/接收的訊息的ID; 必須跨整個伺服器叢集做到全域性唯一.
    • SpanId: 當收到RPC訊息時處理的工作的ID; 在RPC請求到達節點時生成。
    • ParentSpanId (pSpanId): 發起RPC呼叫的父span的SpanId. 如果節點是事務的起點,這裡將沒有父span - 對於這種情況, 使用值-1來表示這個span是事務的根span。

6. Pinpoint版本依賴

  • Pinpoint所需要的Java版本相容:
Pinpoint Version Agent Collector Web
1.0.x 6-8 6-8 6-8
1.1.x 6-8 7-8 7-8
1.5.x 6-8 7-8 7-8
1.6.x 6-8 7-8 7-8
1.7.x 6-8 8 8
1.8.0 6-10 8 8
1.8.1+ 6-11 8 8
  • HBase所需要的版本相容
Pinpoint Version HBase 0.94.x HBase 0.98.x HBase 1.0.x HBase 1.2.x HBase 2.0.x
1.0.x yes no no no no
1.1.x no not tested yes not tested no
1.5.x no not tested yes not tested no
1.6.x no not tested not tested yes no
1.7.x no not tested not tested yes no
1.8.x no not tested not tested yes no
Pinpoint Version HBase 0.94.x HBase 0.98.x HBase 1.0.x HBase 1.2.x HBase 2.0.x
  • Agent - Collector所需要的版本相容
Agent Version Collector 1.0.x Collector 1.1.x Collector 1.5.x Collector 1.6.x Collector 1.7.x Collector 1.8.x
1.0.x yes yes yes yes yes yes
1.1.x not tested yes yes yes yes yes
1.5.x no no yes yes yes yes
1.6.x no no not tested yes yes yes
1.7.x no no no no yes yes
1.8.x no no no no no yes
Agent Version Collector 1.0.x Collector 1.1.x Collector 1.5.x Collector 1.6.x Collector 1.7.x Collector 1.8.x
  • Flink所需要的版本相容
Pinpoint Version flink 1.3.X flink 1.4.X flink 1.5.X flink 1.6.X flink 1.7.X Pinpoint Version
1.7.x yes yes no no no 1.7.x
1.8.x yes yes no no no 1.8.x
1.9.x yes yes yes yes yes 1.9.x
Pinpoint Version flink 1.3.X flink 1.4.X flink 1.5.X flink 1.6.X flink 1.7.X Pinpoint Version
1.7.x yes yes no no no 1.7.x
1.8.x yes yes no no no 1.8.x
1.9.x yes yes yes yes yes 1.9.x

7. Spring Cloud與Pinpoint實戰

在介紹實戰之前,我們先介紹一下Pinpoint部署構建。

筆者構建的一些前置條件:

java:1.8
CentOS:7.6

  1. HBase部署

儲存方式需要使用HBase1.2.x的版本,筆者這裡選擇的是HBase1.2.6,下載地址為Apache官網,推薦使用有端點續傳功能的下載器下載(實在是有點慢),HBase全版本下載地址:http://archive.apache.org/dist/hbase/ ,各位讀者選擇自己喜歡的版本下載。

下載完成後,將HBase1.2.6放入CentOS的opt目錄中,執行如下命令:

tar -xvzf hbase-1.2.6-bin.tar.gz
mv hbase-1.2.6/ /data/service/hbase/

修改hbase中config目錄中的JAVA_HOME,將這裡的JAVA_HOME修改為自己本地的路徑,筆者這裡修改如下:

export JAVA_HOME=/opt/jdk1.8.0_221

修改完成後就可以進入hbase的bin目錄,啟動hbase了,執行如下語句:

./start-hbase.sh

啟動成功後,可以執行jps,如果看到有HMaster,可有證明啟動成功,如下:

19263 HMaster

也可以開啟瀏覽器訪問:http://ip:16010/master-status ,結果如圖:

接下來我們先把Pinpoint的HBase的構建指令碼匯入,進入HBase的bin目錄下執行如下語句:

./hbase shell /opt/hbase-create.hbase

資料匯入成功我們在HBase的UI介面上可以看到,如圖:

後面的目錄是筆者用來存放HBase初始化指令碼的路徑,各位讀者可根據情況自行替換,至此,HBase環境準備完成,接下來開始部署Collector和Web UI。

  1. Collector和Web UI部署

出於簡單方便考慮,不推薦初學者自行編譯程式碼進行部署,可以直接使用官方提供的發行版本進行部署。

瀏覽器訪問連結:https://github.com/naver/pinpoint/releases/ ,直接下載當前最新Release版本即可,筆者現在看到的最新版本是1.8.4,如圖,需要下載的內容有pinpoint-agent-1.8.4.tar.gzpinpoint-collector-1.8.4.warpinpoint-web-1.8.4.war

首先需要準備兩個tomcat,筆者這裡下載的tomcat8,解壓兩份後並重命名為apache-tomcat-pinpoint-collectorapache-tomcat-pinpoint-web

apache-tomcat-pinpoint-collector中的config中的server.xml進行修改。

將8005改成18005,8080改成18080,8443改為18443,8009改為18009。

同樣也將apache-tomcat-pinpoint-web中的config中的server.xml進行修改。

將8005改成28005,8080改成28080,8443改為28443,8009改為28009。

apache-tomcat-pinpoint-collector中的webapp/ROOT清空,將pinpoint-collector-1.8.4.war放入並解壓。解壓完成後就可以進入bin目錄使用./startup.sh啟動tomcat了,並且使用命令tail -f ../logs/catalina.out觀察啟動日誌是否啟動成功。

同樣,將apache-tomcat-pinpoint-web中的webapp/ROOT清空,將pinpoint-web-1.8.4.war放入並解壓。解壓完成後就可以進入bin目錄使用./startup.sh啟動tomcat了,並且使用命令tail -f ../logs/catalina.out觀察啟動日誌是否啟動成功。

當Collector和Web UI都啟動成功後,就可以使用開啟瀏覽器訪問:http://ip:28080/#/main ,初次訪問如圖:

  1. Agent啟用

實戰案例,本實戰案例和上一篇實戰案例保持一致,同樣是4個服務,包括Zuul-Service、Eureka-Service、Consumer-Service和Provider-Service。具體實現程式碼本章不再列出,各位讀者可以參考上一篇或者Github倉庫(https://github.com/meteor1993/SpringCloudLearning/tree/master/chapter15),下面我們介紹Spring Cloud是如何與Pinpoint整合使用的。

接入方式和上一篇的Skywalking是一致的,都是使用探針技術接入應用程式,java -jar的方式來載入Agent探針。

首先在工程的跟目錄中執行mvn install,而後在CentOS的opt中新建4個目錄,分別存放4個打好包的工程。筆者這裡建立的4個目錄分別為/opt/project/consumer_service/opt/project/eureka_service/opt/project/provider_service/opt/project/zuul_service,將4個jar包分別放入對應的目錄中,並解壓剛才我們下載好的pinpoint-agent-1.8.4.tar.gz探針,我們將解壓後的探針放在/opt的目錄中,接下來,我們使用如下命令,順次啟動4個jar包:

java -javaagent:/opt/pinpoint-bootstrap-1.8.4.jar -Dpinpoint.agentId=consumer-service -Dpinpoint.applicationName=consumer-server -jar /opt/project/consumer_service/consumer-0.0.1-SNAPSHOT.jar

java -javaagent:/opt/pinpoint-bootstrap-1.8.4.jar -Dpinpoint.agentId=eureka-service -Dpinpoint.applicationName=eureka-server -jar /opt/project/eureka_service/eureka-0.0.1-SNAPSHOT.jar

java -javaagent:/opt/pinpoint-bootstrap-1.8.4.jar -Dpinpoint.agentId=provider-service -Dpinpoint.applicationName=provider-server -jar /opt/project/provider_service/provider-0.0.1-SNAPSHOT.jar

java -javaagent:/opt/pinpoint-bootstrap-1.8.4.jar -Dpinpoint.agentId=zuul-service -Dpinpoint.applicationName=zuul-server -jar /opt/project/zuul_service/zuul-0.0.1-SNAPSHOT.jar

上述命令執行完成之後,再開啟Web UI檢視顯示情況。

首先開啟瀏覽器訪問:http://192.168.44.129:8080/client/hello?name=spring ,頁面正常顯示Hello, name is spring,檢視Pinpoint的Web UI,如圖:

圖清楚的顯示了我們當前系統的拓撲結構,橫線上面的數字代表了呼叫次數,右邊部分,最上面顯示的是成功和失敗的情況,中間部分顯示的是響應時間,下面顯示的是載入所使用的時間。

檢查器(Inspector):這裡已Zuul-Service為例,Timeline顯示的是請求的時間段,Information顯示的是節點的一些當前資訊,包含Application Name、Agent Id、Agent版本、JVM資訊、開始時間等。

Heap資訊的使用情況,如圖:

系統CPU、活動執行緒、響應時間等資訊如圖:

更多Pinpoint的資訊,讀者可以通過官方Demo(http://125.209.240.10:10123/#/main )或者自行構建試驗來檢視結果,這裡不再一一贅述。至此,Spring Cloud和Pinpoint的使用介紹也就完成了。更多有關Pinpoint的資訊各位讀者可以前往Github的官網進行查閱,地址為:https://github.com/naver/pinpoint 。

8. 小結

這裡總結一下整個案例的啟動順序:

  1. 啟動HBase
  2. 啟動collector
  3. 啟動Web-UI
  4. 啟動Agent(Eureka、provider、consumer、zuul)
  5. 應用呼叫
  6. 訪問Web-UI檢視統計資訊

同Skywalking一樣,以上啟動順序供各位讀者參考,請各位讀者最好按照以上順序啟動,因為不同的元件之前其實是有相互依賴關係的,如果隨意更改啟動順序可能會造成某些未知問題。至此,Spring Cloud和APM的相關操作就告一段落了。APM可以很好的幫我們理解系統行為,也是分析系統性能的工具,更是發生問題故障的時候利器,可以幫我們快速的定位查詢問題。