这篇文章给大家分享的是有关golang-grpc如何实现平滑重启的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
package goo
import (
"fmt"
"github.com/facebookgo/grace/gracenet"
"google.golang.org/grpc"
"io/ioutil"
"log"
"os"
"os/signal"
"syscall"
)
type GRPCGraceful struct {
nett string
addr string
s *grpc.Server
net *gracenet.Net
}
func NewGRPCGraceful(nett, addr string, s *grpc.Server) *GRPCGraceful {
return &GRPCGraceful{
nett: nett,
addr: addr,
s: s,
net: &gracenet.Net{},
}
}
func (g *GRPCGraceful) Serve() error {
lis, err := g.net.Listen(g.nett, g.addr)
if err != nil {
return err
}
errs := make(chan error)
// 启动serve
AsyncFunc(func() {
errs <- g.s.Serve(lis)
})
// 判断并关闭旧进程
AsyncFunc(g.killPPID)
// 存储pid
AsyncFunc(g.storePID)
// 监听信号
quit := g.handleSignal(errs)
// 监听退出信号,错误信息
select {
case err := <-errs:
return err
case <-quit:
return nil
}
}
// 监听信号
func (g *GRPCGraceful) handleSignal(errs chan error) <-chan struct{} {
// 通道,是否退出
quit := make(chan struct{})
AsyncFunc(func() {
ch := make(chan os.Signal)
signal.Notify(ch, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGUSR1, syscall.SIGUSR2)
for sig := range ch {
switch sig {
// 监听退出
case syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT:
signal.Stop(ch)
g.s.GracefulStop()
close(quit)
return
// 监听重启
case syscall.SIGUSR1, syscall.SIGUSR2:
if _, err := g.net.StartProcess(); err != nil {
errs <- err
}
}
}
})
return quit
}
// 记录进程号到.pid文件
func (g *GRPCGraceful) storePID() {
pid := fmt.Sprintf("%d", os.Getpid())
ioutil.WriteFile(".pid", []byte(pid), 0644)
log.Println(fmt.Sprintf("server is running, address=%s, pid=%s", g.addr, pid))
}
// 判断进程是否继承进程,平滑重启时,关闭旧进程
func (g *GRPCGraceful) killPPID() {
inherit := os.Getenv("LISTEN_FDS") != ""
if !inherit {
return
}
ppid := os.Getppid()
if ppid == 1 {
return
}
syscall.Kill(ppid, syscall.SIGTERM)
}
感谢各位的阅读!关于“golang-grpc如何实现平滑重启”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/qiongtaoli/blog/4821566