主頁 > 後端開發 > 【分布式鏈路追蹤】Skywalking分布式鏈路追蹤基于Docker安裝與使用

【分布式鏈路追蹤】Skywalking分布式鏈路追蹤基于Docker安裝與使用

2023-02-03 06:27:09 後端開發

1. 服務監控三要素[1]

服務監控需要滿足的三要素分別如下:

  • 日志監控
  • 指標監控
  • 請求鏈路追蹤

服務監控只要能滿足這三個要素,基本就能實作我們想要的監控效果,

1.1.主流APM系統[1:1]

APM 系統(Application Performance Management,即應用性能管理)是對企業的應用系統進行實時監控,實作對應用性能管理和故障定位的系統化解決方案,在運維中常用,

  • CAT(開源): 由國內美團點評開源的,基于 Java 語言開發,目前提供 Java、C/C++、Node.js、Python、Go 等語言的客戶端,監控資料會全量統計,國內很多公司在用,例如美團點評、攜程、拼多多等,CAT 需要開發人員手動在應用程式中埋點,對代碼侵入性比較強,
  • Zipkin(開源): 由 Twitter 公司開發并開源,Java 語言實作,侵入性相對于 CAT 要低一點,需要對web.xml 等相關組態檔進行修改,但依然對系統有一定的侵入性,Zipkin 可以輕松與 Spring Cloud 進行集成,也是 Spring Cloud 推薦的 APM 系統,
  • Pinpoint(開源): 韓國團隊開源的 APM 產品,運用了位元組碼增強技術,只需要在啟動時添加啟動引數即可實作 APM 功能,對代碼無侵入,目前支持 Java 和 PHP 語言,底層采用 HBase 來存盤資料,探針收集的資料粒度非常細,但性能損耗較大,因其出現的時間較長,完成度也很高,檔案也較為豐富,應用的公司較多,
  • SkyWalking(開源): 國人開源的產品,2019 年 4 月 17 日 SkyWalking 從 Apache 基金會的范訓器畢業成為頂級專案,目前 SkyWalking 支持 Java、.Net、Node.js 等探針,資料存盤支持MySQL、ElasticSearch等,
  • 還有很多不開源的 APM 系統,例如,淘寶鷹眼、Google Dapper 等等,

2. SkyWalking[2]

SkyWalking 是分布式系統的應用程式性能監視工具,專為微服務、云原生架構和基于容器(Docker、K8s、Mesos)架構而設計,

提供分布式追蹤、服務網格遙測分析、度量聚合和可視化一體化解決方案

2.1 功能串列

  • 多種監控手段,可以通過語言探針和 service mesh 獲得監控是資料,
  • 多個語言自動探針,包括 Java,.NET Core 和 Node.JS,
  • 輕量高效,無需大資料平臺,和大量的服務器資源,
  • 模塊化,UI、存盤、集群管理都有多種機制可選,
  • 支持告警,
  • 優秀的可視化解決方案,

2.2 整體架構

0081Kckwly1gkl533fk5xj31pc0s8h04

整個架構,分成上、下、左、右四部分:

  • 上部分 Agent :負責從應用中,收集鏈路資訊,發送給 SkyWalking OAP 服務器,目前支持 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 資料資訊,而我們目前采用的是,SkyWalking Agent 收集 SkyWalking Tracing 資料,傳遞給服務器,
  • 下部分 SkyWalking OAP :負責接收 Agent 發送的 Tracing 資料資訊,然后進行分析(Analysis Core) ,存盤到外部存盤器( Storage ),最終提供查詢( Query )功能,
  • 右部分 Storage :Tracing 資料存盤,目前支持 ES、MySQL、Sharding Sphere、TiDB、H2 多種存盤器,而我們目前采用的是 ES ,主要考慮是 SkyWalking 開發團隊自己的生產環境采用 ES 為主,
  • 左部分 SkyWalking UI :負責提供控臺,查看鏈路等等,

2.3 搭建SkyWalking 單機環境

0081Kckwly1gkl533oq0xj30ww0pomzt

  • 第一步,搭建一個 Elasticsearch 服務,
  • 第二步,下載 SkyWalking 軟體包,
  • 第三步,搭建一個 SkyWalking OAP 服務,
  • 第四步,啟動一個 Spring Boot 應用,并配置 SkyWalking Agent,
  • 第五步,搭建一個 SkyWalking UI 服務,

環境說明

作業系統:Centos 7.6

Docker:20.10.18

Skywalking OAP:8.9.1

Skywalking UI:8.9.1

Skywalking Agent:8.14

Elasticsearch:7.1.1

下載鏡像

docker pull docker.io/elasticsearch:7.1.1
docker pull apache/skywalking-ui:8.9.1
docker pull apache/skywalking-oap-server:8.9.1

說明:Skywalking 8.9.1是 Skywalking 8 的最后一個版本,并且修復了Log4j的JNDI注入漏洞CVE-2021-44228

下載鏡像時如提示 command not found ,請先去安裝docker

下載Java Agent原始碼包,后續在專案中會用到

https://archive.apache.org/dist/skywalking/java-agent/8.14.0/apache-skywalking-java-agent-8.14.0.tgz

安裝Elasticsearch

先運行es容器

docker run -d --name=es  --restart=always  -p 9200:9200 -p 9300:9300  -e "discovery.type=single-node"  -e ES_JAVA_OPTS="-Xms2048m -Xmx2048m" b0e9f9f047e6

可根據自己的情況修改 ES_JAVA_OPTS 的值

創建持久化檔案

mkdir -p /home/elasticsearch/

復制容器內的檔案

docker cp es:/usr/share/elasticsearch/data /home/elasticsearch/
docker cp es:/usr/share/elasticsearch/logs /home/elasticsearch/

洗掉es容器

docker rm -f es

以掛載模式運行

docker run -d --name=es  --restart=always  -p 9200:9200 -p 9300:9300  -e "discovery.type=single-node" -v /home/elasticsearch/data:/usr/share/elasticsearch/data  -v /home/elasticsearch/logs:/usr/share/elasticsearch/logs -e ES_JAVA_OPTS="-Xms2048m -Xmx2048m" b0e9f9f047e6

使用 docker logs -f es 查看啟動日志,當看到下面的內容時說明啟動成功

"publish_address {172.17.0.2:9300}, bound_addresses {0.0.0.0:9300}"

或者訪問 http://ip:9200 時出現下面內容也說明啟動成功

{
  "name" : "a1c4bc953b44",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "sjssODkzTTy0bTrTEqlZfQ",
  "version" : {
    "number" : "7.1.1",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "7a013de",
    "build_date" : "2019-05-23T14:04:00.380842Z",
    "build_snapshot" : false,
    "lucene_version" : "8.0.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

進入容器內安裝ik分詞器

 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.1.1/elasticsearch-analysis-ik-7.1.1.zip

Elasticsearch設定密碼訪問[3]

進入容器

docker exec -it es /bin/bash

修改組態檔

vi config/elasticsearch.yml

在檔案尾部添加如下內容

# 開啟跨域訪問 允許外部連接
http.cors.enabled: true
http.cors.allow-origin: "*"
# 開啟密碼驗證
xpack.security.enabled: true
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: true

重啟ES容器后再進入容器內,執行如下命令

./elasticsearch-setup-passwords interactive

然后輸入你想設定的密碼,我這里密碼設定為 yourpassword 方便后續演示

接下來就是會默認的創建6個用戶,并讓你設定這6個用戶的密碼,忽略掉用戶名,這些用戶權限都是相同的,設定完成以后,這時候再訪問es的地址,就會提示需要授權輸入賬號密碼訪問了

安裝 Skywalking OAP[4]

等待elasticsearch完全啟動完后,再啟動oap

docker run --name oap-8.9.1 -d --restart=always -e TZ=Asia/Shanghai -p 12800:12800 -p 11800:11800 --link es:es -e SW_STORAGE=elasticsearch -e SW_STORAGE_ES_CLUSTER_NODES=es:9200 -e SW_ES_USER=elastic -e SW_ES_PASSWORD=yourpassword apache/skywalking-oap-server:8.9.1

這里指定了ES存盤資料,并輸入ES授權的賬戶密碼

安裝 Skywalking UI

docker run -d --name skywalking-ui-8.9.1 --restart=always -e TZ=Asia/Shanghai -p 8088:8080 --link oap-8.9.1:oap -e SW_OAP_ADDRESS=http://oap:12800 apache/skywalking-ui:8.9.1

這里映射的埠為8088,防止埠沖突,也可根據你的情況設定

命令中 oap-8.9.1:oap 的 oap-8.9.1 是已運行并需要連接的容器名,oap是取的別名,后續容器內請求 http://oap/ 便會請求到 oap-8.9.1 容器內,并且別名不能有 . 的出現,防止地址決議失敗

啟動完成后請求 http://ip:8088/

image-20230201224751921

因為懶加載機制,當有請求時才會有資料顯示,當第一次訪問時會沒有資料

2.4 專案集成Skywalking

將上面下載到的 Java Agent 拷貝到專案能訪問到的地址,增加JVM的啟動引數

-javaagent:D:\tools\skywalking-agent-8.14\skywalking-agent.jar
-Dskywalking.agent.service_name=xxx-server
-Dskywalking.collector.backend_service=ip:11800
-Dskywalking.plugin.jdbc.trace_sql_parameters=true

trace_sql_parameters 引數為true時會收集sql陳述句的占位引數

image-20230202105159724

更多詳細引數請參考[5]

IDEA中啟動專案

image-20230202110112966

image-20230202110156573

命令啟動專案

如使用命令啟動,在java -jar xxx.jar 中增加命令

java -jar -javaagent:D:\tools\skywalking-agent-8.14\skywalking-agent.jar -Dskywalking.agent.service_name=xxx-server -Dskywalking.collector.backend_service=ip:11800 -Dskywalking.plugin.jdbc.trace_sql_parameters=true xxx.jar

Docker 啟動專案[6]

我們構建java運行的jdk基礎鏡像時,加入skywalking agent

Dockerfile:

# FROM openjdk:8-jdk-alpine
FROM adoptopenjdk/openjdk8
VOLUME /tmp
# 其他的一些運行引數可以放這里,比如-Xmx1024m 
ENV JAVA_OPTS=""
ENV SKYWALKING_AGENT_SERVICE_NAME="xxx-server"
ENV SKYWALKING_COLLECTOR_BACKEND_SERVICE="ip:1088"
ENV SKYWALKING_PLUGIN_JDBC_TRACE_SQL_PARAMETERS="true"
COPY /etc/localtime /etc/localtime
# 這里是agent的檔案夾,按照自己的情況設定
COPY /opt/skywalking-agent-8.14 /usr/local/agent
RUN echo "Asia/Shanghai" > /etc/timezone
ONBUILD COPY app.jar app.jar
ENTRYPOINT [ "java", "-jar", " $JAVA_OPTS -javaagent:/usr/local/agent/skywalking-agent.jar -Dskywalking.agent.service_name=$SKYWALKING_AGENT_SERVICE_NAME -Dskywalking.collector.backend_service=$SKYWALKING_COLLECTOR_BACKEND_SERVICE -Dskywalking.collector.backend_service=$SKYWALKING_COLLECTOR_BACKEND_SERVICE -Dskywalking.plugin.jdbc.trace_sql_parameters=$SKYWALKING_PLUGIN_JDBC_TRACE_SQL_PARAMETERS app.jar" ]

然后在Dockerfile所在目錄通過docker build -t 鏡像名 構建好鏡像即可運行

2.5 專案日志收集

logback日志收集[7]

<!-- 如果想在專案代碼中獲取鏈路TraceId,則需要引入此依賴 -->
        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-trace</artifactId>
            <version>8.14.0</version>
        </dependency>
<!-- skywalking logback插件 -->
        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-logback-1.x</artifactId>
            <version>8.14.0</version>
        </dependency>

撰寫logback日志組態檔,在resources下新建一個logback-spring.xml檔案,根據官網檔案撰寫組態檔,可以寫作以下兩種,
兩者的區別就是layout中是采用TraceIdPatternLogbackLayout還是TraceIdMDCPatternLogbackLayout,如果采用TraceIdMDCPatternLogbackLayout,需要將[%tid]改為[%X{tid}]

    <!-- 是指列印到控制臺 -->
    <appender name="STDOUT" >
        <encoder >
            <layout >
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern>
            </layout>
        </encoder>
    </appender>

	<!-- with the MDC, set %X{tid} in Pattern -->
	<!-- MDC是什么:MDC采用Map的方式存盤背景關系,執行緒獨立的,子執行緒會從父執行緒拷貝背景關系 -->
    <appender name="GRPC" >
        <encoder >
            <layout >
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
            </layout>
        </encoder>
    </appender>
	<root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="GRPC"/>
    </root>

其他日志框架的引入詳見官網


參考鏈接


  1. 全網最詳細的Skywalking分布式鏈路追蹤 ?? ??

  2. SkyWalking 極簡入門 ??

  3. elastic search添加密碼驗證、并且使用postman訪問帶密碼的es ??

  4. 基于docker部署skywalking實作全鏈路監控 ??

  5. Table of Agent Configuration Properties ??

  6. 基于docker部署的專案如何和skywalking agent進行整合 ??

  7. skywalking指南—agent日志采集和插件 ??

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/542843.html

標籤:Java

上一篇:Dubbo 入門系列之基于 Dubbo API 開發微服務應用

下一篇:Java里面為什么搞了雙重檢查鎖,寫完這篇文章終于真相大白了

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more