Files
Meshray-Manager/docs/core 分层架构与文件组织.md
2026-06-30 15:14:37 +08:00

183 lines
6.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Core 模块分层架构与文件组织规范
## 🎯 职责分工
### `connect/` - 连接工厂层(对外建立连接)
**职责**:**对外**与 Peer 建立各种类型的网络连接,返回标准的 `net.Conn` 接口。
**关键特性**
- 实现 **9 层降级传输策略**
- 每层独立的连接工厂(Factory)
- 所有工厂实现统一的 `TransportFactory` 接口
- 通过 `StrategyScheduler` 管理优先级和自动降级
**文件组织**9 个独立工厂):
```
connect/
├── strategy.go # 策略调度器(核心)
│ ├── StrategyScheduler # 管理 9 层工厂的优先级
│ ├── TransportFactory # 统一接口:Dial() net.Conn
│ └── Layer # 9 层枚举
├── ice.go # ICE 协商(辅助功能)
├── direct_udp.go # Direct-UDP 工厂 ⏳ 待从 fake_tcp.go 拆分
├── fake_tcp.go # Direct-FakeTCP 工厂 ✅
├── real_tcp.go # Direct-RealTCP 工厂 ✅
├── turn_udp.go # TURN-UDP 工厂 ✅ (已重命名)
├── turn_tcp.go # TURN-TCP 工厂 ⏳ 待从 turn_udp.go 拆分
├── turn_tls.go # TURN-TLS 工厂 ⏳ 待从 turn_udp.go 拆分
├── turn_quic.go # TURN-QUIC 工厂 ✅
├── webrtc.go # WebRTC 工厂 ⏳ 待创建
└── ws.go # WS/WSS 工厂 ✅ (已重命名)
```
**为什么叫 `connect`**
- 词源:**Connect to peer**(连接到对端)
- 职责:**建立**网络连接
- 抽象层次:网络层(Network Layer+ 传输层(Transport Layer
---
### `transport/` - 传输绑定层(对内对接 WireGuard)
**职责**:**对内**将建立的连接暴露给 WireGuard 使用,实现 `conn.Bind` 接口。
**关键特性**
- 不关心具体的建连方式(UDP/TCP/TURN
- 只使用 `net.Conn` 接口
- 负责 WireGuard 数据包的 Read/Write
- 管理 Peer 连接的生命周期
**文件组织**2 个核心组件):
```
transport/
├── core_bind.go # WireGuard Bind 实现
│ └── CoreBind # 实现 conn.Bind 接口
│ ├── Write(buffers) # 写入 WireGuard 数据包
│ ├── Read(buffer) # 读取 WireGuard 数据包
│ └── Dial(peerID) # 使用 connect.Scheduler 建连
└── relay.go # 数据中继器
└── Relay # 基于 net.Conn 的透明转发
├── RegisterFactory() # 注册传输工厂
├── GetConnection() # 获取已建立的连接
└── Forward() # 透明读写转发
```
**为什么叫 `transport`**
- 词源:**Transport WireGuard packets**(传输 WireGuard 数据包)
- 职责:**传输**应用层数据(WireGuard 密文)
- 抽象层次:绑定层(Bind Layer- WireGuard 专有概念
---
## 📊 完整数据流
```
[WireGuard 内核态]
↓ Write(buffers, size, offset)
↓ "发送加密数据包"
[transport/CoreBind]
↓ 检查是否有 Peer 的连接
↓ 如果没有 → 调用 Scheduler.Dial()
↓ 如果有 → 直接使用现有 net.Conn
↓ conn.Write(packet)
[connect/StrategyScheduler]
↓ 按优先级尝试 9 层工厂
↓ Layer1: Direct-UDP.Dial()
↓ 失败 → Layer2: FakeTCP.Dial()
↓ 失败 → Layer3: RealTCP.Dial()
↓ ...
↓ 成功 → 返回 net.Conn
[底层网络 Socket]
↓ UDP Socket.Send()
↓ TCP Socket.Connect() + Send()
↓ TURN Server.Allocate() + Send()
```
---
## 🔧 当前状态 vs 目标状态
### Connect 目录(连接工厂层)
| 当前文件 | 目标文件名 | 状态 | 说明 |
|---------|-----------|------|------|
| `strategy.go` | `strategy.go` | ✅ | 策略调度器 |
| `ice.go` | `ice.go` | ✅ | ICE 协商 |
| `fake_tcp.go` | `direct_udp.go` | 🔄 | 需要拆分出 Direct-UDP |
| `fake_tcp_factory.go` | 合并到 `fake_tcp.go` | 🔄 | 空文件,可删除 |
| `real_tcp.go` | `real_tcp.go` | ✅ | RealTCP |
| `real_tcp_factory.go` | 合并到 `real_tcp.go` | 🔄 | 空文件,可删除 |
| `turn_udp.go` | `turn_udp.go` | ✅ | 已重命名 |
| `turn_tcp.go` | `turn_tcp.go` | ⏳ | 待从 turn_udp.go 拆分 |
| `turn_tls.go` | `turn_tls.go` | ⏳ | 待从 turn_udp.go 拆分 |
| `turn_quic.go` | `turn_quic.go` | ✅ | QUIC 扩展 |
| `webrtc.go` | `webrtc.go` | ⏳ | 待创建 |
| `ws.go` | `ws.go` | ✅ | 已重命名 |
| `stun.go` | `stun.go` | ✅ | STUN 探测(辅助) |
### Transport 目录(传输绑定层)
| 当前文件 | 目标文件名 | 状态 | 说明 |
|---------|-----------|------|------|
| `core_bind.go` | `core_bind.go` | ✅ | WireGuard Bind |
| `relay.go` | `relay.go` | ✅ | 数据中继 |
| ~~`intercept.go`~~ | ❌ 已删除 | ✅ | 废弃(被 CoreBind 替代) |
---
## ✅ 重构原则
### 1. 保持 9 层独立性
- ❌ **不要合并**不同层的工厂(如 P2P 工厂)
-**每层对应一个文件**(如 `turn_udp.go`, `turn_tcp.go`
-**每层实现统一的接口**`TransportFactory`
### 2. 文件名语义化
-`{layer}.go` - 直接体现传输层类型
-`{layer}_factory.go` - 强调工厂模式(可选)
- ❌ 避免模糊的名称(如 `p2p_factory.go` 包含 3 层)
### 3. 职责分离
-`connect/` 负责**建立**连接(Dial
-`transport/` 负责**使用**连接(Read/Write
- ❌ 不要混淆两者的边界
---
## 📝 下一步行动
### Phase 1: 清理空文件
```bash
rm core/connect/fake_tcp_factory.go
rm core/connect/real_tcp_factory.go
```
### Phase 2: 拆分 TURN 工厂
-`turn_udp.go` 中拆分出:
- `turn_tcp.go` - TURN-TCP 工厂
- `turn_tls.go` - TURN-TLS 工厂
### Phase 3: 补充缺失的层
- 创建 `direct_udp.go` - Direct-UDP 工厂
- 创建 `webrtc.go` - WebRTC 工厂
### Phase 4: 验证编译
```bash
go build ./cmd/meshray
```
---
*创建时间:2026-03-20*
*版本:v2.1.0*
*架构原则:connect 管建连,transport 管传输*