golang-grpc如何实现平滑重启
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章给大家分享的是有关golang-grpc如何实现平滑重启的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。package gooimport ( "fmt
千家信息网最后更新 2025年01月23日golang-grpc如何实现平滑重启
这篇文章给大家分享的是有关golang-grpc如何实现平滑重启的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
package gooimport ( "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如何实现平滑重启"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
进程
监听
平滑
信号
内容
更多
篇文章
不错
实用
信息
文件
文章
看吧
知识
通道
错误
参考
存储
帮助
有关
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
浙江net软件开发哪家实惠
襄阳厚坤互联网科技有限公司
天津建辉互联网科技
资料查询有哪些数据库
网络安全问题解读
软件开发合同的模板
多益网络技术笔试题
site 数据库
文化产业与互联网科技
数据库排序快还是代码排序快
软件开发的经历社会效益分析
mc服务器对战
腾讯视频老是在加载数据库
服务器流量费2000
陕西哪个大学有网络安全专业
肇庆电商软件开发费用是多少
java 数据库酒店管理
怎么把数据库改名字
网络安全产业融资
常州数据网络技术市场价格
随机选取单元格数据库
网站数据库服务器放在dmz去吗
文石网络或者服务器出错怎么办
关于餐饮订单数据库
数据库技术的参考文献
贵州数据网络技术分类推广
成都安防时钟监控网管服务器
大公司视频服务器有多大内存
jcpds卡片数据库怎么看
机务段网络安全报道