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.

16 KiB

nnet 网络库 - 需求提炼文档

一、需求分类与提炼

1. 协议支持需求

1.1 基础协议

  • TCP协议支持
  • UDP协议支持
  • WebSocket协议支持
  • Unix Domain Socket支持

1.2 安全协议

  • TLS/SSL支持支持TLS 1.2、1.3等版本)
  • 证书管理(支持证书加载、验证)

1.3 扩展协议

  • 串口通信支持Serial Port
  • 命名管道支持Named Pipe可选
  • 其他gnet不支持的协议扩展机制

1.4 协议抽象

  • 统一的协议接口
  • 协议注册机制
  • 协议自动识别

2. 协议版本管理需求

2.1 多版本支持

  • 单协议多版本支持
  • 版本自动识别
  • 版本手动指定
  • 版本协商机制

2.2 版本识别方式

  • 协议头识别:通过固定位置的版本字段识别
  • 消息头识别:通过消息头中的版本信息识别
  • 消息体识别:通过特定消息(如设备注册消息)中的软件版本号、硬件版本号等字段识别
  • 用户自定义识别:支持用户自定义版本识别逻辑

2.3 版本持久化

  • 版本信息与连接绑定
  • 重连后版本信息保持通过连接标识或Session
  • 版本信息查询

2.4 版本选择策略

  • 自动识别优先
  • 手动指定覆盖
  • 版本不匹配处理

3. 路由系统需求(重新设计)

3.1 路由匹配策略(高度可扩展)

  • 基于URL/String匹配:传统的字符串路由匹配(如:"/user/login"
  • 基于协议帧头匹配:通过协议帧头的特定字段进行路由匹配(如:消息类型、命令码等)
  • 基于协议帧数据匹配:通过协议帧数据内容的某部分进行路由匹配(如:消息体中的字段值)
  • 组合匹配:支持多种匹配策略组合使用
  • 自定义匹配器:支持用户自定义匹配逻辑

3.2 路由分组

  • 功能模块分组
  • 权限分组
  • 嵌套分组
  • 分组级别的中间件绑定
  • 分组可绑定匹配策略

3.3 函数集式路由

  • 多个处理函数组合
  • 路由级别的中间件
  • 路由级别的协议版本限制

3.4 路由优先级

  • 路由优先级设置
  • 精确匹配优先于通配符
  • 帧头匹配优先于帧数据匹配

4. 中间件系统需求

4.1 中间件类型

  • 全局中间件:所有请求执行
  • 路由级中间件:特定路由执行
  • 分组级中间件:路由组执行

4.2 中间件功能

  • 前置中间件Before
  • 后置中间件After
  • 错误处理中间件Error
  • 认证中间件Auth
  • 限流中间件RateLimit
  • 日志中间件Logging

4.3 中间件链

  • 中间件执行顺序控制
  • 中间件中断机制
  • 中间件参数传递

5. 数据拦截器需求

5.1 拦截器链(责任链模式)

  • 多个拦截器顺序执行
  • 拦截器中断机制
  • 拦截器条件执行

5.2 拦截点

  • 接收拦截:数据接收后、解析前
  • 解析拦截:数据解析后、路由前
  • 路由拦截:路由匹配后、处理前
  • 处理拦截:业务处理中
  • 响应拦截:响应生成后、发送前

5.3 拦截器功能

  • 数据验证
  • 数据转换
  • 数据加密/解密
  • 数据压缩/解压
  • 数据统计

6. 编解码与序列化需求

6.1 编解码器

  • 编码器接口Encoder
  • 解码器接口Decoder
  • 协议级别编解码器
  • 消息级别编解码器

6.2 序列化格式

  • JSON序列化
  • Protobuf序列化可选
  • MessagePack序列化可选
  • Binary序列化
  • 自定义序列化器

6.3 序列化功能

  • 结构体到字节流
  • 字节流到结构体
  • 序列化器注册
  • 序列化器选择

7. 粘包拆包处理需求

7.1 内置协议支持

  • 固定长度协议:固定长度的消息
  • 长度字段协议消息前N字节表示长度支持大端/小端)
  • 分隔符协议:通过分隔符区分消息
  • 自定义帧头协议:通过帧头识别消息边界

7.2 自定义处理

  • 用户自定义粘包拆包逻辑
  • 多协议混合使用(通过协议识别器区分)
  • 协议级别的Unpacker配置

8. 内置nnet协议需求

8.1 协议特点

  • 简单高效(最小化协议开销)
  • 功能强大(满足游戏服务器、物联网等场景)
  • 可扩展(支持协议版本升级)

8.2 协议功能

  • 消息类型区分(请求/响应/推送)
  • 消息ID支持请求-响应匹配)
  • 压缩支持(可选)
  • 加密支持(可选)
  • 校验和(可选)

9. 连接管理需求

9.1 连接生命周期

  • 连接建立
  • 连接保持
  • 连接关闭
  • 连接超时检测

9.2 连接操作

  • 读取连接数据
  • 写入连接数据
  • 关闭连接
  • 获取连接信息IP、端口、协议版本等
  • 跨连接操作在A连接的处理中操作B连接

9.3 连接分组

  • 服务端控制分组:服务端主动将连接加入/移出分组
  • 消息控制分组通过消息内容如用户ID、设备类型自动分组
  • 分组内广播消息
  • 分组查询(查询分组内的连接列表)

9.4 连接标识

  • 连接ID唯一标识
  • 连接标签(支持给连接打标签,便于查询和分组)

10. Session管理需求

10.1 Session职责重要

  • 仅作为数据存储Session只负责存储键值对数据
  • 不负责广播:广播功能由连接管理器实现
  • 职责分离Session与连接管理解耦

10.2 Session存储策略

  • 内存存储Memory:默认实现,高性能(默认使用)
  • 文件存储File:持久化到本地文件
  • Redis存储分布式Session支持
  • 自定义存储:用户可实现自定义存储策略

10.3 Session操作

  • 创建Session
  • 获取Session
  • 更新Session
  • 删除Session
  • Session过期管理

10.4 Session与连接关联

  • 连接可获取关联的Session
  • Session可获取关联的连接通过连接管理器
  • 支持一个Session关联多个连接如多设备登录

11. Context系统需求

11.1 Context类型

  • 请求上下文(包含请求相关信息)
  • 连接上下文(包含连接相关信息)
  • 用户上下文(包含用户相关信息)
  • 协议上下文(包含协议版本、编解码器等信息)

11.2 Context功能

  • Context值设置和获取
  • Context在中间件、拦截器、处理器之间传递
  • Context超时和取消
  • 用户自定义Context字段

12. 配置管理需求

12.1 配置来源

  • 配置文件JSON、YAML、TOML等格式
  • 环境变量
  • 代码配置
  • 配置优先级:代码配置 > 环境变量 > 配置文件 > 默认值

12.2 配置项

  • 服务器配置(监听地址、端口、协议类型等)
  • 性能配置(连接数限制、缓冲区大小、超时时间等)
  • 协议配置(协议版本、编解码器选择等)
  • 中间件配置(中间件的启用/禁用、参数配置)
  • Session配置存储策略、过期时间等
  • 日志配置(日志级别、输出格式等)
  • Metrics配置监控指标配置

13. 日志系统需求

13.1 日志接口(日志门面)

  • 统一的日志接口
  • 日志级别Debug、Info、Warn、Error、Fatal
  • 结构化日志
  • 日志字段Fields

13.2 默认实现

  • 使用Go标准库log实现
  • 日志输出到控制台、文件

13.3 第三方集成

  • logrus集成
  • zap集成
  • zerolog集成
  • 用户自定义日志实现

13.4 日志配置

  • 日志级别控制
  • 日志格式配置
  • 日志轮转配置

14. 指标监控需求

14.1 监控协议

  • Prometheus格式仅支持Prometheus格式业内最流行

14.2 监控指标

  • 连接数(当前连接数、总连接数、连接建立速率)
  • 请求数(请求总数、请求速率、请求耗时分布)
  • 错误数(错误总数、错误率、错误类型分布)
  • 流量(接收字节数、发送字节数、流量速率)
  • 协议统计(各协议版本的请求数、错误数)

14.3 指标导出

  • HTTP端点导出/metrics
  • 推送到监控系统(可选)
  • 自定义指标

15. 插件系统需求

15.1 插件接口

  • 标准的插件接口
  • 插件生命周期(初始化、启动、停止、销毁)

15.2 插件类型

  • 协议插件:扩展新的协议支持
  • 中间件插件:提供可复用的中间件
  • 编解码插件:提供新的编解码器
  • 存储插件提供新的Session存储实现
  • 监控插件:扩展监控功能
  • 工具插件:提供开发工具和辅助功能

15.3 插件管理

  • 插件注册
  • 插件加载(支持动态加载)
  • 插件卸载
  • 插件依赖管理

15.4 插件应用场景示例

  • 协议转换插件将HTTP协议转换为内部协议
  • 数据统计插件:统计特定业务数据
  • 消息队列插件:将消息推送到消息队列
  • 缓存插件:提供缓存功能
  • 限流插件:提供限流功能

16. 生命周期管理需求

16.1 Server生命周期阶段

  • 初始化Init:配置加载、组件初始化
  • 启动前BeforeStart:启动前的准备工作
  • 启动Start:服务启动,开始监听
  • 运行中Running:服务正常运行
  • 停止前BeforeStop:停止前的清理工作
  • 停止Stop:服务停止,停止监听
  • 销毁Destroy:资源释放

16.2 Connection生命周期阶段

  • 连接建立OnOpen:连接建立时触发
  • 数据接收OnTraffic:数据到达时触发
  • 连接关闭OnClose:连接关闭时触发
  • 连接错误OnError:连接错误时触发

16.3 生命周期钩子

  • 在每个阶段注册钩子函数
  • 钩子函数的执行顺序控制
  • 钩子函数的错误处理

16.4 优雅关闭

  • 优雅关闭Graceful Shutdown
  • 等待正在处理的请求完成
  • 关闭空闲连接
  • 资源清理

17. 客户端支持需求

17.1 内置nnet客户端

  • 支持TCP、UDP、WebSocket等协议连接
  • 支持TLS连接
  • 支持协议版本协商
  • 支持自动重连
  • 支持连接池

17.2 客户端功能

  • 请求-响应模式(同步/异步)
  • 异步消息推送
  • 连接状态管理
  • 超时控制
  • 错误处理

18. 健康检查需求

18.1 健康检查接口

  • 提供简单的HTTP健康检查接口/health
  • 返回服务状态(健康/不健康)
  • 可扩展健康检查逻辑

18.2 健康检查内容

  • 服务运行状态
  • 连接数统计
  • 资源使用情况(可选)

19. Shell连接支持需求低优先级

19.1 Shell连接功能

  • 支持Shell连接建立
  • 支持Shell命令执行
  • 支持子进程管理
  • 支持数据传输
  • 支持连接控制

19.2 应用场景

  • 远程命令执行
  • 系统管理
  • 调试工具

20. 测试需求

20.1 测试类型

  • 单元测试(各模块的单元测试)
  • 集成测试(模块间的集成测试)
  • 性能测试(压力测试、性能基准测试)

20.2 测试工具

  • 测试辅助工具
  • Mock对象
  • 测试覆盖率统计

20.3 测试覆盖率

  • 测试覆盖率目标80%+

21. 代码质量需求

21.1 性能要求

  • 充分利用gnet的事件驱动模型
  • 减少内存分配和GC压力
  • 支持连接池和对象池
  • 高性能的序列化/反序列化

21.2 可扩展性

  • 模块化设计,低耦合高内聚
  • 接口驱动,便于扩展
  • 插件化架构,支持功能扩展

21.3 可维护性

  • 代码简洁清晰
  • 充分的注释和文档
  • 遵循Go代码规范

21.4 依赖管理

  • 最小化外部依赖
  • 核心功能不依赖第三方库
  • 可选功能通过接口隔离,支持可选依赖

21.5 新特性使用

  • 充分利用Golang 1.25.4新特性
  • 充分利用gnet 2.9.5新特性

二、需求优先级

P0 - 核心功能(必须实现)

  1. TCP协议支持
  2. 基础路由系统(支持字符串匹配)
  3. 基础中间件系统
  4. 连接管理(基础功能)
  5. 基础配置管理
  6. 基础日志系统
  7. 协议版本管理(核心需求,包括无帧头协议支持)
  8. 编解码系统
  9. 粘包拆包处理
  10. 健康检查接口

P1 - 重要功能(应该实现)

  1. Session管理默认内存存储
  2. 拦截器系统
  3. 连接分组
  4. UDP、WebSocket协议支持
  5. 内置nnet协议
  6. Context系统
  7. TLS支持
  8. 路由系统扩展(帧头匹配、帧数据匹配)
  9. 内置nnet客户端
  10. 生命周期管理Server + Connection

P2 - 扩展功能(建议实现)

  1. 插件系统
  2. Metrics监控Prometheus格式
  3. Unix Domain Socket支持
  4. 高级配置功能
  5. 序列化格式扩展
  6. 测试完善覆盖率80%+

P3 - 可选功能(按需实现)

  1. 串口等扩展协议
  2. 性能优化工具
  3. 开发工具插件
  4. Shell连接支持低优先级

三、特殊需求说明

3.1 单协议多版本识别

  • 需求背景:在实际开发中,某些协议由于历史原因,未在协议头设计版本字段,但可能在特定消息体(如设备注册消息)中包含软件版本号、硬件版本号等信息
  • 特殊场景:有些自定义协议没有帧头、帧内容区分,版本识别策略需要考虑这种场景
  • 解决方案
    1. 支持通过协议头、消息头识别版本(适用于有帧头的协议)
    2. 支持通过特定消息的消息体内容识别版本
    3. 支持通过消息内容特征识别版本(适用于无帧头/帧内容区分的协议):
      • 通过消息内容的特征识别(如:特定字段的位置、值)
      • 通过消息长度识别
      • 通过消息格式识别JSON结构、字段名等
      • 通过用户自定义的识别逻辑
    4. 版本识别后与连接绑定重连后无需重新识别通过连接标识或Session

3.2 Session职责分离

  • 需求背景Session应该只作为数据存储功能存在广播功能应该在连接管理器中实现
  • 解决方案
    1. Session接口只提供数据存储功能Get/Set/Delete
    2. 广播功能在ConnectionManager中实现
    3. 连接可以通过ConnectionManager获取其他连接进而获取其他连接的Session

3.3 插件系统作用

  • 应用场景
    1. 协议转换如HTTP转内部协议
    2. 数据统计和监控
    3. 消息队列集成
    4. 缓存功能扩展
    5. 限流功能扩展
    6. 数据同步功能

3.4 生命周期管理

  • 目的:确保系统资源的正确初始化和释放
  • 应用场景
    1. 数据库连接初始化
    2. 缓存连接初始化
    3. 定时任务启动
    4. 优雅关闭处理

四、参考项目

建议参考以下优秀开源项目的设计:

  1. Gin:路由设计、中间件系统
  2. EchoContext设计、中间件链
  3. Fiber性能优化、API设计
  4. gnet:事件驱动模型、高性能实现
  5. gRPC:协议设计、编解码
  6. Kratos:架构设计、插件系统
  7. Go-zero:配置管理、中间件设计

文档版本: v1.0
创建日期: 2024
待审核: 待用户确认