1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 4032字,需瀏覽 9分鐘

         ·

        2020-11-02 02:19

        續(xù)之前講的在TopShelf上部署ASP.NET Core程序,作為后臺(tái)服務(wù)運(yùn)行,自從.NET Core 3.0出現(xiàn)以后,出現(xiàn)了自帶的Generic Host,使得自托管服務(wù)變?yōu)榭赡堋?/span>


        這種方式和TopShelf方式一樣,可以直接F5進(jìn)行服務(wù)的調(diào)試,也為跨平臺(tái)后臺(tái)服務(wù)編寫(xiě)提供了一種新的方案。

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

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


        在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(); }); } }}

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

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

        跨平臺(tái)支持

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

        • windows服務(wù),需要添加:

        Install-Package Microsoft.Extensions.Hosting.WindowsServices


        • Linux服務(wù),需要添加:

        Install-Package Microsoft.Extensions.Hosting.Systemd


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


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


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

        部署

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


        Windows下部署

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

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


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

        sc.exe start WorkerServiceTest


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


        Linux下部署

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

        useradd -m dotnetuser -p dotnetpass


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


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

        [Unit]Description=WorkerServiceTest
        [Service]ExecStart=dotnet /bin/dotnet/WorkerServiceTest.dllWorkingDirectory=/bin/dotnet/User=dotnetuserGroup=dotnetuserRestart=on-failureSyslogIdentifier=WorkerServiceTestPrivateTmp=true
        [Install]WantedBy=multi-user.target


        注意,你需要已經(jīng)安裝有dotnet runtime 3.0以上版本才可以。

        可以使用以下命令進(jìn)行安

        yum install dotnet-runtime-3.1

        接下來(lái)是配置服務(wù)和啟動(dòng)服務(wù)

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


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

        補(bǔ)充

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


        總結(jié)

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


        比較TopShelf模式

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

        優(yōu)點(diǎn):

        1. 在相同的框架(.NET CORE 3.0+)下支持跨平臺(tái),支持linux服務(wù)的systemctl管理,topshelf在linux下需要mono。

        2. 配置方式和ASP.NET CORE相似度極高,基本上可以無(wú)縫切換。

        缺點(diǎn):

        1. 不支持TopSelf的自帶命令install/start/uninstall等命令,依然需要sc進(jìn)行部署,比較麻煩。

        2. 不支持windows的很多服務(wù)管理特性(比如Pause,依賴管理)。

        3. 只支持.NET CORE 3.0以后的框架,不支持.NET FRAMEWORK和早期版本的.NET CORE。


        參考資料

        https://devblogs.microsoft.com/aspnet/net-core-workers-as-windows-services/https://devblogs.microsoft.com/dotnet/net-core-and-systemd/https://docs.microsoft.com/en-us/dotnet/core/extensions/generic-hosthttps://dejanstojanovic.net/aspnet/2018/june/setting-up-net-core-servicedaemon-on-linux-os/https://dotnetcoretutorials.com/2019/12/07/creating-windows-services-in-net-core-part-3-the-net-core-worker-way/


        瀏覽 31
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            绿帽社av | 亚洲大奶子 | 国产99久久久国产精品下药 | 簧片视频在线观看无码专区 | 亚洲国产精品99久久久久久久久 | 久久久精品呻吟 | 一本大道东京热无码 | 爆操逼逼| av体验区 | 成人午夜视频在线观看 |