还记得怎么启动一个HTTP Server么?
package mainimport ( "net" "net/http")func main() { // 方式1 err := http.ListenAndServe(":8080", nil) if err != nil { panic(err) } // 方式2 // server := &http.Server{Addr: ":8080"} // err := server.ListenAndServe() // if err != nil { // panic(err) // }}
ListenAndServe在不出错的情况下,会一直阻塞在这个位置,如何停止这样的一个HTTP Server呢?
CTRL+C是结束一个进程常用的方式,它和kill pid或者kill -l 15 pid命令本质上没有任何区别,他们都是向进程发送了SIGTERM信号。因为程序没有设置对SIGTERM信号的处理程序,所以系统默认的信号处理程序结束了我们的进程
这会带来什么问题?
在服务器的进程被杀死时,我们的服务器可能正在处理请求并未完成。因此对于客户端产生了一个预期外的错误
curl -v --max-time 4 127.0.0.1:8009/foo* Connection #0 to host 127.0.0.1 left intact* Trying 127.0.0.1:8009...* Connected to 127.0.0.1 (127.0.0.1) port 8009 (#0)> GET /foo HTTP/1.1> Host: 127.0.0.1:8009> User-Agent: curl/7.86.0> Accept: */*> * Empty reply from server* Closing connection 0curl: (52) Empty reply from server
如果有nginx代理,因为upstream的中断,nginx会产生502的响应
curl -v --max-time 11 127.0.0.1:8010/foo* Trying 127.0.0.1:8010...* Connected to 127.0.0.1 (127.0.0.1) port 8010 (#0)> GET /foo HTTP/1.1> Host: 127.0.0.1:8010> User-Agent: curl/7.86.0> Accept: */*> * Mark bundle as not supporting multiuse< HTTP/1.1 502 Bad Gateway< Server: nginx/1.25.3< Date: Sat, 02 Dec 2023 10:14:33 GMT< Content-Type: text/html< Content-Length: 497< Connection: keep-alive< ETag: "6537cac7-1f1"
优雅关闭(graceful shutdown)指的是我们的HTTP Server关闭前既拒绝新来的请求,又正确的处理完正在进行中的请求,随后进程退出。如何实现?
本文链接:http://www.28at.com/showinfo-26-37244-0.html深入理解Go标准库-http server的优雅关闭
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
上一篇: 使用Ruff改善Python编程风格