小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

打造跨平臺.NET Core后臺服務(wù)

 新進小設(shè)計 2021-03-15

續(xù)之前講的在TopShelf上部署ASP.NET Core程序,作為后臺服務(wù)運行,自從.NET Core 3.0出現(xiàn)以后,出現(xiàn)了自帶的Generic Host,使得自托管服務(wù)變?yōu)榭赡?。這種方式和TopShelf方式一樣,可以直接F5進行服務(wù)的調(diào)試,也為跨平臺后臺服務(wù)編寫提供了一種新的方案。

創(chuàng)建服務(wù)

以VS2019為例,確保安裝了.NET CORE 3.0以上的SDK,新建項目,在項目模板里面可以找到Worker Service模板,創(chuàng)建后,vs已經(jīng)幫我們創(chuàng)建了Program.cs和Worker.cs兩個文件。

在Program.cs中,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace WorkerServiceTest
{
    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>();
    });
        }
    }
}

可以發(fā)現(xiàn),配置的方式和ASP.NET CORE的方式基本一樣一樣的,使用了內(nèi)置的DI容器。那我們同樣可以使用AddSingleton等方法進行其他邏輯的注入,也可以添加多個服務(wù)任務(wù)。

而Worker類已經(jīng)寫了好一個范例,其中有一個ExecuteAsync方法,可以直接執(zhí)行后臺任務(wù)。這個時候,直接F5就可以正常運行了,自帶了一個顯示當前時間的小程序。

跨平臺支持

雖然程序可以正常執(zhí)行,但是還不能正常部署為服務(wù),需要依據(jù)平臺添加對應(yīng)的nuget包:

  • windows服務(wù),需要添加:
Install-Package Microsoft.Extensions.Hosting.WindowsServices
  • Linux服務(wù),需要添加:
Install-Package Microsoft.Extensions.Hosting.Systemd

如果想實現(xiàn)一套程序多處運行,那么直接同時安裝兩個package就可以了。接下來在CreateHostBuilder中,添加UseWindowsService()和UseSystemd()。

public static IHostBuilder CreateHostBuilder(string[] args)
{
    if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
    {
        return Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<Worker>();
            }).UseWindowsService();
    }
    else
    {
        return Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<Worker>();
            }).UseSystemd();
    }
}

這里使用到了.NET Core判斷平臺的一個函數(shù):IsOSPlatform,可以判斷是否在Windows平臺運行,并進行分別調(diào)用。

部署

編譯完成之后,找到生成的exe文件路徑。

Windows下部署

管理員下運行cmd/powershell,執(zhí)行

sc.exe create WorkerServiceTest binPath=C:\Users\source\repos\WorkerServiceTest\WorkerServiceTest\bin\Debug\netcoreapp3.1\WorkerServiceTest.exe

提示CreateService 成功即安裝成功了,可以輸入下面的命令運行服務(wù)。

sc.exe start WorkerServiceTest

sc.exe負責管理服務(wù),具體配置啟動方式和刪除,可以查看命令的幫助。另外,友情提醒,如果是在powershell中,不要省略這個.exe,sc有別的用處...

Linux下部署

將整個程序文件夾傳輸?shù)絃inux文件夾下,我這邊使用的是CentOS 8。新建一個運行服務(wù)的用戶:

useradd -m dotnetuser -p dotnetpass

轉(zhuǎn)到/etc/systemd/system文件夾,建立一個WorkerServiceTest.service的文件,這個WorkerServiceTest是你的服務(wù)名稱。

輸入以下內(nèi)容并保存(systemd配置文件):

[Unit]
Description=WorkerServiceTest

[Service]
ExecStart=dotnet /bin/dotnet/WorkerServiceTest.dll
WorkingDirectory=/bin/dotnet/
User=dotnetuser
Group=dotnetuser
Restart=on-failure
SyslogIdentifier=WorkerServiceTest
PrivateTmp=true

[Install]
WantedBy=multi-user.target

注意,你需要已經(jīng)安裝有dotnet runtime 3.0以上版本才可以。
可以使用以下命令進行安裝

yum install dotnet-runtime-3.1

接下來是配置服務(wù)和啟動服務(wù)

#重載配置
systemctl daemon-reload
#設(shè)置服務(wù)自動啟動
systemctl enable WorkerServiceTest.service 
#運行服務(wù)
systemctl start WorkerServiceTest.service
#查詢服務(wù)狀態(tài)
systemctl status WorkerServiceTest.service

然后可以發(fā)現(xiàn),程序可以正常運行。
img

補充

作為服務(wù),應(yīng)該要提供一些狀態(tài)用于外部監(jiān)測,在Worker.cs中,Worker類可以重寫StartAsyncStopAsync方法,提供服務(wù)啟動和停止的信息,但是windows提供的服務(wù)失敗后動作等功能都找不到配置的地方,可能這就是局限吧。

總結(jié)

一次編寫,處處運行,對于后臺服務(wù)也是如此,很簡潔。但是暫時手上沒有mac電腦,也不知道m(xù)ac上面有沒有對應(yīng)的解決方案??赡躎opShelf的mono模式可以支持吧。

比較TopShelf模式

總體講,相較于TopShelf的方式,Service Worker方式有利有弊。

優(yōu)點:

  1. 在相同的框架(.NET CORE 3.0+)下支持跨平臺,支持linux服務(wù)的systemctl管理,topshelf在linux下需要mono。
  2. 配置方式和ASP.NET CORE相似度極高,基本上可以無縫切換。

缺點:

  1. 不支持TopSelf的自帶命令install/start/uninstall等命令,依然需要sc進行部署,比較麻煩。
  2. 不支持windows的很多服務(wù)管理特性(比如Pause,依賴管理)。
  3. 只支持.NET CORE 3.0以后的框架,不支持.NET FRAMEWORK和早期版本的.NET CORE。

參考資料

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多