国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

golang 監(jiān)聽服務(wù)的信號,實(shí)現(xiàn)平滑啟動(dòng),linux信號說明詳解

瀏覽:105日期:2024-04-21 11:57:54
監(jiān)聽服務(wù)的信號,實(shí)現(xiàn)平滑啟動(dòng),linux信號說明

golang 監(jiān)聽服務(wù)的信號,實(shí)現(xiàn)平滑啟動(dòng),linux信號說明詳解

package main import ('context''fmt''golang.org/x/sync/errgroup''net/http''os''os/signal''syscall') func main() { g, ctx := errgroup.WithContext(context.Background())fmt.Println('服務(wù)啟動(dòng)start!')addr := ':9091's :=&http.Server{Addr: addr,Handler:http.DefaultServeMux,}g.Go(func() error {http.HandleFunc('/test1', func(writer http.ResponseWriter, request *http.Request) {fmt.Println('tes1')writer.Write([]byte('tes1'))})return s.ListenAndServe()})g.Go(func() error {exit := make(chan os.Signal)//監(jiān)聽 Ctrl+C 信號signal.Notify(exit, syscall.SIGINT, syscall.SIGTERM)select {case <-exit:fmt.Println('進(jìn)程已被取消~')return s.Shutdown(ctx)}})err := g.Wait()if err != nil {fmt.Println(err)}fmt.Println('服務(wù)啟動(dòng)成功!')if ctx.Err() !=nil {fmt.Println(ctx.Err())fmt.Println('服務(wù)關(guān)閉成功!')os.Exit(0)} }

補(bǔ)充:golang http服務(wù)實(shí)現(xiàn)平滑重啟

看代碼吧~

package main import ( 'context' 'encoding/json' 'fmt' 'math/rand' 'net/http' 'os' 'os/signal' 'time') var logChan = make(chan map[string]interface{}) var requestStatusMap = map[int]bool{} var done = make(chan bool, 1)var quit = make(chan os.Signal, 1) //為什么這樣可以平滑重啟?// 正常情況下是server.ListenAndServe() 這個(gè)位置hang住整個(gè)進(jìn)程的// 可以把這個(gè)程序看成兩部分,1個(gè)是web服務(wù)的監(jiān)聽部分,一個(gè)是處理部分, 如果web服務(wù)器不開啟了,那么就不能處理新進(jìn)來的請求了(可以理解為一個(gè)帶路的)// 真正讓這個(gè)請求斷掉 是因?yàn)橹鬟M(jìn)程(main)被kill// 所以平滑重啟的原理就是,先kill掉web服務(wù)器,不讓新的請求進(jìn)來,等現(xiàn)有的全部請求完了,然后結(jié)束當(dāng)前進(jìn)程func main() { server := newServer() signal.Notify(quit, os.Interrupt) go monitorKill(server, quit) server.ListenAndServe() <-done} func newServer() *http.Server { router := http.NewServeMux() router.HandleFunc('/hello', sayHello) return &http.Server{Addr: ':8262',Handler: router, }} func monitorKill(server *http.Server, quit <-chan os.Signal) { <-quit go shutDown(server) for {if len(requestStatusMap) != 0 { fmt.Println('目前還有進(jìn)行中的請求,請稍等') time.Sleep(time.Second * 1) continue} else { close(done) break} }} func shutDown(server *http.Server) { if err := server.Shutdown(context.Background()); err != nil {fmt.Println(err) }} func sayHello(w http.ResponseWriter, r *http.Request) { go WriteInfo()//請求寫日志 var uniqueId = GenerateRangeNum(1, 1000) requestStatusMap[uniqueId] = false url := r.URL.Path query := r.URL.RawQuery method := r.Method a := map[string] interface{}{'url' : url,'method' : method,'query' : query,'response': 'hello world!', } logChan<-a w.Write([]byte('hello world!')) time.Sleep(time.Second * 10) delete(requestStatusMap, uniqueId)} func WriteInfo() { info := <-logChan fileName := '/tmp/weekhomework.log' _, err := os.Stat(fileName) if err != nil || os.IsNotExist(err) {_, _ = os.Create(fileName) } f,err := os.OpenFile(fileName, os.O_WRONLY, 0644) defer f.Close() if err !=nil {fmt.Println(err.Error()) } else {//追加寫入 為什么O_APPEND 模式無法寫入? todon, _ := f.Seek(0, 2)infostr, _ := json.Marshal(info)_,err=f.WriteAt([]byte(string(infostr) +'n'), n) }} func GenerateRangeNum(min int, max int) int { if min == max {return min } rand.Seed(time.Now().Unix()) randNum := rand.Intn(max-min) + min return randNum}主要思路:

對于每個(gè)請求都做記錄,處理完成之后做刪除。 用一個(gè)協(xié)程去監(jiān)控中斷信號,有中斷信號先把http服務(wù)關(guān)閉。

如果這個(gè)時(shí)候還有請求沒有處理完,那么就輪訓(xùn)等待,等全部處理完那么就 發(fā)出終止信號結(jié)束main進(jìn)程的執(zhí)行

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

標(biāo)簽: Linux系統(tǒng)
主站蜘蛛池模板: 欧美高清性色生活片免费观看 | 亚洲日韩视频 | 国产精品亚洲精品不卡 | 一区二区三区在线免费观看视频 | 亚洲日韩aⅴ在线视频 | 免费永久观看美女视频网站网址 | 国产伦一区二区三区四区久久 | 国产91丝袜在线播放九色 | 日日噜噜噜夜夜爽爽狠狠69 | 亚洲加勒比久久88色综合1 | 亚洲欧美中文日韩二区一区 | 91精品国产91久久 | a毛片在线还看免费网站 | 男人操美女逼视频 | 国产成人一级片 | 久久精品中文字幕免费 | 亚洲毛片免费视频 | 久久er热在这里只有精品85 | 神马国产 | 色老头一区二区三区在线观看 | 日本加勒比在线视频 | 亚洲午夜a | 一区不卡在线观看 | 国产欧美va欧美va香蕉在线 | 国产精品视频男人的天堂 | 91国内精品久久久久免费影院 | 成年人午夜网站 | 日本a级片免费观看 | 精品综合| 悠悠影院欧美日韩国产 | 伊人国产在线视频 | 国产成人精品福利网站人 | 亚洲综合国产一区在线 | 成人网视频免费播放 | 白浆在线视频 | 国内精品久久精品 | 国产一区二区在线不卡 | 国产高清精品久久久久久久 | 最新中文字幕乱码在线 | 亚洲综合国产精品 | 欧美高清在线视频在线99精品 |