91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

golang-grpc如何實現平滑重啟

發布時間:2021-12-15 09:38:55 來源:億速云 閱讀:452 作者:小新 欄目:云計算

這篇文章給大家分享的是有關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如何實現平滑重啟”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

惠水县| 太保市| 新兴县| 黔南| 东丽区| 固阳县| 离岛区| 同江市| 墨竹工卡县| 乌鲁木齐县| 高密市| 奉贤区| 紫阳县| 兰考县| 台北市| 叶城县| 依安县| 乳山市| 富顺县| 岳阳市| 广州市| 疏勒县| 乐安县| 四会市| 咸宁市| 天等县| 兴国县| 息烽县| 宽城| 马公市| 肇庆市| 鄂州市| 休宁县| 衡水市| 洛扎县| 安陆市| 庄河市| 文昌市| 山东| 西峡县| 雷山县|