将 Consul Nacos 等配置为 Windows 系统服务

前言

在微服务开发中会用到各种中间件,包括服务发现/配置管理中心(例如 Consul 和 Nacos)等。在每次重新开机后,进行本地调试时,都需要启动这些中间件。有些中间件启动过程繁琐,启动参数也很多 (RocketMQ 说的就是你) ,为了每次启动时能偷点懒,于是思考有没有更便捷、更优雅的方式。

常规的 CMD 命令提示符启动方法缺点很多,比如每次都需要自己敲写启动命令、运行后命令窗口不能关闭等。虽然也有通过编写 .bat 和 .cmd 批处理文件的方法,可以实现简化操作、后台运行和开机自启动,但是也不能解决快捷停止运行等方面的需求,还不够方便。

受到 Redis redis-server.exe --service-install 把 Redis 配置成 Windows 服务的启发,本文以 Consul 和 Nacos 为例,总结了将其配置为 Windows 系统服务的两种方法。

sc create 命令(以 Consul 为例)

Windows 自带的 sc 命令就可以方便的添加、修改和删除服务。

bash 复制代码
sc create SERVICE_NAME binPath= PATH

sc create 命令详细的用法可以参考 官方文档

创建服务

接下来我们创建名称为 Consul 的系统服务,该服务会以开发模式启动 Consul 。

以管理员身份运行 CMD 命令提示符,执行命令

bash 复制代码
C:\Windows\System32>sc create Consul binPath= "D:\consul\consul.exe agent -dev"
[SC] CreateService 成功

这时就可以在服务列表中看见我们刚刚创建的名为 Consul 的服务了。

启动该服务后访问 http://localhost:8500/ 可以看到 Consul 已经成功运行了。

打开服务属性,可以将其配置为开机自动启动,也可以随时在服务窗口中启动、停止和重新启动该服务。

卸载服务

想要卸载刚刚创建的 Consul 服务也很简单。

以管理员身份运行 CMD 命令提示符,执行命令

bash 复制代码
C:\Windows\System32>sc delete Consul
[SC] DeleteService 成功

WinSW 工具(以 Nacos 为例)

当使用同样的方法,为 Nacos 创建服务时,没有办法正常启动服务,提示 错误 1053: 服务没有及时响应启动或控制请求。

这时就需要用到 WinSW 工具

官方介绍:
WinSW wraps and manages any application as a Windows service.
WinSW 可以将任何应用打包成 Windows 服务并进行管理。

1. 下载 WinSW

GitHub下载地址

本文以图中 WinSW-net461.exe 为例。

WinSW-net461.exe 要求 Windows 具有 .NET Framework 4.6.1 或更高版本。若版本不符合要求可下载 WinSW-x64.exeWinSW-x86.exeWinSW v2.12.0 对应版本

附: 本机 .NET Framework 版本查看方法

2. 重命名文件

将下载下来的 WinSW-net461.exe 文件复制到 Nacos 的安装目录 (D:\nacos) 并重命名为 nacos-winsw.exe

3. 编写配置文件

在 Nacos 的安装目录(与 nacos-winsw.exe 文件同一位置)下新建 nacos-winsw.xml 文件(文件名必须与 .exe 文件名相同),内容如下:

xml 复制代码
<!-- nacos-winsw.xml -->
<service>
  <!-- 指定在Windows系统内部使用的识别服务的ID。在系统中安装的所有服务中,这必须是唯一的,它应该完全由字母数字字符组成 -->
  <id>nacos-service</id>
  <!-- 服务的简短名称,它可以包含空格和其他字符。尽量简短,就像"id"一样,在系统的所有服务名称中,也要保持唯一 -->
  <name>nacos</name>
  <!-- 该服务可读描述。当选中该服务时,它将显示在Windows服务管理器中 -->
  <description>nacos-winsw-service</description>
  <!-- 指定要启动的可执行文件 -->
  <executable>%BASE%\bin\startup.cmd</executable>
  <!-- 传递给可执行文件的参数(此处表示Nacos单机模式运行,非集群模式) -->
  <arguments>-m standalone</arguments>
  <!-- 定义服务的启动模式 -->
  <startmode>Automatic</startmode>
  <!-- 日志文件输出目录 -->
  <logpath>%BASE%\logs</logpath>
</service>

XML 配置文件完整说明

4. 安装服务

以管理员身份运行 CMD 命令提示符,并切换到 Nacos 的安装目录,执行命令

bash 复制代码
D:\nacos>nacos-winsw.exe install
Installing service 'nacos (nacos-service)'...
Service 'nacos (nacos-service)' was installed successfully.

这时就可以在服务列表中看见我们刚刚创建的名为 nacos-service 的服务了。

启动该服务后访问 http://localhost:8848/nacos 可以看到 Nacos 已经以单机模式成功运行了。

打开服务属性,可以看到已经配置为开机自动启动,也可以随时在服务窗口中启动、停止和重新启动该服务。

5. 卸载服务

想要卸载刚刚创建的 nacos-service 服务也很简单。

以管理员身份运行 CMD 命令提示符,并切换到 Nacos 的安装目录,执行命令

bash 复制代码
D:\nacos>nacos-winsw.exe uninstall
Uninstalling service 'nacos (nacos-service)'...
Service 'nacos (nacos-service)' was uninstalled successfully.

同样的,此方法也适用于搭配 .cmd 文件把 RocketMQ 配置为 Windows 系统服务。

不足之处

配置为 Windows 系统服务后,虽然中间件的启动和停止比较方便,但是不能像在命令提示符中一样,随时查看输出、排查问题。WinSW 还可以在配置的日志文件中查看输出,sc.exe 方法就完全无处查看了。这也是一把双刃剑,在实际开发中可以按需选择。

相关推荐
roman_日积跬步-终至千里21 小时前
【Docker多节点部署】基于“配置即身份“理念的 Docker 多节点 StarRocks 高可用集群自动化部署方案
java·docker·微服务
serendipity_hky1 天前
【微服务 - easy视频 | day03】服务与服务之间的调用
spring boot·spring cloud·微服务·架构
三口吃掉你1 天前
微服务之Nacos(注册中心、配置中心)
微服务·nacos·架构
陈果然DeepVersion1 天前
Java大厂面试真题:从Spring Boot到AI微服务的三轮技术拷问(一)
java·spring boot·redis·微服务·kafka·面试题·oauth2
zhangkaixuan4561 天前
Flink 写入 Paimon 流程:Checkpoint 与 Commit 深度剖析
java·开发语言·微服务·flink·paimon
论迹2 天前
【Spring Cloud微服务】-- DependencyManagement 和 Dependencies
spring·spring cloud·微服务
serendipity_hky2 天前
【微服务 - easy视频 | day01】准备工具+gateway网关及路由至内部服务
java·微服务·架构·gateway·springcloud
周杰伦_Jay2 天前
【Go微服务框架深度对比】Kratos、Go-Zero、Go-Micro、GoFrame、Sponge五大框架
开发语言·微服务·golang
回家路上绕了弯3 天前
海量日志分析:一天内最大在线人数与最长持续时间计算方案
后端·微服务
A.说学逗唱的Coke3 天前
【观察者模式】深入 Spring 事件驱动模型:从入门到微服务整合实战
spring·观察者模式·微服务