日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
golang-grpc如何實(shí)現(xiàn)平滑重啟

這篇文章給大家分享的是有關(guān)golang-grpc如何實(shí)現(xiàn)平滑重啟的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

10年積累的成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有成安免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

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)

	// 啟動(dòng)serve
	AsyncFunc(func() {
		errs <- g.s.Serve(lis)
	})
	// 判斷并關(guān)閉舊進(jìn)程
	AsyncFunc(g.killPPID)
	// 存儲(chǔ)pid
	AsyncFunc(g.storePID)

	// 監(jiān)聽信號(hào)
	quit := g.handleSignal(errs)

	// 監(jiān)聽退出信號(hào),錯(cuò)誤信息
	select {
	case err := <-errs:
		return err
	case <-quit:
		return nil
	}
}

// 監(jiān)聽信號(hào)
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 {
			// 監(jiān)聽退出
			case syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT:
				signal.Stop(ch)
				g.s.GracefulStop()
				close(quit)
				return

			// 監(jiān)聽重啟
			case syscall.SIGUSR1, syscall.SIGUSR2:
				if _, err := g.net.StartProcess(); err != nil {
					errs <- err
				}
			}
		}
	})

	return quit
}

// 記錄進(jìn)程號(hào)到.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))
}

// 判斷進(jìn)程是否繼承進(jìn)程,平滑重啟時(shí),關(guān)閉舊進(jìn)程
func (g *GRPCGraceful) killPPID() {
	inherit := os.Getenv("LISTEN_FDS") != ""
	if !inherit {
		return
	}
	ppid := os.Getppid()
	if ppid == 1 {
		return
	}
	syscall.Kill(ppid, syscall.SIGTERM)
}

感謝各位的閱讀!關(guān)于“golang-grpc如何實(shí)現(xiàn)平滑重啟”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!


網(wǎng)頁題目:golang-grpc如何實(shí)現(xiàn)平滑重啟
文章來源:http://www.dlmjj.cn/article/pjhjsi.html