七、搭建springCloudAlibaba2021.1版本分布式微服務-skywalking9.0鏈路追蹤

前言

鏈路追蹤介紹

對于一個大型的幾十個,幾百個微服務構成的微服務架構系統,通常會遇到下面的一系列問題。

  • 如何串聯整個調用鏈路,快速定位問題?
  • 如何澄清各個微服務之間的依賴關系?
  • 如何進行各個微服務接口的性能分析?
  • 如何追蹤各個業務流程的調用處理順序?

Skywalking介紹

Skywalking是一個國產的開源框架,2015年有吳晟個人開源,2017年加入Apache孵化器,國人開源的產品,主要開發人員來自于華為,2019年4月17日Apache董事會批準SkyWalking成為頂級項目,支持Java、.Net、NodeJs等探針,數據存儲支持Mysql、Elasticsearch等,跟Pinpoint一樣采用字節碼注入的方式實現代碼的無侵入,探針采集數據粒度粗,但性能表現優秀,且對云原生支持,目前增長勢頭強勁,社區活躍。
Skywalking是分布式系統的應用程序性能監視工具,專為微服務,云原生架構和基于容器(Docker,K8S,Mesos)架構而設計,它是一款優秀的APM(Application Performance Management)工具,包括了分布式追蹤,性能指標分析和服務依賴分析等。

鏈路追蹤框架對比

目前市面上開源的APM系統主要有CAT、Zipkin、Pinpoint、SkyWalking,大都是參考Google的Dapper實現的

功能和技術方案對比

  • Zipkin是Twitter開源的調用鏈路分析工具,目前基于Spingcloud sleuth得到了廣泛的應用,特點是輕量,部署簡單。
  • Pinpoint:一個韓國團隊開源的產品,運用了字節碼增強技術,只需要在啟動時添加啟動參數即可,對代碼無侵入,目前支持Java和PHP語言,底層采用HBase來存儲數據,探針收集的數據粒度非常細,但性能損耗大,因其出現的時間較長,完成度也很高,應用的公司較多
  • Skywalking是本土開源的基于字節碼注入的調用鏈路分析以及應用監控分析工具,特點是支持多種插件,UI功能較強,接入端無代碼侵入。
  • CAT是由國內美團點評開源的,基于Java語言開發,目前提供Java、C/C++、Node.js、Python、Go等語言的客戶端,監控數據會全量統計,國內很多公司在用,例如美團點評、攜程、拼多多等,CAT跟下邊要介紹的Zipkin都需要在應用程序中埋點,對代碼侵入性強。

下載

APM包下載地址: https://skywalking.apache.org/downloads/

這邊下載的是 v9.0.0 版本

APM 全稱為: Application Performance Management (應用程序性能監視工具),下載的APM包里面就已經包含了skywalking 服務端和UI前端,UI前端是一個web項目,用于展示鏈路追蹤的數據;

注意事項:skywalking在8.8.0版本以后將agent單獨拆分了出來,所以若要使用8.8.0版本以后的,需要下載apm和agent兩個壓縮包。因為我選擇的是9.0.0版本。剛剛已經下載了apm包,所以還需要在下載 agent 的壓縮包,

agent包下載地址:https://dlcdn.apache.org/skywalking/java-agent/8.11.0/apache-skywalking-java-agent-8.11.0.tgz

將這2個文件下載完并且解壓縮后會得到2個目錄:

  • apache-skywalking-apm-bin
  • skywalking-agent

配置

打開 .\apache-skywalking-apm-bin\config\application.yml 文件

skywalking-web-ui服務會占用 8080 端口, 修改端口可以修改webapp/webapp.yml

啟動成功后會啟動兩個服務,一個是skywalking-oap-server,一個是skywalking-web-ui,
skywalking-oap-server服務啟動后會暴露11800 和 12800 兩個端口:

  • 11800 :收集監控數據的端口
  • 12800:接受前端請求的端口

修改端口可以通過 config/applicaiton.yml 文件來修改

agent 配置

修改探針默認配置 skywalking-agent/config/agent.config

# 將127.0.0.1修改為OAP所在的ip地址
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}# 默認值為:-1 (全量收集鏈路),在訪問量較少時,鏈路全量收集不會對系統帶來太大負擔,能夠完整的觀測到系統的運行狀況。但是在訪問量較大時,全量的鏈路收集,對鏈路收集的客戶端(agent探針)、服務端(SkyWalking OAP)、存儲器(例如說 Elastcsearch)都會帶來較大的性能開銷,甚至會影響應用的正常運行。在訪問量級較大的情況下,往往會選擇抽樣采樣,只收集部分鏈路信息。agent.sample_n_per_3_secs 配置項,設置每 3 秒可收集的鏈路數據的數量。
agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:1}

通過docker安裝skywalking 9.0.0

docker中,服務端和 ui是分開的,所以需要安裝2個docker

# 服務端docker run --name oap --restart always -d -p 11800:11800 -p 12800:12800 apache/skywalking-oap-server:9.0.0# Ui 端
docker run --name oap-ui --restart always -d -e SW_OAP_ADDRESS=http://192.168.31.250:12800 -p 8880:8080 apache/skywalking-ui:9.0.0

啟動

根據系統不同,windows雙擊 startup.bat,linux 通過命令 nohup ./startup.sh & 后臺運行

因為我用的windows,啟動后會開啟2個黑窗口

在瀏覽器輸入地址: http://localhost:8080 即可訪問 skywalking

追蹤測試

準備2個服務,user 服務 和 order 服務,通過openfeign遠程調用,

order 服務的controller層代碼如下


import com.alibaba.cloud.client.OpenFeignOrderClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/open/feign")
public class OpenFeignController  {@Autowiredprivate OpenFeignOrderClient openFeignOrderClient;/*** 調用遠程openFeign 接口* @return*/@RequestMapping("/getOrderList")public String getOrderList() {return openFeignOrderClient.getOrderList();}
}

openFeign 接口 ,將此文件放到公共模塊,user和order服務都引用這個公共模塊;

import com.alibaba.cloud.fallback.OpenFeignFallBack;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;@FeignClient(value = "order-demo",path = "order",fallback = OpenFeignFallBack.class)
public interface OpenFeignOrderClient {/*** 獲取訂單列表* @return*/@RequestMapping("/getOrderList")String getOrderList();
}

降級回調處理,也放到公共模塊中

import com.alibaba.cloud.client.OpenFeignOrderClient;
import org.springframework.stereotype.Component;/*** 降級回調類*/
@Component
public class OpenFeignFallBack implements OpenFeignOrderClient {@Overridepublic String getOrderList() {return "openFeign遠程調用暫時不可用,可能的原因是遠程服務未開啟,或者是遠程服務超時或者報錯導致";}
}

order服務添加一個controller,實現openFeign接口,其中,通過代碼int i=1/0;來拋出異常,


import com.alibaba.cloud.client.OpenFeignOrderClient;
import com.alibaba.cloud.dto.UserDto;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/order")
public class OrderController implements OpenFeignOrderClient {// openFeign 的實現接口@Overridepublic String getOrderList() {int i=1/0;return "get Order list success! ";}
}

在啟動前,兩個服務都需要添加vm參數

user
-javaagent:D:\java\skywallking\skywalking-agent\skywalking-agent.jar
-Dskywalking.agent.service_name=user_app

order
-javaagent:D:\java\skywallking\skywalking-agent\skywalking-agent.jar
-Dskywalking.agent.service_name=order_app

skywalking-agent.jar 是什么文件

剛剛我們不是下載了2個壓縮包嗎,skywalking-agent.jar這個文件就在另一個壓縮包內

啟動user服務和order服務

啟動后,在skywalking上就可以看到這2個服務了

在瀏覽器訪問地址http://localhost:8089/open/feign/getOrderList, 毫無疑問,報錯了,因為有降級路基,所以頁面上直接顯示了友好提示,

但order服務確實是報錯了

接下來我們進入到user服務的鏈路追蹤

然后切換到 Topology 頁,這里可以看直觀地看到服務之間的調用關系,第一個User表示是客戶端,誰調用誰都能看的很清楚; 但是必須先調用過之后 skywalking 才知道是誰調用的誰,沒調用的話,是看不到他們之間的關系的,右上角有個調用深度,可以查看最多5級調用,因為我這邊只有3個,所以調整到3就夠了

然后切換到 Trace 頁,這里才是真正的鏈路追蹤,可以看到每個服務之間調用的 controller 層接口; 紅色表示報錯的接口,藍色表示正常訪問的接口;

然后點擊最下面的controller 鏈接,就可以看到拋出的具體異常了

除零異常,跟order的控制臺報的錯誤是一樣一樣的

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93163.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93163.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93163.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入理解大語言模型生成參數:temperature、top\_k、top\_p 等全解析

在使用大語言模型(如 GPT-4、LLaMA、ChatGLM 等)進行文本生成任務時,很多開發者會面對各種“生成參數”,如 temperature、top_k、top_p、repetition_penalty 等。這些參數雖然看起來抽象,但掌握它們的意義和配置技巧&a…

vulhub Web Machine(N7)靶場攻略

下載地址: https://download.vulnhub.com/webmachine/Web-Machine-N7.ova 使用方法: 靶場下載好以后不用解壓,需要使用Oracle VirtualBox虛擬機打開,用VMware會報錯。安裝Oracle VirtualBox虛擬機時安裝地址不能隨便選擇&#…

【機器學習深度學習】模型微調:多久才算微調完成?——如何判斷微調收斂,何時終止訓練

目錄 前言 一、微調過程的目標:優化模型表現 二、微調需要多久? 微調時間無法確定 三、如何判斷微調何時收斂? 3.1 觀察Loss的下降趨勢 3.2 損失值趨于平穩,意味著收斂 如何識別收斂? 3.3 驗證Loss的波動&…

紅隊視角:實戰滲透測試中漏洞利用的進階技巧與防御

紅隊作為滲透測試的 “攻擊方”,其核心價值不僅在于發現漏洞,更在于挖掘漏洞的深度利用方式 —— 通過繞過防護措施、組合低危漏洞形成攻擊鏈,暴露企業真實安全風險。從紅隊視角解析漏洞利用的進階技巧,既能幫助防御方理解攻擊思路…

OpenHarmony BUILD.gn中執行腳本

在OpenHarmony編譯構建中筆者經常遇到這樣的場景——需要執行sh腳本完成某些操作。筆者將OpenHarmony BUILD.gn中執行腳本的方法分享如下: 前置知識點 1.能夠把自定義的子系統加入OpenHarmony源碼的編譯構建,請參考:https://ost.51cto.com/…

QUIC協議如何在UDP基礎上解決網絡切換問題

一、UDP 四元組的本質局限UDP 本身無連接狀態,其數據包僅通過四元組尋址。但 QUIC 在 UDP 之上構建了完整的連接語義。二、QUIC 的連接遷移核心機制1. 連接標識符(Connection ID)關鍵設計:每個 QUIC 連接擁有全局唯一 64-bit Conn…

力扣131:分割回文串

力扣131:分割回文串題目思路代碼題目 給你一個字符串 s,請你將 s 分割成一些 子串,使每個子串都是 回文串 。返回 s 所有可能的分割方案。 思路 從題目中我們可以總結出這道題的三個需要解決的問題: 如何判斷回文串如何找到一種方案里的所…

代駕小程序系統開發:引領出行行業數字化轉型

隨著數字技術的飛速發展,出行行業正經歷著深刻的數字化轉型。代駕小程序系統作為這一轉型的重要推手,以其高效、便捷、智能的特點,引領著出行行業向數字化、網絡化、智能化方向發展。一、數字化管理,提升運營效率代駕小程序系統通…

數獨求解器與生成器(回溯算法實現)

摘要本畢業設計旨在利用MATLAB技術實現一個基于回溯算法的數獨求解器與生成器。通過深入分析數獨游戲的規則和回溯算法的原理,設計并實現了數獨求解的核心算法,同時開發了數獨生成功能,能夠生成符合規則的有效數獨謎題。系統采用MATLAB圖形用…

[數據結構]#7 哈希表

哈希表(Hash Table),有時也稱為散列表,是一種數據結構,它提供了一種快速存取數據的方法。哈希表利用一個被稱為哈希函數的機制將鍵映射到表中的一個位置來直接訪問記錄,以此加快查找的速度。哈希表通常支持…

C++ 23種設計模式-工廠模式

工廠模式是一種創建型的設計模式,他提供了一種創建對象的最佳方式,而無需指定將要創建對象的具體類。包括:簡單工廠模式、工廠方法模式、抽象工廠模式。簡單工廠模式組成成員:抽象產品類、具體產品類 A、B、C等、工廠類工作原理&a…

vue3 el-table 行的某個特定值來決定某些列是否顯示

在 Vue 3 中使用 Element Plus 的 <el-table> 組件時&#xff0c;如果你想要根據行的某個特定值來決定某些列是否顯示&#xff0c;你可以通過自定義列渲染函數&#xff08;render 函數&#xff09;來實現這一需求。下面是一個如何實現該功能的步驟說明和示例代碼。步驟 1…

電商數據采集API與爬蟲技術結合的全網比價方案

一、技術選型與工具準備API優先策略官方API接入&#xff1a;京東、淘寶、拼多多等平臺提供商品詳情API&#xff0c;需注冊開發者賬號獲取API Key。例如&#xff1a;京東API支持實時獲取商品價格、庫存、評價數據。淘寶API通過RESTful接口返回JSON格式的商品信息&#xff0c;需O…

Socket詳解

一.定義Socket&#xff08;套接字&#xff09;是網絡編程的核心&#xff0c;它允許不同主機或同一主機的不同進程之間進行通信&#xff0c;Socket API 提供了一套標準的接口&#xff0c;支持 TCP、UDP、IP 等協議分為以下三個類型&#xff1a;SOCK_STREAM: 用于tcp協議&#xf…

如何實現打印功能

一、AI賦能提供思路基本框架<!-- 隱藏的打印內容&#xff08;默認不顯示&#xff09; --> <div id"print-container" style"display: none;"><h1>退貨單打印內容</h1><table><!-- 打印專用的表格結構 --></table&g…

Android 架構演進:從 MVC 到 MVVM 的設計之道

在 Android 開發初期&#xff0c;很多開發者會把所有邏輯塞進 Activity—— 網絡請求、數據處理、UI 更新全堆在一起&#xff0c;導致代碼超過數千行&#xff0c;改一個按鈕點擊都要翻半天。這種 “面條式代碼” 的根源是缺乏架構設計。隨著應用復雜度提升&#xff0c;MVC、MVP…

使用 gh-pages 將 next.js15 靜態項目部署到 github pages

以下我使用 next.js15 寫的 Todo List 為例,假設我們本地已經存在一個 next.js15 的 Todo List 項目。 說明:解決了項目部署到 github pages 后訪問不到 css、js、字體以及訪問不到 public 目錄下的圖片問題。 第一步 安裝 gh-pages: npm i gh-pages第二步 在 public 目…

rename系統調用及示例

21. rename - 重命名文件或目錄 函數介紹 rename系統調用用于重命名文件或目錄&#xff0c;也可以將文件或目錄移動到另一個位置。如果目標文件已存在&#xff0c;則會被替換。 函數原型 #include <stdio.h>int rename(const char *oldpath, const char *newpath);功能 將…

PHP框架之Laravel框架教程:3. 數據庫操作(簡要)

3. 數據庫操作&#xff08;簡要&#xff09; 配置 數據庫的配置文件在 config/database.php 文件中&#xff0c;你可以在這個文件中定義所有的數據庫連接配置&#xff0c;并指定默認的數據庫連接。這個文件中提供了大部分 Laravel 能夠支持的數據庫配置示例。 mysql > [driv…

項目七.AI大模型部署

環境準備此處使用的是rock linux8.9操作系統k8s集群三個設備&#xff0c;使用centos7.9操作系統設備配置##上傳ollama工具的壓縮包 [rootproject ~]# ll total 1497732 -rw-r--r-- 1 root root 1533674176 Jul 21 11:27 ollama-linux-amd64.tgz [rootproject ~]# tar -C /usr -…