专栏名称: BeckJin
程序员
目录
相关文章推荐
手游那点事  ·  这一次,腾讯游戏将「球」交到了年轻人手里! ·  2 天前  
手游那点事  ·  起飞了!Supercell今年第一款新作曝光 ... ·  2 天前  
手游那点事  ·  这公司果然一出新作就被问爆了! ·  2 天前  
手游那点事  ·  中国500强:14家游戏企业,腾讯第二,米哈 ... ·  3 天前  
51好读  ›  专栏  ›  BeckJin

Topshelf 秒建 Windows 服务

BeckJin  · 掘金  ·  · 2018-04-08 15:08

正文

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

多个相同服务







请到「今天看啥」查看全文