课程没讲到的东西

来源:10-19 中间件前端页面以及核心API开发(下)

慕瓜9063200

2023-03-31

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

写回答

1回答

Cap

2023-04-01

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
2
Cap
回复
慕瓜9063200
按照上面的写法是会处理close
2023-04-06
共2条回复

Go 开发者的涨薪通道,自主开发 PaaS 平台核心功能

云原生专家带来稀缺的 PaaS 平台实战,带你直击核心业务+技术

400 学习 · 169 问题

查看课程