闽公网安备 35020302035485号
type Config struct {
Message string
}
var conf = &Config{Message: "Before hot reload"}
上面的代码只是一个简单的配置样本,你可以根据自己的需要定义一个复杂的结构。其次,定义一个路由器函数,用来绑定和监听8080端口。在热重载配置完成后,它也被用来显示结果。代码如下:func router() {
log.Println("starting up....")
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
_, _ = w.Write([]byte(conf.Message))
})
go func() {
log.Fatal(http.ListenAndServe(":8080", nil))
}()
}
下一步是服务器关机和热重载配置。当一个服务器关闭时,它应该停止接收新的请求,同时完成正在进行的请求,返回其响应,然后关闭。像其他文章一样,我将在这里使用信号包。sigCh := make(chan os.Signal, 1)之后,我也会使用signal.Notify()。但是我一起发送更多的信号。
signal.Notify(sigCh, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM)
上述代码中,当程序被中断时,signal.Notify将向sigCh通道发送一个信号。
syscall.SIGHUP、syscall.SIGINT和syscall.SIGTERM是什么意思?
syscall.SIGINT是用来在Ctrl+C时优雅地关闭的,它也相当于os.Interrupt。func main() {
router()
sigCh := make(chan os.Signal, 1)
signal.Notify(sigCh, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM)
for {
multiSignalHandler(<-sigCh)
}
}
由于这个帖子也包括优雅地关闭,multiSignalHandler(<-sigCh)被用来接收chan值,然后,它将决定运行代码的哪一部分。multiSignalHandler的代码如下:func multiSignalHandler(signal os.Signal) {
switch signal {
case syscall.SIGHUP:
log.Println("Signal:", signal.String())
log.Println("After hot reload")
conf.Message = "Hot reload has been finished."
case syscall.SIGINT:
log.Println("Signal:", signal.String())
log.Println("Interrupt by Ctrl+C")
os.Exit(0)
case syscall.SIGTERM:
log.Println("Signal:", signal.String())
log.Println("Process is killed.")
os.Exit(0)
default:
log.Println("Unhandled/unknown signal")
}
}
以上所有的代码将使优雅地关机和热重载配置工作。我把整个代码粘贴在下面,你可以很容易地把它粘贴到你的环境中。package main
// 堆代码 www.duidaima.com
import (
"log"
"net/http"
"os"
"os/signal"
"syscall"
)
type Config struct {
Message string
}
var conf = & Config {
Message: "Before hot reload"
}
func router() {
log.Println("starting up....")
http.HandleFunc("/", func(w http.ResponseWriter, r * http.Request) {
_, _ = w.Write([] byte(conf.Message))
})
go func() {
log.Fatal(http.ListenAndServe(":8080", nil))
}()
}
func main() {
router()
sigCh: = make(chan os.Signal, 1)
signal.Notify(sigCh, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM)
for {
multiSignalHandler( < -sigCh)
}
}
func multiSignalHandler(signal os.Signal) {
switch signal {
case syscall.SIGHUP:
log.Println("Signal:", signal.String())
log.Println("After hot reload")
conf.Message = "Hot reload has been finished."
case syscall.SIGINT:
log.Println("Signal:", signal.String())
log.Println("Interrupt by Ctrl+C")
os.Exit(0)
case syscall.SIGTERM:
log.Println("Signal:", signal.String())
log.Println("Process is killed.")
os.Exit(0)
default:
log.Println("Unhandled/unknown signal")
}
}

curl localhost:8080如果你按上述步骤操作,运行服务器后,你会看到与截图类似的结果。


lsof -i tcp:port-number上面的命令是用来检查当前端口号在本地的PID。

kill -SIGHUP 4358743587与截图中的PID相同。


kill -9 port-number在二号终端中,终止程序。