有没有用 echo 的兄弟,怎么判断 echo 服务启动成功,然后执行一些其他逻辑的

2022-08-15 14:49:44 +08:00
 laolaowang

我想在服务启动成功之后执行一个定时任务,如果启动失败就不执行了

但是 echo 服务启动之后,就会”卡住“,后续逻辑无法继续执行了,这个其实和 echo 关系不大,其他的 web 服务也是这样的。

目前是用了一个笨办法,另启一个携程,然后不断的去 ping 服务,如果返回 200 则表示成功

感觉太 low 了,不知道有没有更好的解决办法

1462 次点击
所在节点    Go 编程语言
11 条回复
SorcererXW
2022-08-15 15:27:19 +08:00
echo 内部用的就是原生的 http server ,可以看看这个 https://stackoverflow.com/questions/53332667/how-to-notify-when-http-server-starts-successfully

> 然后不断的去 ping 服务

这也不算笨吧,k8s 的健康检查判断服务是否启动也是这么做的
FrankAdler
2022-08-15 16:15:35 +08:00
上代码
liaohongxing
2022-08-15 17:31:50 +08:00
我也用 echo , 也有定时任务 ,没遇到你说的情况,我的定时任务自己造的轮子。
原理就是时间轮+协程, 不会阻塞 echo ,echo 也不会阻塞任务 。实在不会,github 整合一个 cron 库就行
liaohongxing
2022-08-15 17:32:31 +08:00
你的服务要在 echo 之前运行
laolaowang
2022-08-15 17:36:35 +08:00
@liaohongxing 我现在用的是 go-cron ,就是好奇怎么让定时任务不放在 echo 之前之后
liaohongxing
2022-08-15 17:43:46 +08:00
你把任务放在 echo 之后,任务肯定会卡住,因为标准库基本原理就是 select chan , chan 没有数据自然卡住,后面的代码不会执行 ,无限循环在 Start 那里,go-cron 启动在 echo 前面, go-cron 本省不会阻塞,原理就是到了时间,启动一个协程运行 func 里面的代码,不会阻塞主线程
dzdh
2022-08-15 17:45:41 +08:00
自己 net.Listen 或者 tls.Listen 。listen 成功,就一定能启动成功。listen 成功后启动你的定时任务 go func(){} 用协程。

然后再把 listen 传给 echo 再启动 echo 。
kidlj
2022-08-15 17:59:11 +08:00
先在 goroutine 里启动任务,然后 Echo 启动不成功直接 panic.
lxz6597863
2022-08-15 18:04:01 +08:00
@dzdh +1
laolaowang
2022-08-15 19:50:12 +08:00
@dzdh 学习了
laolaowang
2022-08-15 19:50:59 +08:00
@kidlj 这个也可以,

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/872977

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX