4138fe02 by astaxie

beego suppot graceful restart application

1 parent 245762f7
...@@ -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 }
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!