You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

273 lines
11 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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