Topshelf 秒建 Windows 服務(wù)

Topshelf 是一個用來部署 基于.NET Framework 開發(fā)的服務(wù) 的框架。它極大的簡化服務(wù)創(chuàng)建與部署過程,它支持將控制臺應(yīng)用程序部署為服務(wù)。開發(fā)過 Windows 服務(wù)程序的同學(xué)應(yīng)該都比較清楚,代碼調(diào)試和服務(wù)部署上相對來說都過于麻煩,當(dāng)我第一次接觸 Topshelf 的時候,發(fā)現(xiàn)它是如此簡單,瞬間對之前寫的 Windows 服務(wù)程序表示深深的嘆息 ......

for what?

Topshelf 安裝

通過 NuGet 安裝 Topshelf 包。

Install-Package Topshelf

Topshelf 配置

以下是我們以 Topshelf 來部署的一個 gRPC 服務(wù)代碼,Topshelf 關(guān)鍵配置在 Main 方法內(nèi),更多的配置建議閱讀一下 官方文檔,沒什么特別復(fù)雜的地方,相信大家肯定能看懂。

class Program
{
  static void Main(string[] args)
  {
    // 配置和運行宿主服務(wù)
    HostFactory.Run(x => 
    {
      // 指定服務(wù)類型。這里設(shè)置為 CacheService
      x.Service<CacheService>(s =>
      {
        // 通過 new CacheService() 構(gòu)建一個服務(wù)實例 
        s.ConstructUsing(name => new CacheService());
        // 當(dāng)服務(wù)啟動后執(zhí)行什么
        s.WhenStarted(tc => tc.Start());
        // 當(dāng)服務(wù)停止后執(zhí)行什么
        s.WhenStopped(tc => tc.Stop());
      });
      
      // 服務(wù)用本地系統(tǒng)賬號來運行
      x.RunAsLocalSystem();
      
      // 服務(wù)描述信息
      x.SetDescription("緩存服務(wù)");
      // 服務(wù)顯示名稱
      x.SetDisplayName("CacheService");
      // 服務(wù)名稱
      x.SetServiceName("CacheService");
    });
  }
}

public class CacheService
{
  private readonly string host = ConfigurationManager.AppSettings["Host"];
  private readonly string port = ConfigurationManager.AppSettings["Port"];

  readonly Server server;
  public CacheService()
  {
    server = new Server
    {
      Services = { MDCache.BindService(new CacheServiceImpl()) },
      Ports = { new ServerPort(host, Convert.ToInt32(port), ServerCredentials.Insecure) }
    };
  }
  public void Start() { server.Start(); }
  public void Stop() { server.ShutdownAsync(); }
}

安裝服務(wù)

通過以上配置,確保程序集 Build 成功后,進入 bin\Debug 目錄下,執(zhí)行 install 命令,一個 Windows 服務(wù)就誕生了。(如果出現(xiàn)需要以管理員身份啟動的提示,重新以管理員身份啟動 cmd )。

xxx.exe install
服務(wù)安裝

啟動服務(wù)

安裝成功后我們可以在 Windows 服務(wù)下找到并啟動它。

服務(wù)信息

注意:因為 serviceName 必須是唯一的,如果我們希望在同一臺機器上運行多個相同的服務(wù),那么我們需要注釋掉硬編碼設(shè)置的 ServiceName 和 DisplayName ,然后通過命令參數(shù)來動態(tài)指定服務(wù)名稱。

// 服務(wù)顯示名稱
//x.SetDisplayName("CacheService");
// 服務(wù)名稱
//x.SetServiceName("CacheService");
xxx.exe install -servicename cacheService
xxx.exe install -servicename cacheService1
多個相同服務(wù)

服務(wù)卸載

卸載和啟動的命令保持一致,只需要把 install 改成 uninstall 。


卸載
指定服務(wù)名稱卸載

參考鏈接:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,545評論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,268評論 6 342
  • feisky云計算、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 4,332評論 0 5
  • Ubuntu的發(fā)音 Ubuntu,源于非洲祖魯人和科薩人的語言,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲de夢閱讀 100,630評論 9 468
  • 個人學(xué)習(xí)批處理的初衷來源于實際工作;在某個迭代版本有個BS(安卓手游模擬器)大需求,從而在測試過程中就重復(fù)涉及到...
    Luckykailiu閱讀 4,983評論 0 11

友情鏈接更多精彩內(nèi)容