优化全局数据存储方式,以节点 id 为 key 保存相关数据;修复节点下线监听未关闭问题

This commit is contained in:
2025-05-17 11:02:18 +08:00
parent 84e01d3b50
commit c1664aa898
10 changed files with 77 additions and 51 deletions

View File

@@ -29,7 +29,6 @@ const (
func (s *Service) listenCtrl() error {
ctrlPort := env.AppCtrlPort
slog.Debug("监听控制通道", slog.Uint64("port", uint64(ctrlPort)))
// 监听端口
ls, err := net.Listen("tcp", ":"+strconv.Itoa(int(ctrlPort)))
@@ -80,22 +79,19 @@ func (s *Service) listenCtrl() error {
}
}
func (s *Service) processCtrlConn(ctx context.Context, conn net.Conn) (err error) {
func (s *Service) processCtrlConn(_ctx context.Context, conn net.Conn) (err error) {
// 通道上下文
ctx, cancel := context.WithCancel(_ctx)
// 结束后清理资源
var fwdPort uint16
defer func() {
_, portStr, err := net.SplitHostPort(conn.LocalAddr().String())
if err != nil {
slog.Error("获取控制通道端口失败", "err", err)
return
}
port, err := strconv.ParseUint(portStr, 10, 16)
if err != nil {
slog.Error("解析控制通道端口失败", "err", err)
return
}
app.DelEdge(uint16(port))
slog.Debug("关闭控制通道", "port", fwdPort)
app.DelEdge(fwdPort)
}()
// 处理控制命令
defer cancel()
reader := bufio.NewReader(conn)
for {
// 循环等待直到服务关闭
@@ -130,7 +126,7 @@ func (s *Service) processCtrlConn(ctx context.Context, conn net.Conn) (err error
return fmt.Errorf("读取节点 ID 失败: %w", err)
}
var client = int32(binary.BigEndian.Uint32(recv))
err = s.onOpen(conn, client)
fwdPort, err = s.onOpen(ctx, conn, client)
if err != nil {
return fmt.Errorf("处理连接建立命令失败: %w", err)
}
@@ -157,17 +153,16 @@ func (s *Service) processCtrlConn(ctx context.Context, conn net.Conn) (err error
}
}
func (s *Service) onOpen(writer io.Writer, edge int32) (err error) {
func (s *Service) onOpen(ctx context.Context, writer io.Writer, edge int32) (port uint16, err error) {
// open 命令全局只执行一次
_, ok := app.Edges.Load(edge)
if ok {
return fmt.Errorf("节点 ID %d 已经连接", edge)
return 0, fmt.Errorf("节点 ID %d 已经连接", edge)
}
// 分配端口
var minim uint16 = 20000
var maxim uint16 = 60000
var port uint16
for i := minim; i < maxim; i++ {
var _, ok = app.Assigns.Load(i)
if !ok {
@@ -177,17 +172,17 @@ func (s *Service) onOpen(writer io.Writer, edge int32) (err error) {
}
}
if port == 0 {
return errors.New("没有可用的端口")
return 0, errors.New("没有可用的端口")
}
// 报告端口分配
if err = report.Assigned(edge, port); err != nil {
return fmt.Errorf("报告端口分配失败: %w", err)
return 0, fmt.Errorf("报告端口分配失败: %w", err)
}
// 响应节点
if err = s.sendPong(writer); err != nil {
return fmt.Errorf("响应节点失败: %w", err)
return 0, fmt.Errorf("响应节点失败: %w", err)
}
// 启动转发服务
@@ -195,13 +190,13 @@ func (s *Service) onOpen(writer io.Writer, edge int32) (err error) {
go func() {
defer s.fwdLesWg.Done()
slog.Info("监听转发端口", "port", port, "edge", edge)
err = s.listenUser(port, writer)
err = s.listenUser(ctx, port, writer)
if err != nil {
slog.Error("监听转发端口失败", "port", port, "edge", edge, "err", err)
}
}()
return nil
return port, nil
}
func (s *Service) onPing(writer io.Writer) (err error) {