Go micro 在服务中监听是否还有请求在处理从而达到平滑关闭服务
需求:在关闭服务时检测该服务是否有请求在处理,平滑关闭服务
我尝试通过监听端口是否有活跃连接来判断该服务是否有请求在处理。编写完代码,在测试的时候,我发现有请求进来时,它可以等到该连接关闭时再关闭我的服务。但没有连接进来时,会一直卡在 ln.Accept() 这一步上。如下是我完整的代码:
func checkActiveConnection(serverAddress string) bool {
log.Debug("开始检测活跃连接---------------")
ln, err := net.Listen("tcp", serverAddress)
if ln == nil {
log.Debug("--------ln-------", ln)
return true
}
log.Debug("--------ln-------", ln)
if err != nil {
log.WithError(err).Error("Editor$checkActiveConnection$Listen")
return true
}
conn, err := ln.Accept()
if conn == nil {
log.Debug("没有连接进来 关闭服务")
return true
}
log.Debug("--------conn-------", conn)
if err != nil {
log.WithError(err).Error("Editor$checkActiveConnection$Accept")
return true
}
buf := make([]byte, 1024)
for {
n, err := conn.Read(buf)
fmt.Println("unexpected data: %s", buf[:n])
fmt.Println("-----------------err--------", err)
if err != nil || n <= 0 {
if err == io.EOF {
log.Debug("没有活跃连接")
conn.Close()
return true
}
}
if n > 0 {
fmt.Println("unexpected data: %s", buf[:n])
}
}
}
这是我尝试平滑关闭的步骤:
1,监听到进程终止信号
2,把服务从注册中心摘除
3,检测是否有连接在活跃状态
4,全部连接都在空闲或关闭状态下 即可停止服务