使用ServiceSelf解决.NET应用程序做服务的难题

这篇具有很好参考价值的文章主要介绍了使用ServiceSelf解决.NET应用程序做服务的难题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 ServiceSelf

为.NET 泛型主机的应用程序提供自安装为服务进程的能力,支持windows和linux平台。

功能

  • 自我服务安装
  • 自我服务卸载
  • 自我服务日志监听

2 自我服务安装

虽然.NetCore提供了Microsoft.Extensions.Hosting.SystemdMicrosoft.Extensions.Hosting.WindowsServices两个服务生命周期包,但在服务安装这块目前还非常不便:在windows平台,需要管理员身份使用sc.exe工具来安装服务;在linux平台,需要自己手动写服务单元文件和使用systemctl加载服务。不常用的sc和服务单元文件的内容知识,就像学了外语之后又长期不用外语的我们一样,时间一久就忘记。而且windows服务进程的默认工作目录是%SystemRoot%\System32,在没有日志组件的帮助下,sc.exe安装的服务在运行后我们可能就掉到工作目录的坑里,影响包括但不限于配置文件的读取、asp.netcore的ContentRoot、wwwroot静态文件等。

ServiceSelf提供自我服务安装的能力,它提供了windows服务和linux的systemd服务的公共参,同时另外提供windows独有的服务配置和systemd独有的完整服务配置,此外还解决了windows服务没有工作目录配置的缺陷。

现在,你可以在使用ServiceSelf描述服务:

var serviceName = "myapp";
var serviceOptions = new ServiceOptions
{
    Arguments = new[] { new Argument("key", "value") },
    Description = "这是演示示例应用",
};
serviceOptions.Linux.Service.Restart = "always";
serviceOptions.Linux.Service.RestartSec = "10";
serviceOptions.Windows.DisplayName = "演示示例";
serviceOptions.Windows.FailureActionType = WindowsServiceActionType.Restart;

// serviceName和serviceOptions甚至可以为null
if (Service.UseServiceSelf(args, serviceName, serviceOptions))
{
    var host = Host.CreateDefaultBuilder(args)
        // 为Host配置UseServiceSelf()
        .UseServiceSelf()                     
        .Build();

    host.Run();
}

然后在控制台下以管理员或root身份执行如下命令:

./myapp start // 安装并启动服务

3 自我服务卸载

在控制台下以管理员或root身份执行如下命令:

./myapp stop // 停止并删除服务

4 自我服务日志监听

虽然有文件日志、大型的日志采集平台或框架等,但他们也取代不了控制台实时显示的日志,相反他们是互补的。控制台模式启动时,我们很容易直接在控制台看到实时日志的打印,但安装为服务后,查看控制台日志变得不容易或无法实现,在linux平台有journalctl,它是基于管道的,它无法知道一条日志内容的边界,很难把符合过滤特征的日志完整显示;windows平台有session隔离机制,服务进程和桌面用户进程不在同一个session,所以桌面用户看不到服务进程的控制台,也没有管道可以重定向来读取服务进程的控制输出。

ServiceSelf为服务进程集成了"自研的"的基于管道传输的Google.Protobuf结构化日志提供者,在监听者开启监听之后,这个日志提供者才会工作,把结构化的日志传输给监听者,监听者可以使用关键词来过滤得到完整的一条结构化日志,而不是只过滤得一条日志内容的某一行或几行,再把完整的结构化日志打印到监听者的Console上。也就是它不会在服务进程上让日志无脑地输出到串行化输出的低性能控制台,也不会让服务进程在没有监听者的情况下无脑的输出Google.Protobuf结构化日志,即这个日志组件对服务进程没有性能影响。

之所以要自己实现基于管道传输的Google.Protobuf结构化日志提供者,而不直接使用Microsoft的EventSourceLoggerProvider,是因为跨进程读取日志时需要依赖Microsoft.Diagnostics.Tracing.TraceEvent,这个包非常大而全,其依赖项也特别多,而我们仅仅日志这一小功能而已。

由于监听者与服务进程是同一个应用程序的不同进程,当应用程序的OutputType是WinExe模式且运行在windows时,这时候是没有Console的,ServiceSelf做为监听者角色时会检测和动态创建Console然后将日志输出到Console。

现在输入logs子命令,就在Console上输出服务进程的实时日志:

./myapp logs // 控制台输出服务的日志
./myapp logs filter="key words" // 控制台输出匹配了"key words"的服务的日志

5 后记

ServiceSelf在api设计上十分精炼,你只要关注Service.UseServiceSelf()IHostBuilder.UseServiceSelf()两个函数即可,但可以为你的服务进程提供非常完整的解决方案,您可以到 github上关注此项目。文章来源地址https://www.toymoban.com/news/detail-422454.html

到了这里,关于使用ServiceSelf解决.NET应用程序做服务的难题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【免费】win7 所有.net framework框架集合,免费下载,若要运行此应用程序,您必须首先安装net framework如何解决

    运行软件缺失框架: 那天我看见网上下载一个框架都要收费还要100大洋,现在真的是干啥都要钱,索性就整理了一个全库供大家下载,做点好事 .net 框架所有的 .net官网下载地址, 所有框架向下兼容,安装报错,就往上一个新版本下载装 微软官网:.net framework 3.5- 4.8框架 下

    2024年02月05日
    浏览(24)
  • 【Visual Studio 2022创建ASP.NET Web应用程序(.NET Framework)发布并部署到局域网 及“常见权限问题和不列出目录问题解决”】

    然后给项目命名并选择文件保存位置 用一个空项目进行举例 创建完成如下 点击更多模板选择Web窗体 创建成功如下 .aspx页面编写前端代码,.aspx.cs页面编写后端代码 通过插入表格和拉取控件快速完成 然后给Button按钮设置一个点击事件,双击按钮后会跳到.aspx.cs页面,完善下面

    2024年02月07日
    浏览(19)
  • WCF服务应用程序的创建和使用

    1.创建WCF服务应用程序: https://blog.csdn.net/weixin_44690047/article/details/119087706

    2024年02月08日
    浏览(17)
  • 迁移到云原生:如何使用微服务迁移应用程序

    企业遇到大规模部署和监督生产中的应用程序的任务。幸运的是,我们可以使用大量技术和工具。然而,从传统的,整体的结构转变为云态一个人提出了自己的障碍。在这里,您会发现将应用程序从整体设置转移到基于微服务的体系结构时要进行的基本初始步骤列表。 Compa

    2024年02月03日
    浏览(21)
  • 使用 OpenFaaS 构建和部署无服务器应用程序

    如今,无服务器计算在软件开发行业中越来越受欢迎。它提供了一种构建和部署应用程序的方法,而无需担心底层基础结构。最受欢迎的开源无服务器平台之一是OpenFaaS。在本文中,我们将讨论使用 OpenFaaS 构建和部署无服务器应用程序的基础知识。 OpenFaaS(功能即服务)是一

    2024年02月03日
    浏览(16)
  • .NET 应用程序 部署

    **硬件支持型号  点击 查看 硬件支持 详情** DTU701 产品详情 DTU702 产品详情 DTU801 产品详情 DTU802 产品详情 DTU902 产品详情 G5501 产品详情 本文内容 在设备上部署 dotnet应用,与任何其他平台的部署相同,可以2种方式: 依赖于框架的应用 独立应用 2种方式各有优势 依赖于框架

    2024年02月13日
    浏览(16)
  • 阿里云的消息队列(MQ)服务如何帮助解决应用程序中的消息传递问题?

    阿里云的消息队列(MQ)服务如何帮助解决应用程序中的消息传递问题? [本文由阿里云代理商[聚搜云www.4526.cn]撰写] 随着企业应用程序的复杂性不断增加,消息传递在系统间的通信与协作中扮演着越来越重要的角色。本文将探讨阿里云的消息队列(MQ)服务如何帮助解决应用程

    2024年02月07日
    浏览(28)
  • linux 部署 net6 应用程序(宝塔版)

    首先在VS2022上面把应用编译成linux 上的运行文件! 然后通过上传到指定目录,也用过宝塔的坑定会。 依照官网的操作。我的是CentOS 7,谁叫8不支持了呢。 安装 .NET 之前,请运行以下命令,将 Microsoft 包签名密钥添加到受信任密钥列表,并添加 Microsoft 包存储库。 打开终端并

    2024年02月07日
    浏览(19)
  • 【.NET】控制台应用程序的各种交互玩法

    关于控制台交互,大伙伴们也许见得最多的是进度条,就是输出一行但末尾不加 n,而是用 r 回到行首,然后输出新的内容,这样就做出进度条了。不过这种方法永远只能修改最后一行文本。 于是,有人想出了第二种方案——把要输出的文本存起来(用二维数组,啥的都行

    2024年02月04日
    浏览(19)
  • .net core控制台应用程序在linux运行

    1)创建.net 6.0控制台应用程序 2)在应用根目录执行cmd命令发布应用:dotnet publish -o .deploy 3)将发布文件上传到服务器    4)运行控制台应用程序(dotnet /home/app/ConsoleApp/ConsoleApp5.dll) 5)如果需要定时执行,可以添加sh文件 参考:linux定时备份(删除)mysql_linux数据库定时备

    2024年02月16日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包