在日常的應用開發中我們我們很多時候都需要處理軟件的升級以及滾動式升級,基於.net 應用clickonce 以及微軟的updte框架都
是一個不錯的選擇對於nodejs 的electron我們有electron-updater ,同時好多桌面應用的開發也會設計自己的更新程序,以下是
關於golang 應用升級的幾個不錯的包
幾個參考
- go-selfupdate
基於bsdiff 算法
參考資料 https://github.com/sanbornm/go-selfupdate - overseer
參考資料 https://github.com/jpillora/overseer - go-update
參考資料 https://github.com/inconshreveable/go-update - go-tuf
基於tuf 框架的實現,參考https://github.com/flynn/go-tuf
https://github.com/jpillora/overseer
說明
從安全以及規范角度來說使用tuf 框架的實現會比較好,以上介紹的幾個都是不錯的選擇,應該還會有其他的選擇,以上幾個是目前發現
幾個不錯的選擇,實際上設計一個完全可以自動升級以及平滑重啟的服務是有好多知識點,需要很好的處理系統的信號以及對於業務關聯操
作的評估。以上中overseer 使用相對比較簡單,一個參考demo
main.go
package main
import (
"fmt"
"log"
"net/http"
"time"
"github.com/jpillora/overseer"
"github.com/jpillora/overseer/fetcher"
)
//create another main() to run the overseer process
//and then convert your old main() into a 'prog(state)'
func main() {
overseer.Run(overseer.Config{
Program: prog,
Address: ":3000",
Fetcher: &fetcher.HTTP{
URL: "http://localhost:8080/binaries/myapp",
Interval: 1 * time.Second,
},
Debug: true,
})
}
//prog(state) runs in a child process
func prog(state overseer.State) {
log.Printf("app (%s) listening...", state.ID)
http.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, " demo app app (%s) says hello\n", state.ID)
}))
http.Serve(state.Listener, nil)
}
參考資料
https://theupdateframework.com/
http://www.daemonology.net/bsdiff/
