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

发布于 1周前 作者 htzhanglong 来自 Go语言

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

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

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

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


Golang Go语言中 有没有用 echo 的兄弟,怎么判断 echo 服务启动成功,然后执行一些其他逻辑的
12 回复

echo 内部用的就是原生的 http server ,可以看看这个 https://stackoverflow.com/questions/53332667/how-to-notify-when-http-server-starts-successfully

> 然后不断的去 ping 服务

这也不算笨吧,k8s 的健康检查判断服务是否启动也是这么做的

更多关于Golang Go语言中 有没有用 echo 的兄弟,怎么判断 echo 服务启动成功,然后执行一些其他逻辑的的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我也用 echo , 也有定时任务 ,没遇到你说的情况,我的定时任务自己造的轮子。
原理就是时间轮+协程, 不会阻塞 echo ,echo 也不会阻塞任务 。实在不会,github 整合一个 cron 库就行

你的服务要在 echo 之前运行

我现在用的是 go-cron ,就是好奇怎么让定时任务不放在 echo 之前之后

你把任务放在 echo 之后,任务肯定会卡住,因为标准库基本原理就是 select chan , chan 没有数据自然卡住,后面的代码不会执行 ,无限循环在 Start 那里,go-cron 启动在 echo 前面, go-cron 本省不会阻塞,原理就是到了时间,启动一个协程运行 func 里面的代码,不会阻塞主线程

自己 net.Listen 或者 tls.Listen 。listen 成功,就一定能启动成功。listen 成功后启动你的定时任务 go func(){} 用协程。

然后再把 listen 传给 echo 再启动 echo 。

先在 goroutine 里启动任务,然后 Echo 启动不成功直接 panic.

这个也可以,

在 Go 语言中使用 Echo 框架开发 Web 服务非常常见。要判断 Echo 服务是否启动成功并执行一些后续逻辑,你可以采用以下几种方法:

  1. 监听启动事件:Echo 框架本身没有直接提供启动成功的事件监听机制,但你可以通过启动服务后的代码逻辑来间接实现。

  2. 使用 Goroutine 和 Channel:在主 Goroutine 中启动 Echo 服务,并使用一个额外的 Goroutine 监听服务端口是否开放。一旦确认端口开放,通过 Channel 通知主 Goroutine,然后执行后续逻辑。

  3. 日志和错误处理:启动 Echo 服务时,检查返回的 error 对象。如果没有错误,可以认为服务启动成功。同时,你可以配置 Echo 的 Logger 来输出启动日志,以便确认服务状态。

  4. 健康检查端点:在 Echo 应用中添加一个健康检查端点(如 /health),该端点返回简单的成功响应。启动服务后,通过 HTTP 请求访问该端点,如果收到成功响应,则认为服务已启动。

具体实现时,你可以这样写:

e := echo.New()
go func() {
    if err := e.Start(":8080"); err != nil {
        log.Fatalf("Failed to start server: %v", err)
    }
}()

// 等待一段时间或使用健康检查确认服务启动
// 然后执行其他逻辑
time.Sleep(2 * time.Second)
// 执行后续逻辑...

注意,使用 time.Sleep 是一种简单但不优雅的方法,更好的做法是实现健康检查或使用更复杂的同步机制。

回到顶部