使用 Tye 輔助開發 k8s 應用竟如此簡單(五)

續上篇,這篇我們來進一步探索 Tye 更多的使用方法。本篇我們來了解一下如何在 Tye 中實現對分佈式鏈路追蹤。

Newbe.Claptrap 是一個用於輕鬆應對併發問題的分佈式開發框架。如果您是首次閱讀本系列文章。建議可以先從本文末尾的入門文章開始瞭解。

我是誰?我在哪兒?我咋了?

分佈式系統紛繁複雜,特別以現在微服務架構的出現,使得應用系統中的應用實例變得更加多變難以捉摸。

那麼如何在如此繁雜的系統中找到一條業務調用鏈的上下游關係、性能細節、業務數據等等成爲了一項開發者必然要面對的挑戰。

使用分佈式鏈路追蹤系統無非是解決該問題的一個良好方法。目前市面上也有非常多可用的開源方案,其中不乏開箱即用的優秀用例:SkyWalkingJaeger  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 應用,則不需要變更了,因爲這已經是默認行爲。有關此內容的詳細信息,開發者可以參閱:

啓用 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 in dashboard

打開對應鏈接,便可以看到對應的 zipkin 查詢界面:

zipkin search ui

然後,我們打開 tyetest 服務的 swagger 界面,進行一次調用。然後在回來查詢,便可以查詢到服務調用的情況:

zipkin results

點擊其中的 Show 按鈕,便可以查看到一次服務調用的詳細過程信息:

one tracing

這就是使用 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 得到類似的結果:

jaeger result

當然,使用與 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

您還可以查閱本系列的其他選文:

理論入門篇

  1. Newbe.Claptrap - 一套以 “事件溯源” 和 “Actor 模式” 作爲基本理論的服務端開發框架

術語介紹篇

  1. Actor 模式
  2. 事件溯源(Event Sourcing)
  3. Claptrap
  4. Minion
  5. 事件 (Event)
  6. 狀態 (State)
  7. 狀態快照 (State Snapshot)
  8. Claptrap 設計圖 (Claptrap Design)
  9. Claptrap 工廠 (Claptrap Factory)
  10. Claptrap Identity
  11. Claptrap Box
  12. Claptrap 生命週期(Claptrap Lifetime Scope)
  13. 序列化(Serialization)
  14. 最小競爭資源 (Minimal Competing Resources)

樣例實踐篇

  1. 設計一個火車票銷售系統

開發工具篇

  1. 使用 Tye 輔助開發 k8s 應用竟如此簡單(一)
  2. 使用 Tye 輔助開發 k8s 應用竟如此簡單(二)
  3. 使用 Tye 輔助開發 k8s 應用竟如此簡單(三)
  4. 使用 Tye 輔助開發 k8s 應用竟如此簡單(四)
  5. 使用 Tye 輔助開發 k8s 應用竟如此簡單(五)
  6. 使用 Tye 輔助開發 k8s 應用竟如此簡單(六)

其他番外篇

  1. 談反應式編程在服務端中的應用,數據庫操作優化,從 20 秒到 0.5 秒
  2. 談反應式編程在服務端中的應用,數據庫操作優化,提速 Upsert
  3. 十萬同時在線用戶,需要多少內存?——Newbe.Claptrap 框架水平擴展實驗
  4. docker-mcr 助您全速下載 dotnet 鏡像
  5. 十多位全球技術專家,爲你獻上近十個小時的.Net 微服務介紹
  6. 年輕的樵夫喲,你掉的是這個免費 8 核 4G 公網服務器,還是這個隨時可用的 Docker 實驗平臺?
  7. 如何使用 dotTrace 來診斷 netcore 應用的性能問題
  8. 只要十步,你就可以應用表達式樹來優化動態調用

GitHub 項目地址:https://github.com/newbe36524/Newbe.Claptrap

Gitee 項目地址:https://gitee.com/yks/Newbe.Claptrap

您當前查看的是先行發佈於 www.newbe.pro 上的博客文章,實際開發文檔隨版本而迭代。若要查看最新的開發文檔,需要移步 claptrap.newbe.pro

Newbe.Claptrap

------ 本文結束 ------
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章