From 39255faa9a60561d4bc2236157055c90a66e2784 Mon Sep 17 00:00:00 2001 From: liuyx Date: Thu, 18 Apr 2024 14:09:13 +0800 Subject: [PATCH] =?UTF-8?q?feat(grace):=20=E6=B5=8B=E8=AF=95=E5=A4=9A?= =?UTF-8?q?=E8=BF=9B=E7=A8=8B=E7=9B=91=E5=90=AC=E5=90=8C=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=20fd?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 25 +++++++++++++++++++ go.mod | 18 ++++++++++++++ go.sum | 18 ++++++++++++++ gracedemo/demo.go | 45 +++++++++++++++++++++++++++++++---- gracedemo/dev.sh | 28 ++++++++++++++++++++++ gracedemo/hot.sh | 27 +++++++++++++++++++++ gracedemo/manifest/version.go | 14 +++++++++++ gracehttp/http.go | 2 +- gracehttp/testbin_test.go | 2 +- 9 files changed, 172 insertions(+), 7 deletions(-) create mode 100644 .gitignore create mode 100644 go.mod create mode 100644 go.sum create mode 100755 gracedemo/dev.sh create mode 100755 gracedemo/hot.sh create mode 100644 gracedemo/manifest/version.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0a3d986 --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +### Go template +# If you prefer the allow list template instead of the deny list, see community template: +# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore +# +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ + +# Go workspace file +go.work + +.idea +_* \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..0a41f2b --- /dev/null +++ b/go.mod @@ -0,0 +1,18 @@ +module grace + +go 1.22.1 + +require ( + github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c + github.com/facebookgo/freeport v0.0.0-20150612182905-d4adf43b75b9 + github.com/facebookgo/grace v0.0.0-20180706040059-75cf19382434 + github.com/facebookgo/httpdown v0.0.0-20180706035922-5979d39b15c2 +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a // indirect + github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 // indirect + github.com/facebookgo/stats v0.0.0-20151006221625-1b76add642e4 // indirect + github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..2e9eb5b --- /dev/null +++ b/go.sum @@ -0,0 +1,18 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a h1:yDWHCSQ40h88yih2JAcL6Ls/kVkSE8GFACTGVnMPruw= +github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a/go.mod h1:7Ga40egUymuWXxAe151lTNnCv97MddSOVsjpPPkityA= +github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= +github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= +github.com/facebookgo/freeport v0.0.0-20150612182905-d4adf43b75b9 h1:wWke/RUCl7VRjQhwPlR/v0glZXNYzBHdNUzf/Am2Nmg= +github.com/facebookgo/freeport v0.0.0-20150612182905-d4adf43b75b9/go.mod h1:uPmAp6Sws4L7+Q/OokbWDAK1ibXYhB3PXFP1kol5hPg= +github.com/facebookgo/grace v0.0.0-20180706040059-75cf19382434 h1:mOp33BLbcbJ8fvTAmZacbBiOASfxN+MLcLxymZCIrGE= +github.com/facebookgo/grace v0.0.0-20180706040059-75cf19382434/go.mod h1:KigFdumBXUPSwzLDbeuzyt0elrL7+CP7TKuhrhT4bcU= +github.com/facebookgo/httpdown v0.0.0-20180706035922-5979d39b15c2 h1:nXeeRHmgNgjLxi+7dY9l9aDvSS1uwVlNLqUWIY4Ath0= +github.com/facebookgo/httpdown v0.0.0-20180706035922-5979d39b15c2/go.mod h1:TUV/fX3XrTtBQb5+ttSUJzcFgLNpILONFTKmBuk5RSw= +github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= +github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= +github.com/facebookgo/stats v0.0.0-20151006221625-1b76add642e4 h1:0YtRCqIZs2+Tz49QuH6cJVw/IFqzo39gEqZ0iYLxD2M= +github.com/facebookgo/stats v0.0.0-20151006221625-1b76add642e4/go.mod h1:vsJz7uE339KUCpBXx3JAJzSRH7Uk4iGGyJzR529qDIA= +github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 h1:7HZCaLC5+BZpmbhCOZJ293Lz68O7PYrF2EzeiFMwCLk= +github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= diff --git a/gracedemo/demo.go b/gracedemo/demo.go index 842d880..c4c43b9 100644 --- a/gracedemo/demo.go +++ b/gracedemo/demo.go @@ -5,11 +5,14 @@ package main import ( "flag" "fmt" + "grace/gracedemo/manifest" + "log" "net/http" "os" + "strconv" "time" - "github.com/facebookgo/grace/gracehttp" + "grace/gracehttp" ) var ( @@ -21,16 +24,47 @@ var ( func main() { flag.Parse() - gracehttp.Serve( + gracehttp.SetLogger(log.Default()) + _ = os.WriteFile("./_pid", []byte(strconv.Itoa(os.Getpid())), os.ModePerm) + log.Println("server start:", os.Getppid(), os.Getpid(), getManifest()) + err := gracehttp.Serve( &http.Server{Addr: *address0, Handler: newHandler("Zero ")}, - &http.Server{Addr: *address1, Handler: newHandler("First ")}, - &http.Server{Addr: *address2, Handler: newHandler("Second")}, + //&http.Server{Addr: *address1, Handler: newHandler("First ")}, + //&http.Server{Addr: *address2, Handler: newHandler("Second")}, ) + + if err != nil { + log.Println(err) + } + log.Println("server shutdown:", os.Getppid(), os.Getpid(), getManifest()) +} + +func getManifest() string { + return fmt.Sprintf("Version: %s Branch: %s Commit: %s Static:%s", manifest.Version, manifest.Branch, manifest.Commit, manifest.Static) } func newHandler(name string) http.Handler { mux := http.NewServeMux() mux.HandleFunc("/sleep/", func(w http.ResponseWriter, r *http.Request) { + duration, err := time.ParseDuration(r.FormValue("duration")) + //log.Println(r.URL) + if err != nil { + http.Error(w, err.Error(), 400) + return + } + time.Sleep(duration) + fmt.Fprintf( + w, + "+ %s started at %s slept for %d nanoseconds from pid %d. %s\n", + name, + now, + duration.Nanoseconds(), + os.Getpid(), + getManifest(), + ) + }) + //syscall.SetsockoptInt() + mux.HandleFunc("/restart", func(w http.ResponseWriter, r *http.Request) { duration, err := time.ParseDuration(r.FormValue("duration")) if err != nil { http.Error(w, err.Error(), 400) @@ -39,12 +73,13 @@ func newHandler(name string) http.Handler { time.Sleep(duration) fmt.Fprintf( w, - "%s started at %s slept for %d nanoseconds from pid %d.\n", + "+ %s started at %s slept for %d nanoseconds from pid %d.\n", name, now, duration.Nanoseconds(), os.Getpid(), ) }) + return mux } diff --git a/gracedemo/dev.sh b/gracedemo/dev.sh new file mode 100755 index 0000000..4bbec0d --- /dev/null +++ b/gracedemo/dev.sh @@ -0,0 +1,28 @@ +set -xe +PROG=t.out + + +if which git >/dev/null 2>&1; then + if git rev-parse --is-inside-work-tree > /dev/null 2>&1; then + # 获取最新的 commit ID + commit=$(git rev-parse --short=8 HEAD) + + # 获取当前分支名 + branch=$(git rev-parse --abbrev-ref HEAD) + + version=$(git describe --tags --always | sed 's/-/+/' | sed 's/^v//') + + static=`date +%Y%m%d_%H:%M:%S%z` + echo "build git repo info version: $version branch: $branch commit: $commit static: $static" + fi +fi + + + + +go build \ + -ldflags "-X grace/gracedemo/manifest.Version=$version -X grace/gracedemo/manifest.Commit=$commit -X grace/gracedemo/manifest.Branch=$branch -X grace/gracedemo/manifest.Static=$static" \ + -o ${PROG} + +#nohup ./${PROG} app.json 2>&1 & +./${PROG} > nohup.out \ No newline at end of file diff --git a/gracedemo/hot.sh b/gracedemo/hot.sh new file mode 100755 index 0000000..984c5aa --- /dev/null +++ b/gracedemo/hot.sh @@ -0,0 +1,27 @@ +set -xe +PROG=t.out + + +if which git >/dev/null 2>&1; then + if git rev-parse --is-inside-work-tree > /dev/null 2>&1; then + # 获取最新的 commit ID + commit=$(git rev-parse --short=8 HEAD) + + # 获取当前分支名 + branch=$(git rev-parse --abbrev-ref HEAD) + + version=$(git describe --tags --always | sed 's/-/+/' | sed 's/^v//') + + static=`date +%Y%m%d_%H:%M:%S%z` + echo "build git repo info version: $version branch: $branch commit: $commit static: $static" + fi +fi + + + + +go build \ + -ldflags "-X grace/gracedemo/manifest.Version=$version -X grace/gracedemo/manifest.Commit=$commit -X grace/gracedemo/manifest.Branch=$branch -X grace/gracedemo/manifest.Static=$static" \ + -o ${PROG} + +kill -HUG $(cat ./_pid) \ No newline at end of file diff --git a/gracedemo/manifest/version.go b/gracedemo/manifest/version.go new file mode 100644 index 0000000..67ecadb --- /dev/null +++ b/gracedemo/manifest/version.go @@ -0,0 +1,14 @@ +package manifest + +import "fmt" + +var ( + Branch = "" + Commit = "" + Version = "development" + Static = "" +) + +func init() { + fmt.Printf("[AppInfo][Init] Version: %s Branch: %s Commit: %s Static:%s\n", Version, Branch, Commit, Static) +} diff --git a/gracehttp/http.go b/gracehttp/http.go index eefe340..950e20d 100644 --- a/gracehttp/http.go +++ b/gracehttp/http.go @@ -149,7 +149,7 @@ func (a *app) run() error { // Start serving. a.serve() - // Close the parent if we inherited and it wasn't init that started us. + //Close the parent if we inherited and it wasn't init that started us. if didInherit && ppid != 1 { if err := syscall.Kill(ppid, syscall.SIGTERM); err != nil { return fmt.Errorf("failed to close parent: %s", err) diff --git a/gracehttp/testbin_test.go b/gracehttp/testbin_test.go index 4fa7dbd..ca207f8 100644 --- a/gracehttp/testbin_test.go +++ b/gracehttp/testbin_test.go @@ -13,7 +13,7 @@ import ( "testing" "time" - "github.com/facebookgo/grace/gracehttp" + "grace/gracehttp" ) const preStartProcessEnv = "GRACEHTTP_PRE_START_PROCESS"