Topshelf 秒建 Windows 服务

Topshelf 是一个用来部署 基于.NET Framework 开发的服务 的框架。它极大的简化服务创建与部署过程,它支持将控制台应用程序部署为服务。开发过 Windows 服务程序的同学应该都比较清楚,代码调试和服务部署上相对来说都过于麻烦,当我第一次接触 Topshelf 的时候,发现它是如此简单,瞬间对之前写的 Windows 服务程序表示深深的叹息 ......

for what?

Topshelf 安装

通过 NuGet 安装 Topshelf 包。

Install-Package Topshelf

Topshelf 配置

以下是我们以 Topshelf 来部署的一个 gRPC 服务代码,Topshelf 关键配置在 Main 方法内,更多的配置建议阅读一下 官方文档,没什么特别复杂的地方,相信大家肯定能看懂。

class Program
{
  static void Main(string[] args)
  {
    // 配置和运行宿主服务
    HostFactory.Run(x => 
    {
      // 指定服务类型。这里设置为 CacheService
      x.Service<CacheService>(s =>
      {
        // 通过 new CacheService() 构建一个服务实例 
        s.ConstructUsing(name => new CacheService());
        // 当服务启动后执行什么
        s.WhenStarted(tc => tc.Start());
        // 当服务停止后执行什么
        s.WhenStopped(tc => tc.Stop());
      });
      
      // 服务用本地系统账号来运行
      x.RunAsLocalSystem();
      
      // 服务描述信息
      x.SetDescription("缓存服务");
      // 服务显示名称
      x.SetDisplayName("CacheService");
      // 服务名称
      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(); }
}

安装服务

通过以上配置,确保程序集 Build 成功后,进入 bin\Debug 目录下,执行 install 命令,一个 Windows 服务就诞生了。(如果出现需要以管理员身份启动的提示,重新以管理员身份启动 cmd )。

xxx.exe install
服务安装

启动服务

安装成功后我们可以在 Windows 服务下找到并启动它。

服务信息

注意:因为 serviceName 必须是唯一的,如果我们希望在同一台机器上运行多个相同的服务,那么我们需要注释掉硬编码设置的 ServiceName 和 DisplayName ,然后通过命令参数来动态指定服务名称。

// 服务显示名称
//x.SetDisplayName("CacheService");
// 服务名称
//x.SetServiceName("CacheService");
xxx.exe install -servicename cacheService
xxx.exe install -servicename cacheService1
多个相同服务

服务卸载

卸载和启动的命令保持一致,只需要把 install 改成 uninstall 。


卸载
指定服务名称卸载

参考链接:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,247评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,222评论 6 342
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 9,494评论 0 5
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 100,223评论 9 468
  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 10,305评论 0 11

友情链接更多精彩内容