去年寫了乙個agent的程式,用於收集生產伺服器的一些資料,以及對應的一些自動化操作等, 寫完之後經常要修修改改加一些新功能, 產線伺服器數量就很多, 導致了每次更新都是個大動作,目前的做法是通過puppet管理,新版本就往puppet上丟,等他自動重啟即可,由此聯想到了老東家遊戲服務的熱載入,所以看了一下golang的熱載入實現。第一種方式, 檔案主體更新golang服務程序執行時監聽usr2訊號
fork子程序(啟動新版本服務)
將上下文, 控制代碼等資訊交到新的子程序
新程序開始監聽socket請求
等待舊服務連線停止
ch := make(chan os.signal, 10)
signal.notify(ch, syscall.sigint, syscall.sigterm, syscall.sigusr2)
for
execspec := &syscall.procattr,
}fork, err := syscall.forkexec(os.args[0], os.args, execspec)
......
process, _ := os.findprocess(os.getppid())
process.signal(syscall.sighub)
......
}
當然自己造輪子也不錯,當然自己實現可能會有一些bug之類的,常規的http服務可以直接用endless和grace。
}第二種方式, 只更新配置檔案第三種方式, 基於plugin的方式進行更新寫過c++或者做過運維的一般都了解,c的**發布經常是只更新 .so 檔案, 這裡的.so即是linux的動態鏈結庫,其作用是節省程式主體的大小,且可以靈活更新,golang的plugin即是和其原理類似,主要程式主體邏輯不修改,只改動外掛程式的**,即發布可以做到非常靈活。
plugina.go:
package main
import (
"fmt"
)func iamplugina()
編譯成外掛程式
go build --buildmode=plugin -o plugina.so plugina.go
**主體
package main
import (
"fmt"
"os"
"plugin"
)func main()
s, err := p.lookup("iamplugina")
if err != nil
if x, ok := s.(func()); ok
}
****也比較簡單,開啟檔案物件,找到函式,然後對函式物件(這會還是個inte***ce{})進行斷言成函式,最後執行該函式。
golang配置檔案熱更新
配置檔案熱更新是伺服器程式的乙個基本功能,通過熱更新可以不停機調整程式的配置,特別是在生產環境可以提供極大的便利,比如發現log打得太多了可以動態調高日誌等級,業務邏輯引數變化,甚至某個功能模組的開關等都可以動態調整。每種語言都有自己的熱更新實現方式,在golang裡面我看到了有人採用了一種錯誤的實...
golang配置檔案熱更新
type config struct var config config func loadconfig err json.unmarshal f,config if err nil func init package main import encoding json fmt io ioutil ...
war包熱更新 electron 熱更新實現方式
1 electron是乙個外殼 html js css 資料報 按照官方的邏輯,採用electron builder的時候 會直接打包成asar 如果單單是打包html檔案也就算了,關鍵裡面還打包的node module 整整100mb 我只更新個html,不可能對node module重新打包吧。...