|
|
# nnet 架构设计文档
|
|
|
|
|
|
## 一、整体架构
|
|
|
|
|
|
### 1.1 架构层次
|
|
|
|
|
|
```
|
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
|
│ 应用层 (Application) │
|
|
|
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
|
|
│ │ 路由 │ │ 中间件 │ │ 拦截器 │ │ 处理器 │ │
|
|
|
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
|
|
|
└─────────────────────────────────────────────────────────────┘
|
|
|
│
|
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
|
│ 核心层 (Core) │
|
|
|
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
|
|
│ │连接管理 │ │Session │ │Context │ │生命周期 │ │
|
|
|
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
|
|
|
└─────────────────────────────────────────────────────────────┘
|
|
|
│
|
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
|
│ 协议层 (Protocol) │
|
|
|
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
|
|
│ │协议管理 │ │版本管理 │ │编解码 │ │粘包拆包 │ │
|
|
|
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
|
|
|
└─────────────────────────────────────────────────────────────┘
|
|
|
│
|
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
|
│ 传输层 (Transport) │
|
|
|
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
|
|
│ │ TCP │ │ UDP │ │WebSocket │ │ Unix │ │
|
|
|
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
|
|
|
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
|
|
│ │ TLS │ │ 串口 │ │ 扩展 │ │
|
|
|
│ └──────────┘ └──────────┘ └──────────┘ │
|
|
|
└─────────────────────────────────────────────────────────────┘
|
|
|
│
|
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
|
│ 基础设施层 (Infrastructure) │
|
|
|
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
|
|
│ │ 配置 │ │ 日志 │ │ 监控 │ │ 插件 │ │
|
|
|
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
|
|
|
└─────────────────────────────────────────────────────────────┘
|
|
|
│
|
|
|
┌───────┐
|
|
|
│ gnet │
|
|
|
└───────┘
|
|
|
```
|
|
|
|
|
|
### 1.2 核心模块
|
|
|
|
|
|
#### 服务器核心(Server Core)
|
|
|
- 配置管理
|
|
|
- 协议管理器
|
|
|
- 连接管理器
|
|
|
- 路由管理器
|
|
|
- 中间件链
|
|
|
- 拦截器链
|
|
|
- Session管理器
|
|
|
- 生命周期管理器
|
|
|
- 插件管理器
|
|
|
- 日志系统
|
|
|
- Metrics监控
|
|
|
|
|
|
服务器通过可复用的 `MetricsHandler`、`HealthHandler` 和 `ExportMetrics` 接口向外暴露监控数据,使用者需要在自有的HTTP服务中挂载这些处理器。
|
|
|
|
|
|
#### 协议层(Protocol Layer)
|
|
|
- 协议注册和发现
|
|
|
- 协议版本管理
|
|
|
- 协议识别和选择
|
|
|
- 编解码器管理
|
|
|
- 粘包拆包处理
|
|
|
|
|
|
#### 路由系统(Router)
|
|
|
- 字符串匹配
|
|
|
- 帧头匹配
|
|
|
- 帧数据匹配
|
|
|
- 自定义匹配
|
|
|
- 路由分组
|
|
|
- 路由优先级
|
|
|
|
|
|
#### 连接管理(Connection)
|
|
|
- 连接生命周期管理
|
|
|
- 连接分组
|
|
|
- 分组广播
|
|
|
- 跨连接操作
|
|
|
|
|
|
#### Session管理(Session)
|
|
|
- 数据存储
|
|
|
- 存储策略(内存/文件/Redis)
|
|
|
- Session过期管理
|
|
|
|
|
|
#### Context系统(Context)
|
|
|
- 状态管理
|
|
|
- 请求/响应数据
|
|
|
- 连接信息
|
|
|
- 键值对存储
|
|
|
|
|
|
## 二、数据流程
|
|
|
|
|
|
### 2.1 请求处理流程
|
|
|
|
|
|
```
|
|
|
客户端数据
|
|
|
│
|
|
|
▼
|
|
|
[传输层接收] (gnet事件)
|
|
|
│
|
|
|
▼
|
|
|
[粘包拆包] (Unpacker) ──→ 处理半包/粘包,提取完整消息
|
|
|
│
|
|
|
▼
|
|
|
[协议头解析] (Protocol.Decode) ──→ 提取帧头和数据体
|
|
|
│
|
|
|
▼
|
|
|
[Codec选择] (CodecResolver) ──→ 优先级:版本 > 上下文/Session > Header > 原始探测 > 默认
|
|
|
│
|
|
|
▼
|
|
|
[应用层解码] (Codec.Decode) ──→ 将数据体解码为结构化对象(JSON/Msgpack等)或保持原始字节(binary/plain)
|
|
|
│
|
|
|
▼
|
|
|
[路由匹配] (Router) ──→ 基于完全解码的数据进行匹配(Raw/Header/Data)
|
|
|
│
|
|
|
▼
|
|
|
[强类型解码] (Codec.Decode) ──→ 如有需要,将数据解码到路由指定的强类型结构体
|
|
|
│
|
|
|
▼
|
|
|
[拦截器链] (InterceptorChain)
|
|
|
│
|
|
|
▼
|
|
|
[中间件链] (MiddlewareChain)
|
|
|
│
|
|
|
▼
|
|
|
[业务处理] (Handler) ──→ 直接同步执行,依赖Context超时控制
|
|
|
│
|
|
|
▼
|
|
|
[编码] (Encoder)
|
|
|
│
|
|
|
▼
|
|
|
[拦截器链] (InterceptorChain)
|
|
|
│
|
|
|
▼
|
|
|
[传输层发送] (gnet事件)
|
|
|
│
|
|
|
▼
|
|
|
客户端
|
|
|
```
|
|
|
|
|
|
### 2.2 自动解析流程
|
|
|
|
|
|
```
|
|
|
1. 数据到达 → Connection.Read()
|
|
|
↓
|
|
|
2. 粘包拆包 → Unpacker.Unpack() → 完整消息列表
|
|
|
↓
|
|
|
3. 协议头解析 → Protocol.Decode() → Header + DataBytes
|
|
|
↓
|
|
|
4. Codec选择 → CodecResolver.resolveCodecGeneric()
|
|
|
- 优先级:协议版本 > 上下文/Session > Header.codec > 原始数据探测 > 默认(binary)
|
|
|
↓
|
|
|
5. 应用层预解码 → Codec.Decode() → 通用对象(map/interface{})或原始字节
|
|
|
↓
|
|
|
6. 路由匹配 → Router.Match() → 基于完全解码的数据(Raw/Header/Data)
|
|
|
↓
|
|
|
7. 强类型解码(可选)→ Codec.Decode() → 路由指定的结构体类型
|
|
|
↓
|
|
|
8. Handler执行 → req.Data().(*MyStruct) (直接使用)
|
|
|
```
|
|
|
|
|
|
### 2.3 自动编码流程
|
|
|
|
|
|
```
|
|
|
1. Handler调用 → resp.Write(struct)
|
|
|
↓
|
|
|
2. 编解码器编码 → Codec.Encode() → []byte
|
|
|
↓
|
|
|
3. 协议编码 → Protocol.Encode() → Header + Data
|
|
|
↓
|
|
|
4. 写入连接 → Connection.Write()
|
|
|
```
|
|
|
|
|
|
## 三、关键设计原则
|
|
|
|
|
|
### 3.1 接口驱动设计
|
|
|
- 核心功能通过接口定义,便于扩展和测试
|
|
|
- 依赖倒置:高层模块不依赖低层模块,都依赖抽象
|
|
|
|
|
|
### 3.2 单一职责
|
|
|
- 每个模块只负责一个功能
|
|
|
- Context只负责状态管理
|
|
|
- Request负责数据读取
|
|
|
- Response负责数据写入
|
|
|
|
|
|
### 3.3 开闭原则
|
|
|
- 对扩展开放,对修改关闭
|
|
|
- 通过接口和插件系统扩展功能
|
|
|
|
|
|
### 3.4 最小依赖
|
|
|
- 核心功能不依赖第三方库
|
|
|
- 可选功能通过接口隔离
|
|
|
|
|
|
### 3.5 高性能优先
|
|
|
- 充分利用gnet的事件驱动模型
|
|
|
- 减少内存分配和GC压力
|
|
|
- 支持连接池和对象池
|
|
|
|
|
|
## 四、目录结构
|
|
|
|
|
|
```
|
|
|
nnet/
|
|
|
├── cmd/ # 命令行工具和示例
|
|
|
├── internal/ # 内部实现(不对外暴露)
|
|
|
│ ├── server/ # 服务器核心
|
|
|
│ ├── protocol/ # 协议实现
|
|
|
│ ├── router/ # 路由实现
|
|
|
│ ├── middleware/ # 中间件实现
|
|
|
│ ├── interceptor/ # 拦截器实现
|
|
|
│ ├── connection/ # 连接管理
|
|
|
│ ├── session/ # Session管理
|
|
|
│ ├── codec/ # 编解码器
|
|
|
│ ├── unpacker/ # 粘包拆包
|
|
|
│ ├── client/ # 客户端实现
|
|
|
│ └── ...
|
|
|
├── pkg/ # 对外暴露的包
|
|
|
│ ├── nnet/ # 主包(入口)
|
|
|
│ ├── protocol/ # 协议接口
|
|
|
│ ├── router/ # 路由接口
|
|
|
│ ├── middleware/ # 中间件接口
|
|
|
│ ├── interceptor/ # 拦截器接口
|
|
|
│ ├── connection/ # 连接接口
|
|
|
│ ├── session/ # Session接口
|
|
|
│ ├── codec/ # 编解码接口
|
|
|
│ └── ...
|
|
|
├── examples/ # 示例代码
|
|
|
├── test/ # 测试代码
|
|
|
└── docs/ # 文档
|
|
|
```
|
|
|
|
|
|
## 五、扩展点
|
|
|
|
|
|
### 5.1 协议扩展
|
|
|
- 实现`pkg/protocol/Protocol`接口
|
|
|
- 在`internal/protocol/`下创建新协议目录
|
|
|
- 注册到协议管理器
|
|
|
|
|
|
### 5.2 匹配器扩展
|
|
|
- 实现`pkg/router/Matcher`接口
|
|
|
- 在`internal/router/matcher/`下创建新匹配器
|
|
|
- 注册到路由器
|
|
|
|
|
|
### 5.3 存储扩展
|
|
|
- 实现`pkg/session/Storage`接口
|
|
|
- 在`internal/session/storage/`下创建新存储
|
|
|
- 注册到Session管理器
|
|
|
|
|
|
### 5.4 插件扩展
|
|
|
- 实现`pkg/plugin/Plugin`接口
|
|
|
- 注册到插件管理器
|
|
|
|
|
|
## 六、参考文档
|
|
|
|
|
|
- [需求文档](../requirements/REQUIREMENTS.md)
|
|
|
- [代码结构](../development/CODE_STRUCTURE.md)
|
|
|
- [协议设计](../implementation-details/PROTOCOL_DESIGN.md)
|
|
|
- [路由系统](../user-guide/ROUTER_EXAMPLES.md)
|
|
|
|
|
|
---
|
|
|
|
|
|
**文档版本**: v1.0
|
|
|
**最后更新**: 2024
|
|
|
|