下面是对 Go 库 github.com/fvbock/endless
的使用方法整理,适合想要在 Web 服务中实现**优雅重启(graceful restart)**的人阅读。
📦 1. 安装
go get github.com/fvbock/endless
🧠 2. 基本原理(简要说明)
endless
是对net/http
的封装。- 用
endless.ListenAndServe()
替代标准库的http.ListenAndServe()
。 - 实现优雅关闭和重启,保持老连接不中断,等待完成后退出。
🧪 3. 示例代码
package main
import (
"fmt"
"log"
"net/http"
"github.com/fvbock/endless"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello, this is an endless server!")
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", handler)
addr := ":8080"
log.Printf("Starting server at %s\n", addr)
// 使用 endless 启动服务器
err := endless.ListenAndServe(addr, mux)
if err != nil {
log.Fatalf("Server error: %v", err)
}
}
🔄 4. 如何触发优雅重启
支持的信号:
SIGHUP
:重启(推荐)SIGINT
,SIGTERM
: 正常退出(优雅)SIGKILL
: 强制杀死(非优雅)
使用示例:
# 获取进程 PID
ps aux | grep your_app_name
# 给进程发送 SIGHUP 信号,触发优雅重启
kill -HUP <pid>
🛠️ 5. 常用函数(简要说明)
函数名 | 说明 |
---|---|
endless.ListenAndServe() | 替代标准的 http.ListenAndServe() ,支持优雅重启。 |
endless.ListenAndServeTLS() | 与 ListenAndServeTLS() 类似,用于 HTTPS。 |
endless.NewServer() | 创建一个自定义的 Server 对象(可选高级用法)。 |
⚠️ 6. 注意事项
- 必须用
endless
的方法代替标准库的ListenAndServe()
,否则不会生效。 - 如果你使用了
http.Server
对象,要用endless.NewServer()
创建。 - 日志和信号处理建议你加上,便于调试。
🧪 7. 示例:使用 TLS
err := endless.ListenAndServeTLS(":443", "cert.pem", "key.pem", handler)
✅ 8. 适合场景
- Web 服务升级(无停机)
- 微服务部署
- 支持长连接(WebSocket)
🧾 9. 参考资料
需要我帮你写一个支持优雅重启的生产级 Web 应用模板也可以告诉我。