閱讀目錄:
上月在公司內部的一次分享,現把PPT及部分交流內容整理成博客。
介紹
topshelf是創建windows服務的一種方式,相比原生實現ServiceBase、Install.Installer更為簡單方便, 我們只需要幾行代碼即可實現windows服務的開發。topshelf本身支持windows及linux下mono上部署安裝,同樣也是開源的。
topshelf相對原生來說,調試起來比較方便,可以在開發時以控制台的形式直接f5調試,發布時用命令以服務的形式部署。還一個比較有用的特性是支持多實例的部署,這樣可以在一台機器上部署多個相對的服務。類似的工具有instsrv和srvany。
基礎用法
Topshelf使用起來比較簡單,通過nuget直接安裝即可,目前最新的是3.2版本:
示例代碼:
HostFactory.Run(x => { x.Service<Manager>(s => { s.ConstructUsing(name => new Manager()); s.WhenStarted(tc => tc.OnStart()); s.WhenStopped(tc => tc.OnStop()); }); x.RunAsLocalSystem(); x.SetDescription("Topshelf測試例子"); x.SetDisplayName("TopshelfExample"); x.SetServiceName("TopshelfExample"); });
其中Run方法的回調參數方法,在運行時執行,方法內是一些配置信息。
其中manager類是我們服務實現類,服務啟動時通過WhenStarted調用對應實現的OnStart,停止一樣。
RunAsLocalSystem()表示以本地系統賬號運行,可選的還有網絡服務和本地服務賬號。
SetDescription("Topshelf測試例子"); 設置服務的描述
SetDisplayName("TopshelfExample"); 設置服務的顯示名稱
x.SetServiceName("TopshelfExample"); 設置服務的名稱
Manager服務實現類:
public class Manager { public void OnStart() { Console.WriteLine("Service start."); } public void OnStop() { Console.WriteLine("Service stopped."); } }
調試及安裝
調試和平常一樣,直接f5即可:
安裝時以管理員身份運行CMD,進入程序目錄。
輸入安裝命令: TopshelfExample.exe install topshelf以事務的形式安裝,只有成功和失敗,兼容性較好,示例:
啟動命令是TopshelfExample.exe start,停止TopshelfExample.exe stop
可選配置
topshelf雖小但支持的可配置選項比較多,以下是部分示例:
- SetStartTimeout啟動超時
- SetStopTimeout停止超時
- BeforeUninstall卸載前
- AfterUninstall 卸載后回調
- AfterInstall安裝后回調
- AfterRollback回滾后回調
- DependsOnMsmq Msmq啟動后再啟動
- EnablePauseAndContinue支持暫停
- UseLog4Net (“.config")集成log4Net
- UseNLog集成Nlog
多實例支持及相關資料
原生服務上是不支持的,topshelf支持使用不同的名稱來部署多個同樣的程序實例。 啟動一個新實例:
TopshelfExample.exe –instance “newinstallname” install
start、top命令和原先參數格式一樣,如卸載:
TopshelfExample.exe –instance "TopshelfExample2" uninstall
多實例有一個好處就是容災,當一個服務部署多份時,這樣其中任何一個服務實例掛了,剩余的可以繼續執行。 多實例可以是主備的方式,主掛了備服務才會執行。也可以以負載均衡的方式實現,多實例搶占進程鎖或分布式鎖,誰拿到誰執行。
文檔索引
github地址
topshelf命令列表
TopshelfExample.exe help
quartz.net
關於quartz.net早先有系列介紹過,只貼下鏈接。
Net作業調度(五)—quartz.net動態添加job設計
topshelf和quartz.net可以配合使用,開發一些定時任務類的服務較為方便。
PS: 上周五離職嘍~