如何优雅地重启go程序--endless篇

本文介绍了如何使用endless实现Go程序的优雅重启,避免端口占用和用户请求中断问题。通过fork进程、复用socket实现平滑更新,确保0切换时间差。详细阐述了endless的工作原理,包括kill -1信号处理、ListenAndServe方法和socket复用。
摘要由CSDN通过智能技术生成

前言

当go语言开发的server应用已经在运行时,如果更新了代码,直接编译并运行,那么不好意思,端口已经在使用中:

listen tcp :8000: bind: address already in use

看到这样的错误信息,我们通常都是一通下意识的操作:

lsof -i:8000
kill -9 …

这样做端口被占用的问题是解决了,go程序也成功更新了。但是这里面还隐藏着两个问题:

  1. kill程序时可能把正在处理的用户请求给中断了
  2. 从kill到重新运行程序这段时间里没有应用在处理用户请求

关于如何解决这两个问题,网上有多种解决方案,今天我们谈谈endless的解决方案。

endless

endless的github地址为:https://github.com/fvbock/endless
她的解决方案是fork一个进程运行新编译的应用,该子进程接收从父进程传来的相关文件描述符,直接复用socket,同时父进程关闭socket。父进程留在后台处理未处理完的用户请求,这样一来问题1解决了。且复用soket也直接解决了问题2,实现0切换时间差。复用socket可以说是endless方案的核心。

使用

endless可以很方便的接入已经写好的程序,对于原生api,直接替换ListenAndServe为endless的方法,如下。并在编译完新的程序后,执行kill -1 旧进程id,旧进程便会fork一个进程运行新编译的程序。注:此处需要保证新编译的程序的路径和程序名和旧程序的一致。

func handler(w http.ResponseWriter, r *http.Request) {
   
	w.Write([]byte("WORLD!"))
}

func main() {
   
	mux1 := mux.NewRouter()
	mux1.HandleFunc("/hello", handler).
		Methods("GET")

	err := endless.ListenAndServe("localhost:4242", mux1)
	if err != nil {
   
		log.Println(err)
	}
	log.Println("Server on 4242 stopped")

	os.Exit(0)
}

对于使用gin框架的程序,可以以下面的方式接入:

    r := gin.New()
	r.GET("/", func(c *gin.Context) {
   
		c.String(200, config.Config.Server.AppId)
	})
	s := endless.NewServer(":8080", r)
	err := s.ListenAndServe()
	if err != nil {
   
		log.Printf("server err: %v", err)
	}

原理

其使用非常简单,实现代码也很少,但是很强大,下面我们看看她的实现:

kill -1

endless的使用方法是先编译新程序,并执行"kill -1 旧进程id",我们看看旧程序接收到-1信号之后作了什么:

func (srv *endlessServer) handleSignals() {
   
	...
	for {
   
		sig = <-srv.sigChan
		srv.signalHooks(PRE_SIGNAL, sig
  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

番茄大圣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值