beego suppot graceful restart application
Showing
4 changed files
with
51 additions
and
2 deletions
| ... | @@ -19,9 +19,11 @@ import ( | ... | @@ -19,9 +19,11 @@ import ( |
| 19 | "encoding/json" | 19 | "encoding/json" |
| 20 | "fmt" | 20 | "fmt" |
| 21 | "net/http" | 21 | "net/http" |
| 22 | "os" | ||
| 22 | "text/template" | 23 | "text/template" |
| 23 | "time" | 24 | "time" |
| 24 | 25 | ||
| 26 | "github.com/astaxie/beego/grace" | ||
| 25 | "github.com/astaxie/beego/toolbox" | 27 | "github.com/astaxie/beego/toolbox" |
| 26 | "github.com/astaxie/beego/utils" | 28 | "github.com/astaxie/beego/utils" |
| 27 | ) | 29 | ) |
| ... | @@ -458,8 +460,14 @@ func (admin *adminApp) Run() { | ... | @@ -458,8 +460,14 @@ func (admin *adminApp) Run() { |
| 458 | http.Handle(p, f) | 460 | http.Handle(p, f) |
| 459 | } | 461 | } |
| 460 | BeeLogger.Info("Admin server Running on %s", addr) | 462 | BeeLogger.Info("Admin server Running on %s", addr) |
| 461 | err := http.ListenAndServe(addr, nil) | 463 | |
| 464 | var err error | ||
| 465 | if Graceful { | ||
| 466 | err = grace.ListenAndServe(addr, nil) | ||
| 467 | } else { | ||
| 468 | err = http.ListenAndServe(addr, nil) | ||
| 469 | } | ||
| 462 | if err != nil { | 470 | if err != nil { |
| 463 | BeeLogger.Critical("Admin ListenAndServe: ", err) | 471 | BeeLogger.Critical("Admin ListenAndServe: ", err, fmt.Sprint(os.Getpid())) |
| 464 | } | 472 | } |
| 465 | } | 473 | } | ... | ... |
| ... | @@ -22,6 +22,7 @@ import ( | ... | @@ -22,6 +22,7 @@ import ( |
| 22 | "os" | 22 | "os" |
| 23 | "time" | 23 | "time" |
| 24 | 24 | ||
| 25 | "github.com/astaxie/beego/grace" | ||
| 25 | "github.com/astaxie/beego/utils" | 26 | "github.com/astaxie/beego/utils" |
| 26 | ) | 27 | ) |
| 27 | 28 | ||
| ... | @@ -76,6 +77,41 @@ func (app *App) Run() { | ... | @@ -76,6 +77,41 @@ func (app *App) Run() { |
| 76 | err = fcgi.Serve(l, app.Handlers) | 77 | err = fcgi.Serve(l, app.Handlers) |
| 77 | } | 78 | } |
| 78 | } else { | 79 | } else { |
| 80 | if Graceful { | ||
| 81 | if EnableHttpTLS { | ||
| 82 | go func() { | ||
| 83 | time.Sleep(20 * time.Microsecond) | ||
| 84 | if HttpsPort != 0 { | ||
| 85 | addr = fmt.Sprintf("%s:%d", HttpAddr, HttpsPort) | ||
| 86 | } | ||
| 87 | server := grace.NewServer(addr, app.Handlers) | ||
| 88 | server.Server.ReadTimeout = time.Duration(HttpServerTimeOut) * time.Second | ||
| 89 | server.Server.WriteTimeout = time.Duration(HttpServerTimeOut) * time.Second | ||
| 90 | err := server.ListenAndServeTLS(HttpCertFile, HttpKeyFile) | ||
| 91 | if err != nil { | ||
| 92 | BeeLogger.Critical("ListenAndServeTLS: ", err) | ||
| 93 | time.Sleep(100 * time.Microsecond) | ||
| 94 | endRunning <- true | ||
| 95 | } | ||
| 96 | }() | ||
| 97 | } | ||
| 98 | if EnableHttpListen { | ||
| 99 | go func() { | ||
| 100 | server := grace.NewServer(addr, app.Handlers) | ||
| 101 | server.Server.ReadTimeout = time.Duration(HttpServerTimeOut) * time.Second | ||
| 102 | server.Server.WriteTimeout = time.Duration(HttpServerTimeOut) * time.Second | ||
| 103 | if ListenTCP4 && HttpAddr == "" { | ||
| 104 | server.Network = "tcp4" | ||
| 105 | } | ||
| 106 | err := server.ListenAndServe() | ||
| 107 | if err != nil { | ||
| 108 | BeeLogger.Critical("ListenAndServe: ", err, fmt.Sprint(os.Getpid())) | ||
| 109 | time.Sleep(100 * time.Microsecond) | ||
| 110 | endRunning <- true | ||
| 111 | } | ||
| 112 | }() | ||
| 113 | } | ||
| 114 | } else { | ||
| 79 | app.Server.Addr = addr | 115 | app.Server.Addr = addr |
| 80 | app.Server.Handler = app.Handlers | 116 | app.Server.Handler = app.Handlers |
| 81 | app.Server.ReadTimeout = time.Duration(HttpServerTimeOut) * time.Second | 117 | app.Server.ReadTimeout = time.Duration(HttpServerTimeOut) * time.Second |
| ... | @@ -128,5 +164,6 @@ func (app *App) Run() { | ... | @@ -128,5 +164,6 @@ func (app *App) Run() { |
| 128 | } | 164 | } |
| 129 | } | 165 | } |
| 130 | 166 | ||
| 167 | } | ||
| 131 | <-endRunning | 168 | <-endRunning |
| 132 | } | 169 | } | ... | ... |
| ... | @@ -82,6 +82,7 @@ var ( | ... | @@ -82,6 +82,7 @@ var ( |
| 82 | EnableDocs bool // enable generate docs & server docs API Swagger | 82 | EnableDocs bool // enable generate docs & server docs API Swagger |
| 83 | RouterCaseSensitive bool // router case sensitive default is true | 83 | RouterCaseSensitive bool // router case sensitive default is true |
| 84 | AccessLogs bool // print access logs, default is false | 84 | AccessLogs bool // print access logs, default is false |
| 85 | Graceful bool // use graceful start the server | ||
| 85 | ) | 86 | ) |
| 86 | 87 | ||
| 87 | type beegoAppConfig struct { | 88 | type beegoAppConfig struct { |
| ... | @@ -509,5 +510,8 @@ func ParseConfig() (err error) { | ... | @@ -509,5 +510,8 @@ func ParseConfig() (err error) { |
| 509 | if casesensitive, err := AppConfig.Bool("RouterCaseSensitive"); err == nil { | 510 | if casesensitive, err := AppConfig.Bool("RouterCaseSensitive"); err == nil { |
| 510 | RouterCaseSensitive = casesensitive | 511 | RouterCaseSensitive = casesensitive |
| 511 | } | 512 | } |
| 513 | if graceful, err := AppConfig.Bool("Graceful"); err == nil { | ||
| 514 | Graceful = graceful | ||
| 515 | } | ||
| 512 | return nil | 516 | return nil |
| 513 | } | 517 | } | ... | ... |
grace/grace.go
0 → 100644
This diff is collapsed.
Click to expand it.
-
Please register or sign in to post a comment