netcore项目在Windows部署:使用NSSM部署Windows服务

NSSM部署Windows服务

1 准备工作

  在Windows平台部署Asp.net core应用程序一般采用IIS,但是如果我们的net core应用执行的是定时任务,需要开机自启,稳定运行的话,使用NSSM将其部署为Winodows服务是一种不错的选择。NSSM官网地址:http://www.nssm.cc/

我们知道netcore应用本质都是Console应用程序,所以这里我们就以一个控制台应用为例演示NSSM部署过程。新建一个控制台项目,项目名为HelloWorld,代码如下:

    class Program
    {
        static void Main(string[] args)
        {
            var tokenSource = new CancellationTokenSource();
            //业务,异步执行,每隔1秒输出一次working
            Task.Factory.StartNew(() =>
            {
                while (!tokenSource.IsCancellationRequested)
                {
                    File.AppendAllTextAsync(@"F:\aaa.txt", $"{DateTime.Now.ToString("f")}:working...{Environment.NewLine}");
                    Thread.Sleep(1000);
                }
            }).ContinueWith(t =>
            {
                File.AppendAllText(@"F:\aaa.txt", $"{DateTime.Now.ToString("f")}:成功退出!");
                Environment.Exit(0);
            });


            //读取配置文件,如果配置文件stop为No,主线程休眠1秒
            var configuration = new ConfigurationBuilder()
                .SetBasePath(Environment.CurrentDirectory)
                .AddJsonFile("setttings.json", optional: true, reloadOnChange: true)
                .Build();
            while ("No".Equals(configuration["stop"], StringComparison.CurrentCultureIgnoreCase))
            {
                Thread.Sleep(1000);
            }

            //让异步业务结束
            tokenSource.Cancel();
        }
    }

  项目执行一个异步任务,每秒在F:/aaa.txt中写入一行 【time:working....】,运行程序后,打开F:/aaa.txt文件,内容如下:

2  NSSM部署

1.发布项目

  我们可以使用VS发布项目,也可以使用PowerShell执行以下命令进行发布,发布后的文件存放在D:/Apps/HelloWorld目录下

dotnet publish -o D:/Apps/HelloWorld -c release

2.使用NSSM

  下载NSSM,解压后,进入nssm.exe所在目录,在该目录下打开PowerShell。我们通过 nssm install <SerivceName> 命令创建服务,执行命令后后弹出服务安装窗口,如下图:

Application Path:dotnet所在目录,可以通过 where dotnet 命令查找;

Startup directroy:发布文件所在的目录;

Arguments:发布项目后的xxx.dll文件名。

  点击按钮就可以创建服务了,使用十分简单, 打开服务管理器,可以看到服务已经安装成功了:

  myHelloWorld服务安装成功后,并没有启动,我们可以使用服务管理器来启动、停止服务,当然我们也可以使用nssm来来控制服务的启动、停止、暂停等,常用命令如下:

nssm install <servicename>          //安装服务
nssm remove <servicename>           //卸载服务
nssm start <servicename>            //启动服务
nssm stop <servicename>             //停止服务
nssm restart <servicename>          //重启服务
nssm status <servicename>           //查看服务
nssm pause <servicename>            //暂停服务
nssm continue <servicename>         //继续服务

  我们执行 nssm start myHelloWorld 命令来启动服务,查看F:/aaa.txt文件如下,可以看到服务运行正常。

3.服务修改

  项目总是不断迭代的, 如果我们的myHelloWorld程序后期进行了修改,代码如下,我们怎么去更新服务呢?

       static void Main(string[] args)
        {
            var tokenSource = new CancellationTokenSource();
            //业务,异步执行,每隔1秒输出一次working
            Task.Factory.StartNew(() =>
            {
                while (!tokenSource.IsCancellationRequested)
                {
                    File.AppendAllTextAsync(@"F:\aaa.txt", $"{DateTime.Now.ToString("f")}:【修改了代码】working...{Environment.NewLine}");
                    Thread.Sleep(1000);
                }
            }).ContinueWith(t =>
            {
                File.AppendAllText(@"F:\aaa.txt", $"{DateTime.Now.ToString("f")}:成功退出!");
                Environment.Exit(0);
            });


            //读取配置文件,如果配置文件stop为No,主线程休眠1秒
            var configuration = new ConfigurationBuilder()
                .SetBasePath(Environment.CurrentDirectory)
                .AddJsonFile("setttings.json", optional: true, reloadOnChange: true)
                .Build();
            while ("No".Equals(configuration["stop"], StringComparison.CurrentCultureIgnoreCase))
            {
                Thread.Sleep(1000);
            }

            //让异步业务结束
            tokenSource.Cancel();
        }
View Code

  更新服务十分方便:首先使用  nssm stop myHelloWorld 暂停服务,然后用新的发布文件替代以前的发布文件,之后使用 nssm start myHelloWorld 启动服务即可。打开F:/aaa.txt,内容如下,可以看到重新发布已经生效了。

 

总结:虽然使用netcore后尽量应该把项目部署在Linux平台上,但是如果公司服务器是Windows Server,且项目要求开机自启、长期稳定运行,使用nssm简单方便地将项目部署为Windows服务也是一种不错的选择。

猜你喜欢

转载自www.cnblogs.com/wyy1234/p/10544244.html