beego suppot graceful restart application
Showing
4 changed files
with
89 additions
and
40 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,57 +77,93 @@ func (app *App) Run() { | ... | @@ -76,57 +77,93 @@ func (app *App) Run() { |
| 76 | err = fcgi.Serve(l, app.Handlers) | 77 | err = fcgi.Serve(l, app.Handlers) |
| 77 | } | 78 | } |
| 78 | } else { | 79 | } else { |
| 79 | app.Server.Addr = addr | 80 | if Graceful { |
| 80 | app.Server.Handler = app.Handlers | 81 | if EnableHttpTLS { |
| 81 | app.Server.ReadTimeout = time.Duration(HttpServerTimeOut) * time.Second | 82 | go func() { |
| 82 | app.Server.WriteTimeout = time.Duration(HttpServerTimeOut) * time.Second | 83 | time.Sleep(20 * time.Microsecond) |
| 83 | 84 | if HttpsPort != 0 { | |
| 84 | if EnableHttpTLS { | 85 | addr = fmt.Sprintf("%s:%d", HttpAddr, HttpsPort) |
| 85 | go func() { | 86 | } |
| 86 | time.Sleep(20 * time.Microsecond) | 87 | server := grace.NewServer(addr, app.Handlers) |
| 87 | if HttpsPort != 0 { | 88 | server.Server.ReadTimeout = time.Duration(HttpServerTimeOut) * time.Second |
| 88 | app.Server.Addr = fmt.Sprintf("%s:%d", HttpAddr, HttpsPort) | 89 | server.Server.WriteTimeout = time.Duration(HttpServerTimeOut) * time.Second |
| 89 | } | 90 | err := server.ListenAndServeTLS(HttpCertFile, HttpKeyFile) |
| 90 | BeeLogger.Info("https server Running on %s", app.Server.Addr) | ||
| 91 | err := app.Server.ListenAndServeTLS(HttpCertFile, HttpKeyFile) | ||
| 92 | if err != nil { | ||
| 93 | BeeLogger.Critical("ListenAndServeTLS: ", err) | ||
| 94 | time.Sleep(100 * time.Microsecond) | ||
| 95 | endRunning <- true | ||
| 96 | } | ||
| 97 | }() | ||
| 98 | } | ||
| 99 | |||
| 100 | if EnableHttpListen { | ||
| 101 | go func() { | ||
| 102 | app.Server.Addr = addr | ||
| 103 | BeeLogger.Info("http server Running on %s", app.Server.Addr) | ||
| 104 | if ListenTCP4 && HttpAddr == "" { | ||
| 105 | ln, err := net.Listen("tcp4", app.Server.Addr) | ||
| 106 | if err != nil { | 91 | if err != nil { |
| 107 | BeeLogger.Critical("ListenAndServe: ", err) | 92 | BeeLogger.Critical("ListenAndServeTLS: ", err) |
| 108 | time.Sleep(100 * time.Microsecond) | 93 | time.Sleep(100 * time.Microsecond) |
| 109 | endRunning <- true | 94 | endRunning <- true |
| 110 | return | ||
| 111 | } | 95 | } |
| 112 | err = app.Server.Serve(ln) | 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() | ||
| 113 | if err != nil { | 107 | if err != nil { |
| 114 | BeeLogger.Critical("ListenAndServe: ", err) | 108 | BeeLogger.Critical("ListenAndServe: ", err, fmt.Sprint(os.Getpid())) |
| 115 | time.Sleep(100 * time.Microsecond) | 109 | time.Sleep(100 * time.Microsecond) |
| 116 | endRunning <- true | 110 | endRunning <- true |
| 117 | return | ||
| 118 | } | 111 | } |
| 119 | } else { | 112 | }() |
| 120 | err := app.Server.ListenAndServe() | 113 | } |
| 114 | } else { | ||
| 115 | app.Server.Addr = addr | ||
| 116 | app.Server.Handler = app.Handlers | ||
| 117 | app.Server.ReadTimeout = time.Duration(HttpServerTimeOut) * time.Second | ||
| 118 | app.Server.WriteTimeout = time.Duration(HttpServerTimeOut) * time.Second | ||
| 119 | |||
| 120 | if EnableHttpTLS { | ||
| 121 | go func() { | ||
| 122 | time.Sleep(20 * time.Microsecond) | ||
| 123 | if HttpsPort != 0 { | ||
| 124 | app.Server.Addr = fmt.Sprintf("%s:%d", HttpAddr, HttpsPort) | ||
| 125 | } | ||
| 126 | BeeLogger.Info("https server Running on %s", app.Server.Addr) | ||
| 127 | err := app.Server.ListenAndServeTLS(HttpCertFile, HttpKeyFile) | ||
| 121 | if err != nil { | 128 | if err != nil { |
| 122 | BeeLogger.Critical("ListenAndServe: ", err) | 129 | BeeLogger.Critical("ListenAndServeTLS: ", err) |
| 123 | time.Sleep(100 * time.Microsecond) | 130 | time.Sleep(100 * time.Microsecond) |
| 124 | endRunning <- true | 131 | endRunning <- true |
| 125 | } | 132 | } |
| 126 | } | 133 | }() |
| 127 | }() | 134 | } |
| 135 | |||
| 136 | if EnableHttpListen { | ||
| 137 | go func() { | ||
| 138 | app.Server.Addr = addr | ||
| 139 | BeeLogger.Info("http server Running on %s", app.Server.Addr) | ||
| 140 | if ListenTCP4 && HttpAddr == "" { | ||
| 141 | ln, err := net.Listen("tcp4", app.Server.Addr) | ||
| 142 | if err != nil { | ||
| 143 | BeeLogger.Critical("ListenAndServe: ", err) | ||
| 144 | time.Sleep(100 * time.Microsecond) | ||
| 145 | endRunning <- true | ||
| 146 | return | ||
| 147 | } | ||
| 148 | err = app.Server.Serve(ln) | ||
| 149 | if err != nil { | ||
| 150 | BeeLogger.Critical("ListenAndServe: ", err) | ||
| 151 | time.Sleep(100 * time.Microsecond) | ||
| 152 | endRunning <- true | ||
| 153 | return | ||
| 154 | } | ||
| 155 | } else { | ||
| 156 | err := app.Server.ListenAndServe() | ||
| 157 | if err != nil { | ||
| 158 | BeeLogger.Critical("ListenAndServe: ", err) | ||
| 159 | time.Sleep(100 * time.Microsecond) | ||
| 160 | endRunning <- true | ||
| 161 | } | ||
| 162 | } | ||
| 163 | }() | ||
| 164 | } | ||
| 128 | } | 165 | } |
| 129 | } | ||
| 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