beego 优雅重启
前言
最近在寫 go 的項目, http 用的 beego 框架. 因為 go 不想 php, 每次代碼改動都需要重啟服務, 所以代碼發上線之后, 如何重啟服務就成了一個問題. 如果強行重啟的話, 不光在重啟期間的所有訪問都被拒絕了, 而且在殺掉進程的時候處理中的請求也掛了. 對于一個向用戶正常提供服務的服務器來說, 這種情況自然時無法容忍的.
在我的設想中, 服務的重啟應該是啟動進程處理新的請求, 而老進程則等待將現有請求處理完再退出, 這樣就可以無縫重啟了.
想法是好的, 結果網上搜了半天, 都是針對 http 系統模塊的, 沒有找到 beego 的優雅重啟. 但是我還很納悶, 這么流行的框架, 竟然沒有人寫過? (當然, 后面完美的證明了我的愚蠢)
嘗試
在我搜了半天沒有找到的時候, 機智的我自然就要動手自己搞了.在我的設想中, 大概分為以下三步:
想法是好的, 接下來就是如何實現了, 一步一步來.
第一步很簡單, 說白了就是如何向進程發送消息, 我嘗試了修改本地文件, 也想過用消息隊列, 不過最終還是選擇了大多數人的選擇,?kill命令發送信號量.
準備開始第二步了, 這個時候就坑了. 首先,?beego的運行只有一條命令beego.run(). 很顯然, 它將http封裝了起來, 所以要想在停止端口監聽的同時, 進程繼續處理現有請求, 只有兩條路走. 一是beego有暴露的方法支持停止端口監聽的操作. 二就是重寫beego源碼. 而重寫源碼就意味著之后就不能跟著版本進行更新了, 所以是下下策.
不管怎么說吧, 先對beego的啟動機制有個了解是必要的. 就從run方法進去. 而就在我進入方法走了沒兩步, 看到了這樣的代碼:
看注釋. 啟動優雅模式. 這這這這, 這不就是我要的么?????? 這我整半天整了個毛啊, 人家一開始就支持. 嘗試一下, 將值置為 true 試一下:
beego.BConfig.Listen.Graceful = true
那么問題來了,?beego是如何接收信號的呢? 從下面調用的ListenAndServe?方法走進去. 找到啟動信號監聽的地方, 然后看一下監聽的是哪個信號就可以了. 結果, 往里走了兩個方法就找到了:
顯然, 通過HUP信號會啟動子進程來實現優雅重啟, 而INT信號會令進程停止. 然后我驗證了一下.
簡單試了一下, 確實實現了優雅重啟. 原進程會在請求處理完之后停止.
另外, 也可以在app.cnf中通過配置來啟動優雅重啟:
Graceful=false
總結
最后, 我到google重新搜了一下:?beego graceful. 結果發下其赫然躺在搜索結果的第一條. 我???
所以, 之后要盡量使用英文關鍵詞搜索, 中文搜索有時定位不到準確的結果, 反而浪費了大量時間. 就比如這次, 如果最開始搜到了這條, 可能十幾分鐘就搞出來了. 偏偏最后我翻源碼翻了幾個小時, 得出的結論和那十幾分鐘的還是一樣的. 好氣呀.
謹以此記錄我這被自己坑的一次.
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的beego 优雅重启的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php使用未定义常数,php-使用未定义
- 下一篇: linux双屏播放视频,Ubuntu L