選單
GSS 技術部落格
在這個園地裡我們將從技術、專案管理、客戶對談面和大家分享我們多年的經驗,希望大家不管是喜歡或是有意見,都可以回饋給我們,讓我們有機會和大家對話並一起成長!
若有任何問題請來信:gss_crm@gss.com.tw
6 分鐘閱讀時間 (1207 個字)

利用 .NET Core Worker Service 來建置背景服務吧!

Do Something Great Photo by Clark Tibbs on Unsplash

此篇文章主要帶大家利用 .NET Core 實作 Worker Service ,有興趣就往下看吧!

Worker Service

介紹

Worker Service 是 .NET Core 3.0 時釋出的新功能,官方也有釋出一專案範本(Template)供開發者去使用,讓開發者可以快速發展自己所需的背景服務

Worker service project template

 ❗ 一般來說 Worker Service 會被用來執行需要長時間處理定期需要做的事情!

(其實就有點像 Windows 平台上的 Windows Service、Linux 平台上的 Daemon Service)

舉幾個例子:

  • 處理佇列(queue)上的訊息(message)或事件(event)
  • 偵測改變(ex. 檔案、物件…)並快速做出回應
  • 從各方資料來源彙總並利用
  • 從資料流(data ingestion pipeline)中擷取所需片段
  • 定期資料清理

❤️ 若搭配一些已有的排程套件(ex. Coravel),就可以讓 Worker Service 客製批次工作更加彈性化!

除上面所述之外,既然是從 .NET Core 衍生出來的功能,那它當然也有保留原有那些被大幅簡化的特徵(日誌、依賴注入、組態設定…等等),好 Worker Service 不用嗎? _(:3 ⌒゙)_

基本使用步驟

初始化專案

1️⃣ 建立 WorkerServiceDemo 專案

dotnet new worker -n WorkerServiceDemo
cd WorkerServiceDemo 

以上做完,最基本可運行的 Worker Service 就做完了,真的不唬(◔౪◔)...

2️⃣ 接著簡單運行一下看看!

dotnet run WorkerServiceDemo.csproj 

有看到以下畫面,就表示成功囉!

觀察專案結構

就是以 .NET Core 為基底的專案呀,不是錯覺(◔౪◔)...

Project structure

 ❗ 關鍵差在使用了 Microsoft.Extensions.Hosting 套件,考試會考很重要?!

⭐ 在 ASP.NET Core 中使用託管服務的背景工作

該套件含有 IHostedService 介面,後續會再提及該介面為什麼很關鍵~

. . .

先看 Worker 類別好了…

Worker.cs

其實官方文件也描述得蠻清楚了,這個 BackgroundService 類別就是繼承了 IHostedServiceIDisposable 介面,而開發者一定要覆寫的方法為 ExecuteAsync ,其餘 StartAsyncStopAsyncDispose 等方法可視需求覆寫,但切記覆寫完最後依然要呼叫父類別方法哦!

. . .

接著來看 Program 類別…

Program.cs

需要於 ConfigureServices 中註冊所需的託管服務(有繼承 IHostedService 介面),以圖片為例就是 Worker 類別!

所以你/妳現在知道它的來龍去脈了嗎?當然若你/妳想了解更深入可以看看官方文件或已開源的程式碼唷~

轉換為 Windows Service (Optional)

那如果我們想把已經寫好的 Worker Service 轉換為可以在 Windows 執行的服務,該怎麼做呢?

只要於專案新增 Microsoft.Extensions.Hosting.WindowsServices 套件就行了…

dotnet add package Microsoft.Extensions.Hosting.WindowsServices 

接著在 Program 類別 CreateHostBuilder 處加上 UseWindowsService(),完工!

Add UseWindowsService()

部署為 Windows 服務的語法可參考如下:

rem Build and Publish Application
dotnet build
dotnet publish -c Release -o "PathToPublish"

rem Create ServiceName Service
sc.exe create ServiceName binpath="PathToPublish\ServiceName.exe" 
  • PathToPublish:將專案發行的路徑位置
  • ServiceName:自定義服務名稱
語法執行完應該會類似如下圖,表示已建立了一個新服務:
Windows Service

這邊在附上一些控制服務的語法可參考如下:

rem Start ServiceName Service
sc.exe start ServiceName  

rem Stop ServiceName Service
sc.exe stop ServiceName   

rem Query ServiceName Service Status
sc.exe query ServiceName  

rem Delete ServiceName Service
sc.exe delete ServiceName  
  • ServiceName:自定義服務名稱

轉換為 Linux Daemon Service(Optional)

那如果我們想把已經寫好的 Worker Service 轉換為可以在 Linux 執行的服務,該怎麼做呢?

只要於專案新增 Microsoft.Extensions.Hosting.Systemd 套件就行了…

dotnet add package Microsoft.Extensions.Hosting.Systemd 

接著在 Program 類別 CreateHostBuilder 處加上 UseSystemd(),完工!

Add UseSystemd()

至於部署為 Linux 服務的語法這部分我就沒有特別去深入了解了,之後如果有碰到我可能再回來補囉...

範例專案

 可參考範例專案

參考

結尾

因為自己本身平常幾乎都是在 Windows 上開發,所以對於 .NET 的 Windows Service 不是很陌生,但那時候就覺得要部署一個 Windows Service 怎麼這麼麻煩...

而且視專案狀況,有可能會很肥(佔硬碟容量),更何況是若管理不慎,甚至會影響整台主機效能!

好奇研究了一下 .NET Core 3 釋出的 Worker Service,結果好像就回不去了_(:3 」∠ )_

Worker Service 簡單且省力,趕緊來試試看吧!

本文章也曾發表於我的 Blog 中,歡迎到裡面查查我其他分享的文章哦!

每日小知識#7-volume的種類
版控遷移

相關文章

 

評論

尚無評論
已經注冊了? 這裡登入
Guest
2024/04/28, 週日

Captcha 圖像