欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

.NET 中Worker Service的使用入門(mén)

 更新時(shí)間:2021年05月13日 16:48:49   作者:技術(shù)譯民  
隨著 .NET Core 3.0 的發(fā)布,ASP.NET 團(tuán)隊(duì)引入了一個(gè)新的 Worker Service 項(xiàng)目模板,該模板作為 .NET SDK 的一部分發(fā)布。在本文中,我將向您介紹這個(gè)新模板,以及使用它開(kāi)發(fā)的一些實(shí)際的服務(wù)示例。

譯者注:
請(qǐng)先完成以下準(zhǔn)備工作,以便于您理解本文。
1、下載并安裝最新的 .NET SDK:https://dotnet.microsoft.com/download
2、命令行運(yùn)行 dotnet new Worker -n "MyService" 命令,創(chuàng)建一個(gè) Worker Service 項(xiàng)目。

什么是 .NET Core Worker Service?

Worker Service 是使用模板構(gòu)建的 .NET 項(xiàng)目,該模板提供了一些有用的功能,可以將常規(guī)控制臺(tái)應(yīng)用程序變得更加強(qiáng)大。Worker Service 運(yùn)行于宿主(Host)的概念之上,宿主維護(hù)應(yīng)用程序的生命周期。宿主還提供了一些常見(jiàn)的特性,如依賴(lài)注入、日志記錄和配置。

Worker Service 通常是長(zhǎng)時(shí)間運(yùn)行的服務(wù),執(zhí)行一些規(guī)律發(fā)生的工作負(fù)載。

§Worker Service 的一些例子

  • 處理來(lái)自隊(duì)列、服務(wù)總線(xiàn)或事件流的消息、事件
  • 響應(yīng)對(duì)象、文件存儲(chǔ)中的文件更改
  • 聚合數(shù)據(jù)存儲(chǔ)中的數(shù)據(jù)
  • 豐富數(shù)據(jù)提取管道中的數(shù)據(jù)
  • AI/ML 數(shù)據(jù)集的格式化和清理

還可以開(kāi)發(fā)一個(gè)這樣的 Worker Service,該服務(wù)從頭到尾執(zhí)行一個(gè)過(guò)程,然后關(guān)閉。結(jié)合調(diào)度程序,便可以支持定期的批處理工作負(fù)載。例如,調(diào)度程序每隔一小時(shí)啟動(dòng)一次服務(wù),完成一些匯總數(shù)據(jù)的計(jì)算,然后關(guān)閉。

Worker Service 沒(méi)有用戶(hù)界面,也不支持直接的用戶(hù)交互,它們特別適用于設(shè)計(jì)微服務(wù)架構(gòu)。在微服務(wù)體系結(jié)構(gòu)中,職責(zé)通常被劃分為不同的、可單獨(dú)部署的、可伸縮的服務(wù)。隨著微服務(wù)架構(gòu)的成長(zhǎng)和發(fā)展,擁有大量的 Worker Service 會(huì)變得越來(lái)越常見(jiàn)。

Worker Service 模板提供了什么?

完全可以在不使用 Worker Service 模板的情況下開(kāi)發(fā)長(zhǎng)時(shí)間運(yùn)行的 Worker Service。在 .NET Core 的早期版本中我是這樣做的,使用依賴(lài)注入容器手動(dòng)建立宿主,然后啟動(dòng)我的處理工作負(fù)載。

在默認(rèn)情況下,Worker Service 模板包含了有用的基礎(chǔ)組件,比如依賴(lài)注入,這樣我們就可以集中精力在其上構(gòu)建業(yè)務(wù)邏輯。它包含了一個(gè)管理應(yīng)用程序生命周期的宿主。

Worker Service 模板本身是相當(dāng)基礎(chǔ)的,它只包含了三個(gè)開(kāi)箱即用的核心文件。

§1. Program.cs

第一個(gè)是 Program 類(lèi)。該類(lèi)包含 .NET 控制臺(tái)應(yīng)用程序所必需的 Main 方法入口點(diǎn),.NET 運(yùn)行時(shí)期望在啟動(dòng) .NET 應(yīng)用程序時(shí)在 Program 類(lèi)中查找此方法。

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<Worker>();
            });
}

在 Program 類(lèi)中,作為 Worker Service 模板一部分的是 CreateHostBuilder 方法,該方法創(chuàng)建一個(gè) IHostBuilder。IHostBuilder 接口定義了一個(gè)類(lèi)型,該類(lèi)型使用生成器模式生成 IHost 的實(shí)例。此模板通過(guò)調(diào)用 Host 類(lèi)中的靜態(tài) CreateDefaultBuilder 方法來(lái)創(chuàng)建一個(gè)新的 HostBuilder。

然后,它使用生成器來(lái)配置 IHost,該 IHost 被用于運(yùn)行 Worker Service 應(yīng)用程序。宿主提供了依賴(lài)注入容器和日志記錄等功能,就像我們可以在 ASP.NET Core 應(yīng)用程序中使用的那樣。事實(shí)上,從 .NET Core 3.0 開(kāi)始,ASP.NET Core Web 應(yīng)用程序和 .NET Core Worker Service 都運(yùn)行在同一 IHost 上的。

默認(rèn)情況下,它包含了一個(gè)服務(wù)注冊(cè),稍后我會(huì)在本文中介紹,暫時(shí)不用擔(dān)心。

從 Main 方法中調(diào)用 CreateDefaultBuilder 方法,將構(gòu)建并立即運(yùn)行宿主。當(dāng) .NET 運(yùn)行時(shí)調(diào)用 Main 方法時(shí),應(yīng)用程序啟動(dòng),宿主將保持運(yùn)行,監(jiān)聽(tīng)標(biāo)準(zhǔn)的關(guān)閉信號(hào)(例如按下 CTRL+C 鍵)。

§2. appsettings.json

如果您以前使用過(guò) ASP.NET Core,將會(huì)非常熟悉 appsettings.json 文件,它是應(yīng)用程序配置的常見(jiàn)來(lái)源之一。宿主被設(shè)計(jì)為,當(dāng)啟動(dòng)應(yīng)用程序時(shí),使用任意已注冊(cè)的配置提供程序從多個(gè)來(lái)源加載應(yīng)用程序配置。其中一種提供程序是從 appsettings.json 加載配置,該文件內(nèi)容由 JSON 組成,其結(jié)構(gòu)包含表示應(yīng)用程序配置的鍵和值。這些值可以隨意地定義在對(duì)相關(guān)配置按邏輯分組成的片段(Sections)內(nèi)。

在 Worker Service 中,啟動(dòng)時(shí)會(huì)檢查相同的配置源(包括此 appsettings.json 文件和環(huán)境變量),并從不同的源構(gòu)建最終的配置。默認(rèn)情況下會(huì)加載多種默認(rèn)的提供程序,因此也會(huì)加載多種源。如果需要,您也可以自定義宿主用來(lái)加載配置數(shù)據(jù)的提供程序。

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  }
}

模板中的默認(rèn) appsettings 文件中包含日志記錄庫(kù)的配置設(shè)置項(xiàng),默認(rèn)對(duì) Worker Service 可用。這里的配置是為某些日志記錄上下文設(shè)置記錄級(jí)別的。

§3. Worker.cs

Worker 是一個(gè)您在默認(rèn)的 ASP.NET Core 項(xiàng)目模板中見(jiàn)不到的新類(lèi)。它是托管服務(wù)與宿主相結(jié)合的魔力所在,提供了 Worker Service 的基礎(chǔ)。

讓我們來(lái)看一下它的代碼:

public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;

    public Worker(ILogger<Worker> logger)
    {
        _logger = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
            await Task.Delay(1000, stoppingToken);
        }
    }
}

此類(lèi)從 BackgroundService 抽象基類(lèi)派生。BackgroundService 類(lèi)實(shí)現(xiàn)了一個(gè)名為 IHostedService 的接口。

BackgroundService 包含一個(gè)名為 ExecuteAsync 的抽象方法,我們必須在子類(lèi)中重寫(xiě)該方法,就像 Worker Service 模板中提供的 Worker 類(lèi)中所做的那樣。ExecuteAsync 方法返回一個(gè) Task,在 BackgroundService 內(nèi)部,期望此 Task 是一些長(zhǎng)時(shí)間運(yùn)行的工作負(fù)載。該 Task 會(huì)被啟動(dòng)并在后臺(tái)運(yùn)行。

在內(nèi)部,宿主將啟動(dòng) IHostedService 的所有注冊(cè)實(shí)現(xiàn)(包括從 BackgroundService 抽象類(lèi)派生的類(lèi)型)。請(qǐng)記住,BackgroundService 為我們實(shí)現(xiàn)了 IHostedService。

§4. 如何注冊(cè)托管服務(wù)(IHostedService)?

下一個(gè)顯而易見(jiàn)的問(wèn)題是,如何注冊(cè) IHostedService ?如果我們返回到 Program.cs 的代碼,我們將會(huì)找到答案:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureServices((hostContext, services) =>
        {
            services.AddHostedService<Worker>();
        });

在 ConfigureServices 方法中,可以向依賴(lài)注入容器注冊(cè)類(lèi)型。AddHostedService 是為 IServiceCollection 定義的一個(gè)擴(kuò)展方法,它允許我們注冊(cè)一個(gè)實(shí)現(xiàn)了 IHostedService 的類(lèi)。

該模板中已將 Worker 類(lèi)注冊(cè)為托管服務(wù)。

在啟動(dòng)時(shí),宿主將找到已注冊(cè)的 IHostedService 的所有實(shí)例,并按順序啟動(dòng)它們,此時(shí),它們的長(zhǎng)時(shí)間運(yùn)行的工作負(fù)載會(huì)作為后臺(tái)任務(wù)來(lái)運(yùn)行。

為什么要構(gòu)建 .NET Core Worker Service?

簡(jiǎn)單的答案是——何時(shí)以及是否需要它們!如果您需要開(kāi)發(fā)一個(gè)微服務(wù),它沒(méi)有用戶(hù)界面,并執(zhí)行長(zhǎng)時(shí)間運(yùn)行的工作,那么 Worker Service 很可能是一個(gè)好的選擇。

請(qǐng)記住,Worker Service 的底層只是一個(gè)控制臺(tái)應(yīng)用程序。該控制臺(tái)應(yīng)用程序使用宿主將應(yīng)用程序轉(zhuǎn)換為運(yùn)行的服務(wù),直到收到停止的信號(hào)。宿主帶來(lái)了您可能已經(jīng)熟悉的一些特性,比如依賴(lài)關(guān)系注入。使用和 ASP.NET Core 中可用的相同的日志記錄和配置擴(kuò)展,使得開(kāi)發(fā)可記錄日志信息且需要一些配置的 Worker Service 變得相當(dāng)輕松。當(dāng)構(gòu)建運(yùn)行在云上的 Worker Service 時(shí),幾乎總會(huì)存在這種需求。例如,您可能需要為與您的 Worker Service 相交互的任何外部服務(wù)提供配置(比如一個(gè)隊(duì)列 URL)。

Worker Service 可用于從現(xiàn)有的 ASP.NET Core 應(yīng)用程序提取職責(zé),設(shè)計(jì)新的基于 .NET Core 的微服務(wù)。

總結(jié)

在本文中,我介紹了 Worker Service 項(xiàng)目模板,以及它的一些潛在用例。我們探索了使用 Worker Service 模板創(chuàng)建的新項(xiàng)目中所包含的三個(gè)默認(rèn)文件。

§Worker Service 模板包含哪些文件?

  • Program.cs:控制臺(tái)應(yīng)用程序的入口點(diǎn),創(chuàng)建并運(yùn)行宿主以管理應(yīng)用程序生命周期并生成一個(gè)長(zhǎng)期運(yùn)行的服務(wù)。
  • appsettings.json:一個(gè)提供應(yīng)用程序配置值的 JSON 文件。
  • Worker.cs:派生自 BackgroundService 基類(lèi),用于定義作為后臺(tái)任務(wù)執(zhí)行的長(zhǎng)時(shí)間運(yùn)行的工作負(fù)載。

§Worker Service 是什么?

  • 不需要用戶(hù)交互的應(yīng)用程序。
  • 使用宿主來(lái)維護(hù)控制臺(tái)應(yīng)用程序的生命周期,直到宿主收到關(guān)閉的信號(hào)。將控制臺(tái)應(yīng)用程序轉(zhuǎn)換為長(zhǎng)時(shí)間運(yùn)行的服務(wù)。
  • 包含和 ASP.NET Core 相同的功能,如依賴(lài)注入、日志記錄和配置。
  • 執(zhí)行定期和長(zhǎng)時(shí)間運(yùn)行的工作負(fù)載。

以上就是.NET 中Worker Service的使用入門(mén)的詳細(xì)內(nèi)容,更多關(guān)于.NET 中Worker Service的使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • RichTextBox 顯示圖片和word的代碼

    RichTextBox 顯示圖片和word的代碼

    RichTextBox 顯示圖片和word的代碼,需要的朋友可以參考一下
    2013-02-02
  • asp.net創(chuàng)建XML文件的方法小結(jié)

    asp.net創(chuàng)建XML文件的方法小結(jié)

    這篇文章主要介紹了asp.net創(chuàng)建XML文件的方法,結(jié)合實(shí)例形式總結(jié)分析了asp.net創(chuàng)建XML文件的原理,步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-04-04
  • ASP.NET MVC的四種驗(yàn)證編程方式

    ASP.NET MVC的四種驗(yàn)證編程方式

    ASP.NET MVC采用Model綁定為目標(biāo)Action生成了相應(yīng)的參數(shù)列表,但是在真正執(zhí)行目標(biāo)Action方法之前,還需要對(duì)綁定的參數(shù)實(shí)施驗(yàn)證以確保其有效性,我們將針對(duì)參數(shù)的驗(yàn)證成為Model綁定,需要的朋友可以參考下
    2015-10-10
  • IIS部署ASP.NET5的實(shí)現(xiàn)步驟

    IIS部署ASP.NET5的實(shí)現(xiàn)步驟

    本文主要介紹了ASP.NET5嘗試部署到IIS中運(yùn)行,對(duì)基礎(chǔ)入門(mén)的同學(xué)有一定的幫助,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 在ASP.NET里得到網(wǎng)站的域名

    在ASP.NET里得到網(wǎng)站的域名

    在ASP.NET里得到網(wǎng)站的域名...
    2006-09-09
  • asp.net讀取excel中的數(shù)據(jù)并綁定在gridview

    asp.net讀取excel中的數(shù)據(jù)并綁定在gridview

    這篇文章主要介紹了asp.net讀取excel中的數(shù)據(jù)并綁定在gridview上的方法,需要的朋友可以參考下
    2014-02-02
  • ASP.NET Core中間件設(shè)置教程(7)

    ASP.NET Core中間件設(shè)置教程(7)

    這篇文章主要為大家詳細(xì)介紹了ASP.NET Core中間件的設(shè)置教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Jwt通過(guò)源碼揭秘隱藏大坑

    Jwt通過(guò)源碼揭秘隱藏大坑

    今天分享一下在使用JWT在項(xiàng)目中遇到的一個(gè)問(wèn)題,主要是一個(gè)協(xié)議的細(xì)節(jié),非常容易被忽略,如果不是自己遇到,或者去看源碼的實(shí)現(xiàn),我估計(jì)至少80%的人都會(huì)栽在這里,下面來(lái)還原一下這個(gè)問(wèn)題的過(guò)程,由于這個(gè)問(wèn)題出現(xiàn)有一定的概率,不是每次都會(huì)出現(xiàn),所以才容易掉坑里
    2022-05-05
  • Asp.net自定義控件之單選、多選控件

    Asp.net自定義控件之單選、多選控件

    這篇文章主要為大家詳細(xì)介紹了Asp.net自定義控件之單選、多選控件的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-06-06
  • ASP.NET?MVC使用異步Action的方法

    ASP.NET?MVC使用異步Action的方法

    這篇文章介紹了ASP.NET?MVC使用異步Action的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-10-10

最新評(píng)論