golang實現熱更新的常規方式

2021-10-18 17:14:10 字數 1756 閱讀 5079

去年寫了乙個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重新打包吧。...