HTTP server connection draining(http server优雅的关闭)

本文介绍如何使用Go语言实现HTTP服务器的优雅关闭,通过监听SIGINT信号并在接收该信号后调用srv.Shutdown来确保所有正在进行的请求得到妥善处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载:http://colobu.com/2016/11/05/golang-18-whats-coming/?utm_source=tuicool&utm_medium=referral


Brad Fitzpatrick最近关闭了一个将近四年的issue,这个issue请求实现http.Server的连接耗尽(draining)的功能。现在可以调用srv.Close可以立即停止http.Server,也可以调用srv.Shutdown(ctx)等待已有的连接处理完毕(耗尽,draining, github.com/tylerb/graceful 的用户应该熟悉这个特性)。

下面这个例子中,服务器当收到SIGINT信号后(^C)会优雅地关闭。


package main
import (
	"context"
	"io"
	"log"
	"net/http"
	"os"
	"os/signal"
	"time"
)
func main() {
	// subscribe to SIGINT signals
	stopChan := make(chan os.Signal)
	signal.Notify(stopChan, os.Interrupt)
	mux := http.NewServeMux()
	mux.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		time.Sleep(5 * time.Second)
		io.WriteString(w, "Finished!")
	}))
	srv := &http.Server{Addr: ":8081", Handler: mux}
	go func() {
		// service connections
		if err := srv.ListenAndServe(); err != nil {
			log.Printf("listen: %s\n", err)
		}
	}()
	<-stopChan // wait for SIGINT
	log.Println("Shutting down server...")
	// shut down gracefully, but wait no longer than 5 seconds before halting
	ctx, _ := context.WithTimeout(context.Background(), 5*time.Second)
	srv.Shutdown(ctx)
	log.Println("Server gracefully stopped")
}



一旦收到SIGINT信号,服务器会立即停止接受新的连接,srv.ListenAndServe()会返回http.ErrServerClosedsrv.Shutdown会一直阻塞,直到所有未完成的request都被处理完以及它们底层的连接被关闭。

更复杂的处理可以通过context实现,例如使用context.Timeout实现最大的关闭等待时间。你可以尝试复制 https://github.com/tylerchr/examples/tree/master/draining 中的例子并实现它。

Draining watershed inlet”指的是将集水区入口进行排水处理。集水区是一个特定地区的自然地理单位,可以是山脉、山谷、湖泊等,它们可以收集、集中和传输降水。集水区入口指的是水流进入集水区的地方。排水处理是指通过一系列技术手段,将水从集水区入口排出,以维持集水区的水位和水质。 对于“draining watershed inlet”,既可以从短期角度理解为快速排水以应对暴雨等极端天气的措施,也可以从长期角度理解为维护集水区的可持续水资源管理。 在短期应急情况下,如极端降雨导致集水区水位上升,应采取及时排水的措施以避免洪涝灾害。这可以通过建设排水设施,如排水渠、水泵和沟渠等,将积水迅速引导出集水区。此外,还可以采取土地治理措施,如加强植被覆盖、防止土地沉降等,以减少水土流失和水域污染,从根本上降低集水区入口的排水压力。 在长期可持续水资源管理中,应采取综合治理措施以保护和改善集水区的生态环境。这可以包括保护源头,控制污染物排放,减少非点源污染;加强集水区的土壤保护和水土保持工作,减少土地退化;开展水资源综合利用和节约用水措施,提高集水区的水资源利用效率。 综上所述,“draining watershed inlet”应该是指从集水区入口进行排水处理。根据具体情况,可以采取短期的排水措施应对紧急情况,也需要长期的可持续水资源管理来保护和改善集水区的生态环境。这样才能有效处理集水区入口的排水问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值