go 流派的服务治理入门实践

几天前用 Python 写的统计代码提交情况的小程序基本就绪后,需要让它定时执行。最简单实用的方法是系统自己的 cron 来调度。

由于业务上后端已经有 go 的服务在线上,所以考虑看一下这个流派里,对于服务治理有没有什么现成的工具可以用。入门的需求有两个:
1. 定时执行;
2. 对启动、停止、异常等的值守。

前者选出一个名为 gocron 的项目(https://github.com/ouqiang/gocron)。在结构上,gocron 分为两个部分,一个是控制管理中心,一个是任务执行节点,即使在同一台设备上,这两者也是分离的。

gocron 依赖 MySQL 数据库,所以在投入使用前要准备一下。命令行下执行 gocron web 即可,此时会默认监听于 5920 端口,如果要从其他设备远程访问的话,记得 iptables -I INPUT -p tcp --dport 5920 -j ACCEPT 把端口放开。用浏览器通过 ip:port 访问,第一次进入显然要把数据库什么的配置好。接着再开展配置用户、增加节点、添加定时任务等工作。

它的定时设置采用 cron 语法,可以精确到秒。我希望每天晚上九点半执行一次任务,配了个 0 30 21 * * */1,最后那个 /1 是多此一举,只不过为了提醒我测试阶段结束后要改一下,改成一周一次即可。对 crontab 的时间周期表达格式不熟练的可以去 https://tool.lu/crontab 检测结果。

执行节点的启动,命令行 gocron-node 就够了,默认监听于 5921

接下来需要一个保证它们可以一直在工作的守护者。由于之前用过业内知名的 supervisor,又出于想多接触一下 go 的应用,选择了 go 语言版的 supervisord,项目地址为 https://github.com/ochinchina/supervisord。这个项目没有预编译好的 binary 可用,只好把代码 clone 到本地(恰好服务器上竟然原来有 go 的开发工具链什么的),直接 go build 就顺利通过了。

supervisord 的命令行参数一看是很简单的,想让它跑起来的话,supervisord -c configfile 就可以,如果想让它以 Daemon 的方式运行,加个 -d 参数就好。在此认知的基础上,我的配置文件如下:

执行起来后服务的效果是没有大问题的,但后续用命令行查询服务状态时发现,所有的命令都不能正确响应。supervisord ctl status 无输出,supervisord ctl pid processname 则都是返回 0

至此踏入郁闷的远程调试之途,其中曲折容后再总结,到最后的结论是,上述这些控制命令均需后附额外的服务地址参数,针对前面的配置文件,具体参数就是 -s http://127.0.0.1:9090 或者 -s http://localhost:9090

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注