package
Version:
v0.41.8
Opens a new window with list of versions in this module.
Published: Sep 22, 2020
License: MIT
Opens a new window with license information.
Imports: 12
Opens a new window with list of imports.
Imported by: 0
Opens a new window with list of known importers.
README
¶
说明
示例 1
本示例使用默认信号
-
代码
import (
"net/http"
"os"
"github.com/alex-my/ghelper/graceful"
"github.com/alex-my/ghelper/logger"
)
// http.Server 要求实现 ServeHTTP
type testServer struct {}
func (server *testServer) ServeHTTP(res http.ResponseWriter, req *http.Request) {
// 这里进行逻辑处理,比如按照路由进行处理
res.Write([]byte("Hello world"))
}
func main() {
addr := "127.0.0.1:8877"
server := &testServer{}
logger := logger.NewLogger()
// 使用 gserver 而不是 http.Server
gserver := graceful.NewServer(server, logger)
logger.Infof("listen on: http://%s, pid: %d", addr, os.Getpid())
// 监听信号
graceful.ListenSignal()
// 启动服务器,接受连接
err := gserver.ListenAndServe(addr)
if err != nil {
if err == http.ErrServerClosed {
logger.Info("server closed")
} else {
logger.Error(err.Error())
}
}
}
- 操作
- 关闭服务器:
ctrl+c|cmd+c 或者 kill {pid}
- 重启服务器:
kill -USR1 {pid} 或者 kill -USR2 {pid}
- 重启服务器后,我们发现,仍然可以访问网站。查看端口:
mac
下 lsof -i tcp:8877
示例 2
在示例 1 中,使用了默认配置的信号,SIGUSR1
,SIGUSR2
用于重启服务器,SIGINT
,SIGTERM
用于关闭服务器。但在实际情况中,可能 SIGUSR2
被用户设置其它用途,比如重载配置
。这里就需要用到自定义信号
-
代码:
import (
"net/http"
"os"
"github.com/alex-my/ghelper/graceful"
"github.com/alex-my/ghelper/logger"
)
// http.Server 要求实现 ServeHTTP
type testServer struct {}
func (server *testServer) ServeHTTP(res http.ResponseWriter, req *http.Request) {
// 这里进行逻辑处理,比如按照路由进行处理
res.Write([]byte("Hello world"))
}
func main() {
addr := "127.0.0.1:8877"
server := &testServer{}
logger := logger.NewLogger()
// 使用 gserver 而不是 http.Server
gserver := graceful.NewServer(server, logger)
// 设置重启信号 kill -USR1 {pid}
graceful.RegisterRestartSignal(syscall.SIGUSR1)
// 设置关闭信号 ctrl+c 或者 cmd+c
graceful.RegisterCloseSignal(syscall.SIGINT)
// 设置退出超时时间,默认 5 秒
graceful.SetShutdownTimeout(3)
// 注册清理函数,比如资源回收,先注册的函数先调用
graceful.RegisterShutdownHandler(func() {
// close mysql ..
})
graceful.RegisterShutdownHandler(func() {
// some other work
})
// 监听信号
graceful.ListenSignal()
// 启动服务器,接受连接
err := gserver.ListenAndServe(addr)
if err != nil {
if err == http.ErrServerClosed {
logger.Info("server closed")
} else {
logger.Error(err.Error())
}
}
}
Documentation
¶
RegisterCloseSignal 设置响应关闭的信号,接收到信号之后会优雅的关闭服务器
如果没有设置,会默认使用 SIGINT,SIGTERM
sig: 退出信号
RegisterRestartSignal 设置响应重启的信号,接收到信号之后会优雅的重启服务器
如果没有设置,会默认使用 SIGUSR1,SIGUSR2
sig: 重启信号
func RegisterShutdownHandler(f func()) error
RegisterShutdownHandler 注册关闭函数
按照注册的顺序调用这些函数
所有已经添加的服务器都会响应这个函数
func SetShutdownTimeout(timeout int)
SetShutdownTimeout 设置优雅退出超时时间
服务器会每隔500毫秒检查一次连接是否都断开处理完毕
如果超过超时时间,就不再检查,直接退出
如果要单独给指定的服务器设置 超时时间,可以使用 WithTimeout
timeout: 单位:秒,当 <= 0 时无效,直接退出
Shutdown 优雅关闭服务器
关闭监听
执行之前注册的关闭函数(RegisterShutdownHandler),可以用于清理资源等
关闭空闲连接,等待激活的连接变为空闲,再关闭它
Server 替代 http.Server
NewServer 生成服务器,用来替代 `http.Server`
ListenAndServe 用于替代 `http.Server.ListenAndServe`
ListenAndServeTLS 用于替代 `http.Server.ListenAndServeTLS`
Source Files
¶
Directories
¶
Click to show internal directories.
Click to hide internal directories.