打造跨平台.NET Core后台服务
续之前讲的在TopShelf上部署ASP.NET Core程序,作为后台服务运行,自从.NET Core 3.0出现以后,出现了自带的Generic Host,使得自托管服务变为可能。这种方式和TopShelf方式一样,可以直接F5进行服务的调试,也为跨平台后台服务编写提供了一种新的方案。
创建服务
以VS2019为例,确保安装了.NET CORE 3.0以上的SDK,新建项目,在项目模板里面可以找到Worker Service
模板,创建后,vs已经帮我们创建了Program.cs和Worker.cs两个文件。
在Program.cs中,
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;namespace WorkerServiceTest
{public class Program{public static void Main(string[] args){CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureServices((hostContext, services) =>{services.AddHostedService<Worker>();});}}
}
可以发现,配置的方式和ASP.NET CORE的方式基本一样一样的,使用了内置的DI容器。那我们同样可以使用AddSingleton等方法进行其他逻辑的注入,也可以添加多个服务任务。
而Worker类已经写了好一个范例,其中有一个ExecuteAsync
方法,可以直接执行后台任务。这个时候,直接F5就可以正常运行了,自带了一个显示当前时间的小程序。
跨平台支持
虽然程序可以正常执行,但是还不能正常部署为服务,需要依据平台添加对应的nuget包:
windows服务,需要添加:
CopyInstall-Package Microsoft.Extensions.Hosting.WindowsServices
Linux服务,需要添加:
CopyInstall-Package Microsoft.Extensions.Hosting.Systemd
如果想实现一套程序多处运行,那么直接同时安装两个package就可以了。接下来在CreateHostBuilder
中,添加UseWindowsService()和UseSystemd()。
public static IHostBuilder CreateHostBuilder(string[] args)
{if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)){return Host.CreateDefaultBuilder(args).ConfigureServices((hostContext, services) =>{services.AddHostedService<Worker>();}).UseWindowsService();}else{return Host.CreateDefaultBuilder(args).ConfigureServices((hostContext, services) =>{services.AddHostedService<Worker>();}).UseSystemd();}
}
这里使用到了.NET Core判断平台的一个函数:IsOSPlatform
,可以判断是否在Windows平台运行,并进行分别调用。
部署
编译完成之后,找到生成的exe文件路径。
Windows下部署
管理员下运行cmd/powershell,执行
psc.exe create WorkerServiceTest binPath=C:\Users\source\repos\WorkerServiceTest\WorkerServiceTest\bin\Debug\netcoreapp3.1\WorkerServiceTest.exe
提示CreateService 成功即安装成功了,可以输入下面的命令运行服务。
sc.exe start WorkerServiceTest
sc.exe负责管理服务,具体配置启动方式和删除,可以查看命令的帮助。另外,友情提醒,如果是在powershell中,不要省略这个.exe,sc有别的用处...
Linux下部署
将整个程序文件夹传输到Linux文件夹下,我这边使用的是CentOS 8。新建一个运行服务的用户:
useradd -m dotnetuser -p dotnetpass
转到/etc/systemd/system
文件夹,建立一个WorkerServiceTest.service
的文件,这个WorkerServiceTest是你的服务名称。
输入以下内容并保存(systemd配置文件):
[Unit]
Description=WorkerServiceTest[Service]
ExecStart=dotnet /bin/dotnet/WorkerServiceTest.dll
WorkingDirectory=/bin/dotnet/
User=dotnetuser
Group=dotnetuser
Restart=on-failure
SyslogIdentifier=WorkerServiceTest
PrivateTmp=true[Install]
WantedBy=multi-user.target
注意,你需要已经安装有dotnet runtime 3.0以上版本才可以。
可以使用以下命令进行安装
yum install dotnet-runtime-3.1
接下来是配置服务和启动服务
#重载配置
systemctl daemon-reload
#设置服务自动启动
systemctl enable WorkerServiceTest.service
#运行服务
systemctl start WorkerServiceTest.service
#查询服务状态
systemctl status WorkerServiceTest.service
然后可以发现,程序可以正常运行。
补充
作为服务,应该要提供一些状态用于外部监测,在Worker.cs中,Worker类可以重写StartAsync
和StopAsync
方法,提供服务启动和停止的信息,但是windows提供的服务失败后动作等功能都找不到配置的地方,可能这就是局限吧。
总结
一次编写,处处运行,对于后台服务也是如此,很简洁。但是暂时手上没有mac电脑,也不知道mac上面有没有对应的解决方案。可能TopShelf的mono模式可以支持吧。
比较TopShelf模式
总体讲,相较于TopShelf的方式,Service Worker方式有利有弊。
优点:
在相同的框架(.NET CORE 3.0+)下支持跨平台,支持linux服务的systemctl管理,topshelf在linux下需要mono。
配置方式和ASP.NET CORE相似度极高,基本上可以无缝切换。
缺点:
不支持TopSelf的自带命令install/start/uninstall等命令,依然需要sc进行部署,比较麻烦。
不支持windows的很多服务管理特性(比如Pause,依赖管理)。
只支持.NET CORE 3.0以后的框架,不支持.NET FRAMEWORK和早期版本的.NET CORE。
参考资料
https://devblogs.microsoft.com/aspnet/net-core-workers-as-windows-services/
https://devblogs.microsoft.com/dotnet/net-core-and-systemd/
https://docs.microsoft.com/en-us/dotnet/core/extensions/generic-host
https://dejanstojanovic.net/aspnet/2018/june/setting-up-net-core-servicedaemon-on-linux-os/
https://dotnetcoretutorials.com/2019/12/07/creating-windows-services-in-net-core-part-3-the-net-core-worker-way/
出处:https://www.cnblogs.com/podolski/p/13890572.html
打造跨平台.NET Core后台服务相关推荐
- 在CentOS7上部署.net core 控制台应用程序部署为后台服务
在CentOS7上部署.net core 控制台app为后台服务 转载于:https://www.cnblogs.com/wangwust/p/9821547.html
- 【新书推荐】《ASP.NET Core微服务实战:在云环境中开发、测试和部署跨平台服务》 带你走近微服务开发...
<ASP.NET Core 微服务实战>译者序:https://blog.jijiechen.com/post/aspnetcore-microservices-preface-by-tr ...
- .Net Core微服务架构技术栈的那些事
一.前言 大家一直都在谈论微服务架构,园子里面也有很多关于微服务的文章,前几天也有一些园子的朋友问我微服务架构的一些技术,我这里就整理了微服务架构的技术栈路线图,这里就分享出来和大家一起探讨学习,同时 ...
- asp.net core后台系统登录的快速构建
登录流程图 示例预览 构建步骤 当然,你也可以直接之前前往coding仓库查看源码,要是发现bug记得提醒我啊~ LoginDemo地址 1. 首先你得有一个项目 2. 然后你需要一个登录页面 完整L ...
- .NET Core微服务之基于Consul实现服务治理
一.Consul基础介绍 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,比如 Airbnb的SmartStack等相比,Co ...
- 【NET CORE微服务一条龙应用】第三章 认证授权与动态权限配置
[NET CORE微服务一条龙应用]第三章 认证授权与动态权限配置 介绍 系列目录:[NET CORE微服务一条龙应用]开始篇与目录 在微服务的应用中,统一的认证授权是必不可少的组件,本文将介绍微服务 ...
- NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成...
原文:NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成 本篇内容属于非实用性(拿来即用)介绍,如对框架设计没兴趣的朋友,请略过. 快一个月没有写博 ...
- .NET Core微服务之路:基于Consul最少集群实现服务的注册与发现(一)
原文:.NET Core微服务之路:基于Consul最少集群实现服务的注册与发现(一) Consul介绍 Consul是HashiCorp公司推出的开源工具[开源地址:https://github.c ...
- ASP.NET Core微服务(七)——【docker部署linux上线】(RDS+API接口测试部分)
ASP.NET Core微服务(七)--[docker部署linux上线]: 本文测试采用阿里云的RDS(sqlserver服务器)+ECS(linux服務器)进行测试,由于是测试,[按量付费]买个最 ...
最新文章
- flask_socketio 用法:
- busybox编译笔记
- Spring-国际化信息02-MessageSource接口
- MySQL 出现 The table is full 的解决方法
- php错误403_phpstudy访问文件报错403/Forbidden解决办法
- Unexpected exception 'Cannot run program '的解决
- C#/java 求最大公约数和最小公倍数
- 计算机高级技师论文网,高级技师论文(数控铣床、加工中心).doc
- GitGithub 视频教程(Java版)
- OpenCV的二值化处理函数threshold()详解
- 软件库网站源码+多套模板 附手机版 附教程
- 替换PanDown神器 更新Pdown 3.4.6 清爽版
- 5D论文PMF及改进
- Gartner:2017年中国新兴技术成熟度曲线
- 嵌入式系统C语言编程基础
- 对比两张表的数据并筛选出数据不同的
- 自学英语的几个网站(免费网站)
- 苏宁0元撸货福利来了!只限新人!老用户放弃吧!便宜只能占一次
- 克里斯坦森创新框架与皮萨诺创新画布
- FFmpeg入门详解--音视频原理及应用:梅会东:清华大学出版社
热门文章
- Zynq7000开发系列-5(OpenCV开发环境搭建:Ubuntu、Zynq)
- 论DATASNAP远程方法支持自定义对象作参数
- Public DNS (公共域名解析服务)
- 跨域访问-JSONP
- 代码Review发现问题
- js javaScript array 取指定元素索引、判断是否相同、重复、过滤数据
- do...while(0)的妙用
- Confluence Cloud的Teams Message Extension
- 查看模拟器使用端口_为什么我们仍然使用模拟音频端口?
- Jmeter HTTP请求后响应数据显示乱码解决方法