日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

beego 优雅重启

發(fā)布時(shí)間:2024/8/23 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 beego 优雅重启 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

最近在寫(xiě) go 的項(xiàng)目, http 用的 beego 框架. 因?yàn)?go 不想 php, 每次代碼改動(dòng)都需要重啟服務(wù), 所以代碼發(fā)上線之后, 如何重啟服務(wù)就成了一個(gè)問(wèn)題. 如果強(qiáng)行重啟的話, 不光在重啟期間的所有訪問(wèn)都被拒絕了, 而且在殺掉進(jìn)程的時(shí)候處理中的請(qǐng)求也掛了. 對(duì)于一個(gè)向用戶正常提供服務(wù)的服務(wù)器來(lái)說(shuō), 這種情況自然時(shí)無(wú)法容忍的.

在我的設(shè)想中, 服務(wù)的重啟應(yīng)該是啟動(dòng)進(jìn)程處理新的請(qǐng)求, 而老進(jìn)程則等待將現(xiàn)有請(qǐng)求處理完再退出, 這樣就可以無(wú)縫重啟了.

想法是好的, 結(jié)果網(wǎng)上搜了半天, 都是針對(duì) http 系統(tǒng)模塊的, 沒(méi)有找到 beego 的優(yōu)雅重啟. 但是我還很納悶, 這么流行的框架, 竟然沒(méi)有人寫(xiě)過(guò)? (當(dāng)然, 后面完美的證明了我的愚蠢)

嘗試

在我搜了半天沒(méi)有找到的時(shí)候, 機(jī)智的我自然就要?jiǎng)邮肿约焊懔?在我的設(shè)想中, 大概分為以下三步:

  • 接收服務(wù)重啟的命令
  • 老進(jìn)程停止接收請(qǐng)求并在現(xiàn)有請(qǐng)求處理完后退出
  • 啟動(dòng)新進(jìn)程處理新的請(qǐng)求
  • 想法是好的, 接下來(lái)就是如何實(shí)現(xiàn)了, 一步一步來(lái).

    第一步很簡(jiǎn)單, 說(shuō)白了就是如何向進(jìn)程發(fā)送消息, 我嘗試了修改本地文件, 也想過(guò)用消息隊(duì)列, 不過(guò)最終還是選擇了大多數(shù)人的選擇,?kill命令發(fā)送信號(hào)量.

    準(zhǔn)備開(kāi)始第二步了, 這個(gè)時(shí)候就坑了. 首先,?beego的運(yùn)行只有一條命令beego.run(). 很顯然, 它將http封裝了起來(lái), 所以要想在停止端口監(jiān)聽(tīng)的同時(shí), 進(jìn)程繼續(xù)處理現(xiàn)有請(qǐng)求, 只有兩條路走. 一是beego有暴露的方法支持停止端口監(jiān)聽(tīng)的操作. 二就是重寫(xiě)beego源碼. 而重寫(xiě)源碼就意味著之后就不能跟著版本進(jìn)行更新了, 所以是下下策.

    不管怎么說(shuō)吧, 先對(duì)beego的啟動(dòng)機(jī)制有個(gè)了解是必要的. 就從run方法進(jìn)去. 而就在我進(jìn)入方法走了沒(méi)兩步, 看到了這樣的代碼:

    看注釋. 啟動(dòng)優(yōu)雅模式. 這這這這, 這不就是我要的么?????? 這我整半天整了個(gè)毛啊, 人家一開(kāi)始就支持. 嘗試一下, 將值置為 true 試一下:

    beego.BConfig.Listen.Graceful = true

    那么問(wèn)題來(lái)了,?beego是如何接收信號(hào)的呢? 從下面調(diào)用的ListenAndServe?方法走進(jìn)去. 找到啟動(dòng)信號(hào)監(jiān)聽(tīng)的地方, 然后看一下監(jiān)聽(tīng)的是哪個(gè)信號(hào)就可以了. 結(jié)果, 往里走了兩個(gè)方法就找到了:

    顯然, 通過(guò)HUP信號(hào)會(huì)啟動(dòng)子進(jìn)程來(lái)實(shí)現(xiàn)優(yōu)雅重啟, 而INT信號(hào)會(huì)令進(jìn)程停止. 然后我驗(yàn)證了一下.

  • 在beego運(yùn)行前修改其配置:?beego.BConfig.Listen.Graceful = true
  • 通過(guò)kill -HUP pid命令重啟.
  • 簡(jiǎn)單試了一下, 確實(shí)實(shí)現(xiàn)了優(yōu)雅重啟. 原進(jìn)程會(huì)在請(qǐng)求處理完之后停止.

    另外, 也可以在app.cnf中通過(guò)配置來(lái)啟動(dòng)優(yōu)雅重啟:

    Graceful=false

    總結(jié)

    最后, 我到google重新搜了一下:?beego graceful. 結(jié)果發(fā)下其赫然躺在搜索結(jié)果的第一條. 我???

    所以, 之后要盡量使用英文關(guān)鍵詞搜索, 中文搜索有時(shí)定位不到準(zhǔn)確的結(jié)果, 反而浪費(fèi)了大量時(shí)間. 就比如這次, 如果最開(kāi)始搜到了這條, 可能十幾分鐘就搞出來(lái)了. 偏偏最后我翻源碼翻了幾個(gè)小時(shí), 得出的結(jié)論和那十幾分鐘的還是一樣的. 好氣呀.

    謹(jǐn)以此記錄我這被自己坑的一次.

    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的beego 优雅重启的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。