Welcome to YARP - 8.分散式跟蹤

来源:https://www.cnblogs.com/condding-y/archive/2023/11/22/17834152.html
-Advertisement-
Play Games

Welcome to YARP - 1.認識YARP並搭建反向代理服務 Welcome to YARP - 2.配置功能 2.1 - 配置文件(Configuration Files) 2.2 - 配置提供者(Configuration Providers) 2.3 - 配置過濾器(Configur ...


Welcome to YARP - 1.認識YARP並搭建反向代理服務

Welcome to YARP - 2.配置功能

Welcome to YARP - 3.負載均衡

Welcome to YARP - 4.限流

Welcome to YARP - 5.身份驗證和授權

Welcome to YARP - 6.壓縮、緩存

Welcome to YARP - 7.目標健康檢查

Welcome to YARP - 8.分散式跟蹤

這篇文章結束,YARP 的學習就先告一段落了。還有很多省略的章節(比如:中間件、HTTPS和TLS、GRPC等等)。想要瞭解更多的小伙伴可以自己去官網的文檔瞭解。

介紹

在介紹 YARP 的分散式跟蹤之前,我們先來瞭解一下什麼是分散式跟蹤。

當我們構建大型的應用程式或系統時,通常會將其拆分成多個部分,這些部分可能運行在不同的電腦或進程中。這種分散式架構有助於提高系統的可伸縮性和性能,但也增加了故障診斷的難度。分散式跟蹤就像是應用程式的偵探工具,可以幫助工程師找出應用程式中的問題,特別是那些可能橫跨多個電腦或進程的問題。

舉個例子,假設我們有一個典型的網頁服務,用戶發送請求後,這個請求可能經過負載均衡器,然後傳遞給後端的Web伺服器進程,最後可能會涉及資料庫的多次查詢。使用分散式跟蹤,就像我們在調查一樁案件一樣,工程師可以追蹤整個請求的過程。他們能夠分辨每個步驟是否成功,每個步驟花費了多少時間,甚至可以記錄每個步驟產生的詳細信息。

作為 ASP.NET Core 的組件,YARP 可以像任何其他 Web 應用程式一樣輕鬆集成到不同的跟蹤系統中。可以使用以下程式配置分散式跟蹤,詳情參考:

.NET 具有對分散式跟蹤的內置可配置支持,YARP 利用這些支持來啟用此類現成方案。

使用自定義跟蹤標頭

在使用 .NET 不原生支持的傳播機制時,需要創建一個專門的傳播器(DistributedContextPropagator)來處理該機制的上下文信息傳遞。

YARP 會移除 DistributedContextPropagator.Fields( 這是DistributedContextPropagator中的一個屬性或欄位,用於存儲與上下文傳播相關的信息 ) 中的任何標頭,以便在 Inject 調用期間,傳播器可以重新添加它們到請求中。 這個步驟是為了在整個傳播過程中有效地管理標頭信息,以確保它們被適當地處理和傳遞。

透傳代理

如果不希望代理主動參與跟蹤,並希望保留所有跟蹤標頭,您可以通過將SocketsHttpHandler.ActivityHeadersPropagator 設置為null來實現。這表示代理將保持對跟蹤標頭的透明傳遞,而不會主動干預。

services.AddReverseProxy()
    .ConfigureHttpClient((context, handler) => handler.ActivityHeadersPropagator = null);

示例

1.創建項目

dotnet new web -n YARP.Metrics -f net6.0

2.添加項目引用

<ItemGroup>
	<PackageReference Include="Yarp.Telemetry.Consumption" Version="2.1.0" />
</ItemGroup>

這個是 YARP 提供的庫,用來監聽代理操作的各個階段,從而收集有關請求處理的詳細信息和性能指標。

在內部,YARP 使用 EventSource 來收集來自許多用於處理請求的子系統的遙測事件和指標。

要監聽這些指標,需要在 DI(依賴註入)中註冊實現每個功能介面的類。以下是該類庫提供的功能:

功能概述:

  1. Proxy(代理):代表整個代理操作,包括成功或失敗。
    • 事件包括:
      • 代理請求的啟動和停止時
      • 請求/響應主體處理時
    • 指標包括:
      • 啟動的請求數量
      • 進行中的請求數量
      • 失敗的請求數量
  2. Kestrel:處理傳入請求的 Web 伺服器。
    • 事件包括:
      • 請求的啟動/停止或失敗時
    • 指標包括:
      • 連接速率 - 每秒打開的連接數
      • 總連接數
      • TLS 握手次數
      • 入站隊列長度
  3. Http:用於向目標伺服器發出出站請求的 HttpClient。
    • 事件包括:
      • 連接創建時
      • 請求的啟動/停止或失敗時
      • 標頭/內容發送/接收時
      • 請求在連接可用時出隊列時
    • 指標包括:
      • 啟動的出站請求數量
      • 失敗的請求數量
      • 活動請求數量
      • 出站連接數量
  4. Sockets:涉及連接嘗試的事件和有關發送和接收的數據量的指標。
  5. NameResolution:涉及名稱解析嘗試的事件和有關目標的 DNS 查詢的指標。
  6. NetSecurity:涉及 SslStream 握手的事件和有關每個協議的握手數量和延遲的指標。

3.關鍵文件

  • ForwarderTelemetryConsumer(監聽來自代理遙測的事件,記錄與代理請求處理的高級別過程相關的時序和信息。)
  • HttpClientTelemetryConsumer(監聽來自 HttpClient 遙測的事件,記錄與目標伺服器的出站請求和響應相關的時序和信息。)
  • PerRequestMetrics(存儲按每個請求計算的指標的類。實例在請求的整個生命周期記憶體儲在 AsyncLocal 存儲中。)
  • PerRequestYarpMetricCollectionMiddleware(處理請求的第一步和最後一步。它初始化每個請求的指標,併在請求結束時記錄結果。)

4.在DI中註冊

using YARP.Metrics;

var builder = WebApplication.CreateBuilder(args);

var services = builder.Services;

services.AddControllers();

services.AddReverseProxy()
    .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));

services.AddHttpContextAccessor();

// 用於收集有關代理轉發的常規指標的介面
services.AddMetricsConsumer<ForwarderMetricsConsumer>();

// 將使用者註冊到代理轉發器遙測的事件
services.AddTelemetryConsumer<ForwarderTelemetryConsumer>();

// 將使用者註冊到HttpClient遙測事件
services.AddTelemetryConsumer<HttpClientTelemetryConsumer>();

services.AddTelemetryConsumer<WebSocketsTelemetryConsumer>();

var app = builder.Build();

// 收集和報告代理度量的自定義中間件
// 放置在開頭,因此它是每個請求運行的第一件也是最後一件事
app.UsePerRequestMetricCollection();

// 用於攔截WebSocket連接並收集暴露給WebSocketsTemetryConsumer的遙測的中間件
app.UseWebSocketsTelemetry();

app.MapReverseProxy();

app.Run();

5.Appsettings.json配置

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      // "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ReverseProxy": {
    "Routes": {
      "route1": {
        "ClusterId": "cluster1",
        "Match": {
          "Path": "{**catch-all}"
        }
      }
    },
    "Clusters": {
      "cluster1": {
        "Destinations": {
          "cluster1/destination1": {
            "Address": "https://www.baidu.com/"
          }
        }
      }
    }
  }
}

5.運行項目

接下來我們運行項目,就可以看到代理請求的一些指標數據:

image.png

總結

到這裡分散式跟蹤篇章也已經結束了,它在分散式系統中尤為重要,可以分析性能瓶頸,定位錯誤和異常。而且收集的這些遙測數據(指標)可以導出到多種不同的後端存儲或可視化工具中。比如:ZipkinJaegerPrometheus,這都是後話了。有興趣的小伙伴自己研究吧。相關代碼已上傳Github,關鍵文件也都有註釋。至此 YARP 的學習就先告一段落了。還有很多省略的章節(比如:中間件、HTTPS和TLS、GRPC等等)。想要瞭解更多的小伙伴可以自己去官網的文檔瞭解。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • AcWing 演算法基礎課week 1 總結 總結點 1:快速排序(分治思想) 題1:從小到大排序 主體思路:定義一個數x屬於數組s,利用雙指針,將數組分為大於等於x和小於等於x的兩部分,然後遞歸處理。(具體步驟如下) 1. 如上圖所示,我們定義一個數組s用來儲存n個數據,然後定義兩個指針i j,分別 ...
  • Assistants介紹 隨著OpenAI將Assistants助手API對外發佈,我們搭建個人知識庫變的如此簡單。開發者將自己的應用通過Assistants API與OpenAI對接,就可以讓每一位客戶擁有不一般體驗的個人知識庫。由於Assistants相關API有30+,本文只列舉完成一個最小功 ...
  • 事務是保證業務操作完整性的一種資料庫機制,具有原子性、一致性、隔離性和持久性(ACID)的特點。 在Java中,可以通過JDBC和MyBatis來控制事務,底層都是通過Connection對象完成的。 Spring使用AOP的方式進行事務開發,通過將事務的額外功能封裝在DataSourceTrans... ...
  • 事件緣起我在Linux伺服器(CentOS 7.8)安裝Python3.10,並替換python軟鏈接為python3之後,yum命令不可用。特此記錄一下。 完整安裝步驟如下: Python3.10安裝 1.使用yum程式提前安裝Python依賴。 yum install wget zlib-dev ...
  • 作者:FishBones 鏈接:https://juejin.cn/post/7185479136599769125 背景 公司的一個ToB系統,因為客戶使用的也不多,沒啥併發要求,就一直沒有經過壓測。這兩天來了一個“大客戶”,對併發量提出了要求:核心介面與幾個重點使用場景單節點吞吐量要滿足最低50 ...
  • 在本篇文章中,我們總結了Python中的異常捕獲的重要性以及如何進行優化。異常捕獲是一種處理程式在執行過程中出現錯誤的機制,對於程式的穩定性和可靠性至關重要。我們詳細學習了Python中的基本異常捕獲語法,包括try、except、else和finally塊,並舉例了常見的異常類型,總之,閱讀本文只... ...
  • scipy.signal模塊主要用於處理和分析信號。它提供了大量的函數和方法,用於濾波、捲積、傅里葉變換、雜訊生成、周期檢測、譜分析等信號處理任務。 此模塊的主要作用是提供一套完整的信號處理工具,從而幫助用戶對各種連續或者離散的時間序列數據、音頻信號、電信號或其他物理信號進行操作和分析。它支持許多標 ...
  • 回調賦予我們很好的函數處理能力,那麼非同步回調則是在非同步編程中的靈魂,這是不可缺少的存在,本章主要是關於Rust中的trait的說明,希望對你有所幫助 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...