續上篇,這篇我們來進一步探索 Tye 更多的使用方法。本篇我們來了解一下如何在 Tye 中實現對分佈式鏈路追蹤。
Newbe.Claptrap 是一個用於輕鬆應對併發問題的分佈式開發框架。如果您是首次閱讀本系列文章。建議可以先從本文末尾的入門文章開始瞭解。
我是誰?我在哪兒?我咋了?
分佈式系統紛繁複雜,特別以現在微服務架構的出現,使得應用系統中的應用實例變得更加多變難以捉摸。
那麼如何在如此繁雜的系統中找到一條業務調用鏈的上下游關係、性能細節、業務數據等等成爲了一項開發者必然要面對的挑戰。
使用分佈式鏈路追蹤系統無非是解決該問題的一個良好方法。目前市面上也有非常多可用的開源方案,其中不乏開箱即用的優秀用例:SkyWalking、Jaeger 和 Zipkin 等等。
本篇,我們將探索 Tye 中已經實現擴展的 Zipkin 來演示一下分佈式鏈路追蹤的簡易效果。
創建測試應用
要測試分佈式情況,那麼至少需要兩個應用實例才能夠體現效果。因此,此處創建兩個測試服務實例:
create-tye-zipkin-test.sh
dotnet new sln -n TyeTest dotnet new webapi -n TyeTest dotnet add ./TyeTest/TyeTest.csproj package Microsoft.Tye.Extensions.Configuration --version 0.6.0-alpha.21070.5 dotnet sln ./TyeTest.sln add ./TyeTest/TyeTest.csproj dotnet new webapi -n TyeTest2 dotnet sln ./TyeTest.sln add ./TyeTest2/TyeTest2.csproj tye init |
在 TyeTest 項目的 Startup.cs 增加對 HttpClientFactory 的註冊。
public void ConfigureServices(IServiceCollection services) { + services.AddHttpClient(); services.AddControllers(); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "TyeTest", Version = "v1" }); }); } |
進入 WeatherForecastController, 我們使用 HttpClient 來調用下游服務,並且將得到的數據返回:
using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Text.Json; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; namespace TyeTest.Controllers { [ApiController] [Route("[controller]")] public class WeatherForecastController : ControllerBase { private readonly ILogger<WeatherForecastController> _logger; private readonly IConfiguration _configuration; private readonly HttpClient _httpClient; public WeatherForecastController(ILogger<WeatherForecastController> logger, IConfiguration configuration, HttpClient httpClient) { _logger = logger; _configuration = configuration; _httpClient = httpClient; } [HttpGet] public async Task<string> Get() { var serviceUri = _configuration.GetServiceUri("tyetest2"); Console.WriteLine(serviceUri); var httpResponseMessage = await _httpClient.GetAsync($"{serviceUri}WeatherForecast"); var json = await httpResponseMessage.Content.ReadAsStringAsync(); return json; } } } |
這樣,我們就得到了一個在服務 TyeTest 中調用 TyeTest2 的一個服務間調用的示例。
這其實和 使用 Tye 輔助開發 k8s 應用竟如此簡單(二) 中得到的測試用例是相同的。
然後使用 tye run
便可以啓用測試應用。開發者可以在 swagger 頁面中測試具體的效果。
但是!其實沒完。此處我們還需要修改 Program.cs
變更默認的 Activity.DefaultIdFormat
:
Program.cs
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; namespace TyeTest { public class Program { public static void Main(string[] args) { Activity.DefaultIdFormat = ActivityIdFormat.W3C; CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); } } |
注意,兩個應用都需要修改。
這將會在消息請求頭中添加這是一種符合 W3C 標準追蹤頭信息。不過,如果開發者是 net5 應用,則不需要變更了,因爲這已經是默認行爲。有關此內容的詳細信息,開發者可以參閱:
- https://devblogs.microsoft.com/aspnet/improvements-in-net-core-3-0-for-troubleshooting-and-monitoring-distributed-apps/
- https://docs.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/5.0/default-activityidformat-changed
啓用 Zipkin
接下來,我們修改 tye.yml 來啓用 zipkin 以監控服務間的調用:
tye.yml
name: tyetest extensions: - name: zipkin services: - name: tyetest project: TyeTest/TyeTest.csproj - name: tyetest2 project: TyeTest2/TyeTest2.csproj |
沒錯,其實只是加了 extensions
就完成了。
使用 tye run
,啓動應用,便可以在 dashboard 中查看到自動部署起來的 zipkin:
打開對應鏈接,便可以看到對應的 zipkin 查詢界面:
然後,我們打開 tyetest 服務的 swagger 界面,進行一次調用。然後在回來查詢,便可以查詢到服務調用的情況:
點擊其中的 Show 按鈕,便可以查看到一次服務調用的詳細過程信息:
這就是使用 zipkin 對 http 調用進行追蹤的最簡易示例。
自行部署 Zipkin
和 seq 一樣,開發者可以使用已經部署好的 zipkin 以便重複利用,避免每次都要啓動浪費時間。
docker-compose.yml
version: '3.3' services: zipkin: image: openzipkin/zipkin restart: always container_name: zipkin ports: - 9411:9411 |
tye.yml
name: tyetest extensions: - name: zipkin services: - name: tyetest project: TyeTest/TyeTest.csproj - name: tyetest2 project: TyeTest2/TyeTest2.csproj - name: zipkin external: true bindings: - name: http containerPort: 9411 |
和 seq 一樣,通過自行部署 zipkin 實例。然後修改 tye.yml 使得服務得以連接。預期效果與前面一節相同。但是節約了每次啓動都需要啓動 zipkin 實例的時間。
Jaeger 也可以
實際上,只要是 zipkin 協議兼容的收集端,那麼都可以被這種方式集成。因此,我們該用 Jaeger 作爲後端進行測試。
docker-compose.yml
version: '3.3' services: jaeger: image: jaegertracing/all-in-one:1.21 restart: always ports: - 9411:9411 - 16686:16686 environment: COLLECTOR_ZIPKIN_HTTP_PORT: 9411 |
tye.yml
和先前對比沒有變化。
啓用並測試應用。便可以在 jaeger dashboard 得到類似的結果:
當然,使用與 Zipkin 兼容的 SkyWalking 也是可以的,開發者可以自行嘗試。
更詳細的追蹤
如果在應用程序中需要更加細緻的追蹤細節,那麼可以使用 OpenTelemetry 相關的類庫在系統中進行集成。然後通過 Tye 獲取對應服務的 connectionString 便可以實現自行導出特定的活動細節。
這裏,開發者可以參照 使用 Tye 輔助開發 k8s 應用竟如此簡單(二) 中連接 mongodb 的方式進行實驗。
《OpenTelemetry .NET》
https://github.com/open-telemetry/opentelemetry-dotnet
《OpenTelemetry - 雲原生下可觀測性的新標準》
https://blog.csdn.net/sd7o95o/article/details/112645413
最後,發到 K8S 裏面試一下
注意,和前面的 seq 一樣。 tye deploy
並不會自動部署對應的 zipkin 服務。
因此,如果要部署 extensions
包含 zipkin 的 tye.yml。請確保 k8s 集羣中存在名稱爲 zipkin 的服務,這樣數據纔會被收集。
小結
本篇,我們已經順利完成了使用 Tye 中的 zipkin 擴展來實現分佈式鏈路追蹤。
下一篇,我們將進一步研究 Tye 如何與分佈式應用程序運行時 Dapr 如何碰撞出更精彩的火花。
最後但是最重要!
如果讀者對該內容感興趣,歡迎轉發、評論、收藏文章以及項目。
最近作者正在構建以 Actor 模式 和 事件溯源 爲理論基礎的一套服務端開發框架。希望爲開發者提供能夠便於開發出 “分佈式”、“可水平擴展”、“可測試性高” 的應用系統 ——Newbe.Claptrap
本篇文章是該框架的一篇技術選文,屬於技術構成的一部分。
項目文檔庫:claptrap.newbe.pro
聯繫方式: QQ 羣 610394020
您還可以查閱本系列的其他選文:
理論入門篇
術語介紹篇
- Actor 模式
- 事件溯源(Event Sourcing)
- Claptrap
- Minion
- 事件 (Event)
- 狀態 (State)
- 狀態快照 (State Snapshot)
- Claptrap 設計圖 (Claptrap Design)
- Claptrap 工廠 (Claptrap Factory)
- Claptrap Identity
- Claptrap Box
- Claptrap 生命週期(Claptrap Lifetime Scope)
- 序列化(Serialization)
- 最小競爭資源 (Minimal Competing Resources)
樣例實踐篇
開發工具篇
- 使用 Tye 輔助開發 k8s 應用竟如此簡單(一)
- 使用 Tye 輔助開發 k8s 應用竟如此簡單(二)
- 使用 Tye 輔助開發 k8s 應用竟如此簡單(三)
- 使用 Tye 輔助開發 k8s 應用竟如此簡單(四)
- 使用 Tye 輔助開發 k8s 應用竟如此簡單(五)
- 使用 Tye 輔助開發 k8s 應用竟如此簡單(六)
其他番外篇
- 談反應式編程在服務端中的應用,數據庫操作優化,從 20 秒到 0.5 秒
- 談反應式編程在服務端中的應用,數據庫操作優化,提速 Upsert
- 十萬同時在線用戶,需要多少內存?——Newbe.Claptrap 框架水平擴展實驗
- docker-mcr 助您全速下載 dotnet 鏡像
- 十多位全球技術專家,爲你獻上近十個小時的.Net 微服務介紹
- 年輕的樵夫喲,你掉的是這個免費 8 核 4G 公網服務器,還是這個隨時可用的 Docker 實驗平臺?
- 如何使用 dotTrace 來診斷 netcore 應用的性能問題
- 只要十步,你就可以應用表達式樹來優化動態調用
GitHub 項目地址:https://github.com/newbe36524/Newbe.Claptrap
Gitee 項目地址:https://gitee.com/yks/Newbe.Claptrap
您當前查看的是先行發佈於 www.newbe.pro 上的博客文章,實際開發文檔隨版本而迭代。若要查看最新的開發文檔,需要移步 claptrap.newbe.pro。
- 本文作者: newbe36524
- 本文鏈接: https://www.newbe.pro/Newbe.Claptrap/Try-Tye-5/
- 版權聲明: 本博客所有文章除特別聲明外,均採用 BY-NC-SA 許可協議。轉載請註明出處!