请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

课程没讲到的东西

老师你好,看到课程里没有优雅停止,这个go-micro怎么做停止呢,service没有stop或者close方法。还有就是如果我要自己做优雅停止,那么是每一个模块包括服务和api都要添加吗?

正在回答

1回答

Cap 2023-04-01 10:36:11

Go-micro框架内置了优雅停止的功能,可以通过捕获系统信号来实现。你可以在你的服务中添加以下代码:

import (
    "os"
    "os/signal"
    "syscall"
)

func main() {
    service := micro.NewService(
        micro.Name("your.service.name"),
    )
    service.Init()

    // 启动服务
    go func() {
        if err := service.Run(); err != nil {
            log.Fatal(err)
        }
    }()

    // 等待系统信号
    sig := make(chan os.Signal, 1)
    signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)

    // 阻塞等待信号
    <-sig

    log.Println("优雅地停止服务...")
}



这段代码会在服务启动后,阻塞等待系统信号(如SIGINT或SIGTERM),当接收到信号后,服务会自动执行优雅停止。

为每个模块(服务和API)添加自定义优雅停止逻辑:

如果你希望在服务停止时执行一些自定义的清理操作,可以为你的服务和API添加优雅停止逻辑。在go-micro中,你可以使用micro.Context来实现。以下是一个示例:

import (
    "context"
    "time"

    "github.com/micro/go-micro/v3/server"
)

func gracefulStop(s server.Server) {
    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()

    // 在这里添加你的清理逻辑,如关闭数据库连接、释放资源等

    s.Stop() // 停止服务
}

func main() {
    service := micro.NewService(
        micro.Name("your.service.name"),
    )
    service.Init()

    // 注册优雅停止函数
    service.Server().AddCloseFunc(gracefulStop)

    if err := service.Run(); err != nil {
        log.Fatal(err)
    }
}



0 回复 有任何疑惑可以回复我~
  • 提问者 慕瓜9063200 #1
    也就是说在"github.com/asim/go-micro/v3/server"当中只要service接收到信号,不需要我们使用stop()这类方法就会自动停止了?
    回复 有任何疑惑可以回复我~ 2023-04-01 16:05:57
  • Cap 回复 提问者 慕瓜9063200 #2
    按照上面的写法是会处理close
    回复 有任何疑惑可以回复我~ 2023-04-06 22:41:01
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信