Skip to content

Commit a5164bb

Browse files
committed
fix(client): 优化更新处理与WebSocket连接管理
- 在版本更新处理时,改为发送 SIGTERM 信号以实现优雅关闭,确保资源正确释放 - 修改WebSocket连接的读取限制为无限制,避免大消息被截断 - 移除读取超时设置,依靠心跳机制和TCP keepalive保持连接持久化 - 记录WebSocket连接关闭的详细信息,增强日志记录
1 parent 4c99df7 commit a5164bb

6 files changed

Lines changed: 34 additions & 12 deletions

File tree

internal/client/update_version.go

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"os"
77
"path/filepath"
8+
"syscall"
89
"time"
910

1011
"github.com/https-cert/deploy/internal/updater"
@@ -58,6 +59,21 @@ func (uh *UpdateHandler) HandleUpdate() {
5859
return
5960
}
6061

61-
time.Sleep(1 * time.Second)
62-
os.Exit(0)
62+
// 发送 SIGTERM 信号给当前进程,触发优雅关闭
63+
// 这样可以让 HTTP 服务器和其他资源正确释放
64+
process, err := os.FindProcess(os.Getpid())
65+
if err != nil {
66+
logger.Error("获取当前进程失败", "error", err)
67+
// 降级方案:等待后强制退出
68+
time.Sleep(3 * time.Second)
69+
os.Exit(0)
70+
return
71+
}
72+
73+
if err := process.Signal(syscall.SIGTERM); err != nil {
74+
logger.Error("发送退出信号失败", "error", err)
75+
// 降级方案:等待后强制退出
76+
time.Sleep(3 * time.Second)
77+
os.Exit(0)
78+
}
6379
}

internal/client/ws_connection.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ func (c *WSClient) connect() error {
8989
return fmt.Errorf("WebSocket连接失败: %w", err)
9090
}
9191

92+
// 设置 WebSocket 读取限制为无限制,避免大消息被截断
93+
conn.SetReadLimit(-1)
94+
9295
c.connMu.Lock()
9396
c.conn = conn
9497
c.connMu.Unlock()

internal/client/ws_message_handler.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,19 +49,23 @@ func (c *WSClient) handleWSMessages() error {
4949
return errors.New("连接已关闭")
5050
}
5151

52-
// 设置读取超时(心跳间隔的 3 倍,确保有足够时间接收消息)
53-
readCtx, readCancel := context.WithTimeout(c.ctx, heartbeatInterval*3)
54-
_, data, err := conn.Read(readCtx)
55-
readCancel()
52+
// 不设置读取超时,让连接保持持久化
53+
// 依靠心跳机制和 TCP keepalive 来检测连接状态
54+
_, data, err := conn.Read(c.ctx)
5655

5756
if err != nil {
5857
if errors.Is(err, context.Canceled) {
58+
logger.Info("WebSocket 连接因 context 取消而关闭")
5959
return nil
6060
}
6161
// 使用 CloseStatus 检查正常关闭
62-
if websocket.CloseStatus(err) == websocket.StatusNormalClosure {
62+
closeStatus := websocket.CloseStatus(err)
63+
if closeStatus == websocket.StatusNormalClosure {
64+
logger.Info("WebSocket 连接正常关闭")
6365
return nil
6466
}
67+
// 记录详细的错误信息
68+
logger.Warn("WebSocket 读取错误", "error", err, "closeStatus", closeStatus)
6569
return err
6670
}
6771

@@ -157,7 +161,6 @@ func (c *WSClient) handleGetProvider(requestId string) {
157161

158162
// handleUpdate 处理版本更新
159163
func (c *WSClient) handleUpdate() {
160-
logger.Info("收到版本更新通知")
161164
updateHandler := NewUpdateHandler(c.ctx)
162165
updateHandler.HandleUpdate()
163166
}

internal/client/ws_sender.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ func (c *WSClient) sendHeartbeat(ctx context.Context) {
107107
}
108108

109109
if err := c.sendNotifyRequest(req); err != nil {
110-
logger.Warn("发送心跳失败,主动关闭连接以触发重连", "error", err)
110+
logger.Warn("发送心跳失败,主动关闭连接以触发重连", "error", err, "interval", heartbeatInterval)
111111
// 主动关闭连接,触发重连机制
112112
c.connMu.Lock()
113113
if c.conn != nil {

internal/scheduler/scheduler.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"time"
77

88
"github.com/https-cert/deploy/internal/client"
9+
"github.com/https-cert/deploy/internal/config"
910
"github.com/https-cert/deploy/internal/server"
1011
"github.com/https-cert/deploy/pkg/logger"
1112
)
@@ -60,6 +61,8 @@ func Start(ctx context.Context) {
6061

6162
// 启动 HTTP-01 验证服务器
6263
go func() {
64+
cfg := config.GetConfig()
65+
logger.Info("HTTP-01 验证服务启动", "port", cfg.Server.Port)
6366
if err := scheduler.httpServer.Start(); err != nil {
6467
logger.Error("HTTP-01 验证服务启动失败", "error", err)
6568
}

internal/server/http_server.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,6 @@ func NewHTTPServer() *HTTPServer {
6565

6666
// Start 启动 HTTP 服务器
6767
func (s *HTTPServer) Start() error {
68-
cfg := config.GetConfig()
69-
logger.Info("HTTP-01 验证服务启动", "port", cfg.Server.Port)
70-
7168
if err := s.server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
7269
return fmt.Errorf("HTTP 服务器启动失败: %w", err)
7370
}

0 commit comments

Comments
 (0)