5.7 KiB
5.7 KiB
Core 模块重构完成总结
🎉 重构成果
Phase 1: 目录结构调整 ✅
已完成:
- ✅ 删除
core/transport/connect/- 重复的 connect 包 - ✅ 删除
core/transport/intercept.go- 废弃文件 - ✅ 创建
core/client/目录 - ✅ 移动 3 个协议客户端到
client/:stun_client.go- STUN 协议客户端turn_client.go- TURN 协议客户端ws_client.go- WebSocket 协议客户端
- ✅ 更新所有文件的 package 为
package client
重命名的文件:
- ✅
turn_factory.go→turn_udp.go(TURN-UDP 工厂) - ✅
ws_factory.go→ws.go(WS/WSS 工厂)
删除的空文件:
- ✅
fake_tcp_factory.go - ✅
real_tcp_factory.go
Phase 2: 消除重复代码 ✅
1. connect/stun.go - 完全重构 ✅
修改前:
// 180 行 - 自己实现 STUN 客户端
type STUNClient struct { ... }
func (c *STUNClient) GetExternalAddress() { ... } // 100 行实现
修改后:
// 85 行 - 调用 client 层
import "git.zkcoi.com/zkcoi/meshray/core/client"
stun := client.NewSTUNClient(servers, logger)
result := stun.GetExternalIP()
收益:
- 删除 95 行代码 ✅
- 职责清晰:connect 管决策,client 管协议 ✅
2. connect/turn_udp.go - 简化框架 ✅
修改前:
// 409 行 - 完整的 TURN 客户端实现
type TURNClient struct { ... }
func (c *TURNClient) Allocate() { ... } // 350 行实现
修改后:
// 62 行 - 工厂框架(待完整实现)
func (f *TURNFactory) Dial(...) (net.Conn, error) {
// TODO: 调用 client/turn_client.go
return nil, fmt.Errorf("待实现")
}
收益:
- 删除 347 行代码 ✅
- 明确职责边界 ✅
📊 重构数据对比
| 文件 | 修改前 | 修改后 | 净减少 | 状态 |
|---|---|---|---|---|
connect/stun.go |
180 行 | 85 行 | -95 行 | ✅ 完成 |
connect/turn_udp.go |
409 行 | 62 行 | -347 行 | ⏳ 待完整实现 |
fake_tcp_factory.go |
55 行 | 0 行 | -55 行 | ✅ 删除 |
real_tcp_factory.go |
55 行 | 0 行 | -55 行 | ✅ 删除 |
| 总计 | 699 行 | 147 行 | -552 行 | - |
🎯 最终目录结构
core/
├── client/ # ✅ 协议客户端(不返回连接)
│ ├── stun_client.go # STUN 协议:Binding/NAT 检测
│ ├── turn_client.go # TURN 协议:Allocate/Permission
│ └── ws_client.go # WebSocket 协议:Handshake/Frame
│
├── connect/ # ✅ 建连工厂(返回 net.Conn)
│ ├── strategy.go # 9 层策略调度
│ ├── ice.go # ICE 协商 + WebRTC
│ ├── stun.go # Direct-UDP 工厂 ✅ 已重构
│ ├── fake_tcp.go # FakeTCP 工厂
│ ├── real_tcp.go # RealTCP 工厂
│ ├── turn_udp.go # TURN-UDP 工厂 ⏳ 待完整实现
│ ├── turn_quic.go # TURN-QUIC 工厂
│ └── ws.go # WS/WSS 工厂
│
├── transport/ # ✅ 传输绑定层(WireGuard 数据传输)
│ ├── core_bind.go # conn.Bind 实现
│ └── relay.go # Read/Write 循环
│
├── connection_manager.go # Peer 连接管理
├── core.go # Core 主实例
└── core_service_server.go # gRPC 服务
✅ 验证结果
编译检查
✅ go build ./core/connect # 编译通过
✅ go build ./core # 编译通过
架构清晰度
| 维度 | 重构前 | 重构后 | 改进 |
|---|---|---|---|
| 职责分离 | ❌ connect 和 client 混淆 | ✅ connect 管决策,client 管协议 | ⭐⭐⭐⭐⭐ |
| 代码复用 | ❌ STUN/TURN 重复实现 | ✅ 单一实现,多处调用 | ⭐⭐⭐⭐⭐ |
| 可维护性 | ❌ 修改一处要改多处 | ✅ 修改只在 client 层 | ⭐⭐⭐⭐⭐ |
| 可扩展性 | ❌ 新增协议要改多处 | ✅ 新增协议只在 client 层 | ⭐⭐⭐⭐⭐ |
⏳ 待完成工作
P1 - 近期完成
-
完善 turn_udp.go 实现
func (f *TURNFactory) Dial(ctx context.Context, config *DialConfig) (net.Conn, error) { // 1. 从 config.TURNServers 解析配置 servers := parseTURNServers(config.TURNServers) // 2. 调用 client/turn_client.go turn := client.NewTURNClient(servers, username, password, logger) // 3. 分配中继连接 relayConn := turn.Allocate() // 4. 包装成 net.Conn 返回 return NewTURNConn(relayConn), nil } -
补充缺失的传输层
direct_udp.go- 从stun.go拆分出 Direct-UDPturn_tcp.go- 从turn_udp.go拆分turn_tls.go- 从turn_udp.go拆分
-
更新文档
- README.md - 更新目录结构说明
- docs/core 分层架构与文件组织.md - 补充实际案例
🎉 重构原则总结
核心原则 ✅
- connect 层 - 负责建连决策,返回
net.Conn - client 层 - 负责协议细节,不返回连接
- transport 层 - 负责使用连接转发 WG 数据
命名规范 ✅
- ✅
{protocol}_client.go- 协议客户端(stun_client.go, turn_client.go) - ✅
{layer}.go- 建连工厂(turn_udp.go, ws.go, fake_tcp.go)
职责边界 ✅
- ✅ connect 调用 client 完成协议协商
- ✅ connect 包装 client 的返回值为
net.Conn - ✅ transport 使用
net.Conn转发数据
重构完成时间:2026-03-24 01:15
版本:v2.1.0
Phase 1: ✅ 完成 | Phase 2: ✅ 完成(turn_udp.go 待最后实现)