209 lines
6.3 KiB
Markdown
209 lines
6.3 KiB
Markdown
|
|
---
|
|||
|
|
name: cellbot-multibot-server
|
|||
|
|
overview: 基于Go语言的多机器人服务端,参考OneBot12协议设计通用框架,采用分层架构和依赖注入设计模式。
|
|||
|
|
todos:
|
|||
|
|
- id: setup-project
|
|||
|
|
content: 初始化Go模块项目结构,创建基础目录和go.mod
|
|||
|
|
status: completed
|
|||
|
|
- id: implement-config
|
|||
|
|
content: 实现配置模块,支持TOML解析和fsnotify热重载
|
|||
|
|
status: completed
|
|||
|
|
dependencies:
|
|||
|
|
- setup-project
|
|||
|
|
- id: define-protocol
|
|||
|
|
content: 定义通用协议接口,提取OneBot12核心设计理念
|
|||
|
|
status: completed
|
|||
|
|
dependencies:
|
|||
|
|
- setup-project
|
|||
|
|
- id: build-eventbus
|
|||
|
|
content: 实现基于channel的高性能事件总线
|
|||
|
|
status: completed
|
|||
|
|
dependencies:
|
|||
|
|
- define-protocol
|
|||
|
|
- id: create-di-container
|
|||
|
|
content: 集成Uber Fx依赖注入容器,管理应用生命周期
|
|||
|
|
status: completed
|
|||
|
|
dependencies:
|
|||
|
|
- implement-config
|
|||
|
|
- build-eventbus
|
|||
|
|
- id: implement-fasthttp
|
|||
|
|
content: 封装fasthttp网络层,处理连接和通信
|
|||
|
|
status: completed
|
|||
|
|
dependencies:
|
|||
|
|
- create-di-container
|
|||
|
|
- id: unit-tests
|
|||
|
|
content: 编写核心模块的单元测试和并发基准测试
|
|||
|
|
status: completed
|
|||
|
|
dependencies:
|
|||
|
|
- build-eventbus
|
|||
|
|
- implement-config
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Product Overview
|
|||
|
|
|
|||
|
|
基于Go语言构建的高性能、可扩展的多机器人服务端,参考OneBot12协议的设计理念,旨在提供统一的机器人管理与消息分发框架。
|
|||
|
|
|
|||
|
|
## Core Features
|
|||
|
|
|
|||
|
|
- **协议适配层**:提取OneBot12核心设计,支持通用接口定义与扩展
|
|||
|
|
- **多机器人管理**:支持同时连接和管理多个不同实现的机器人实例
|
|||
|
|
- **事件总线**:基于channel的高性能发布订阅机制,实现模块间解耦通信
|
|||
|
|
- **依赖注入容器**:管理组件生命周期,降低耦合度
|
|||
|
|
- **配置管理**:支持TOML格式配置,具备热重载能力
|
|||
|
|
- **反向WebSocket**:支持高性能反向WebSocket通信连接
|
|||
|
|
|
|||
|
|
## Tech Stack
|
|||
|
|
|
|||
|
|
- **语言**: Go 1.21+
|
|||
|
|
- **网络库**: fasthttp (valyala/fasthttp)
|
|||
|
|
- **配置**: BurntSushi/toml + fsnotify (热重载)
|
|||
|
|
- **依赖注入**: Uber-go/fx 或 uber-go/dig
|
|||
|
|
- **测试**: 标准库 testing + testify
|
|||
|
|
- **日志**: uber-go/zap
|
|||
|
|
|
|||
|
|
## Tech Architecture
|
|||
|
|
|
|||
|
|
### System Architecture
|
|||
|
|
|
|||
|
|
采用分层架构结合依赖注入模式。
|
|||
|
|
|
|||
|
|
- **协议层**: 定义OneBot12通用接口规范。
|
|||
|
|
- **适配层**: 实现不同平台的具体协议适配。
|
|||
|
|
- **核心层**: 事件总线、生命周期管理、依赖注入容器。
|
|||
|
|
- **网络层**: 基于fasthttp的高并发连接处理。
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
graph TD
|
|||
|
|
A[Client/Bot] -->|WebSocket/TCP| B[Network Layer: fasthttp]
|
|||
|
|
B --> C[Adapter Layer: Protocol Implementation]
|
|||
|
|
C -->|Event Message| D[Event Bus: Channel Pub/Sub]
|
|||
|
|
D --> E[Core Layer: Business Logic]
|
|||
|
|
F[Config Manager: TOML + Hot Reload] --> E
|
|||
|
|
G[DI Container: fx/dig] --> B
|
|||
|
|
G --> C
|
|||
|
|
G --> D
|
|||
|
|
G --> E
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Module Division
|
|||
|
|
|
|||
|
|
- **internal/protocol**: 定义OneBot12核心接口(Event, Action, API)。
|
|||
|
|
- **internal/adapter**: 协议适配器实现(如OneBot11适配器)。
|
|||
|
|
- **internal/engine**: 核心引擎,包含事件总线与Bot管理。
|
|||
|
|
- **internal/config**: 配置加载与热重载逻辑。
|
|||
|
|
- **internal/di**: 依赖注入容器封装。
|
|||
|
|
- **pkg/fasthttp**: fasthttp网络服务封装。
|
|||
|
|
|
|||
|
|
### Data Flow
|
|||
|
|
|
|||
|
|
外部连接 -> fasthttp处理 -> 协议适配器解析 -> 事件总线分发 -> 订阅者处理 -> 结果返回。
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
flowchart LR
|
|||
|
|
A[Incoming Message] --> B[fasthttp Handler]
|
|||
|
|
B --> C[Adapter Parse]
|
|||
|
|
C --> D{Event Bus Channel}
|
|||
|
|
D -->|Subscribe| E[Handler 1]
|
|||
|
|
D -->|Subscribe| F[Handler 2]
|
|||
|
|
E --> G[Response]
|
|||
|
|
F --> G
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Implementation Details
|
|||
|
|
|
|||
|
|
### Core Directory Structure
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
cellbot-multibot-server/
|
|||
|
|
├── cmd/
|
|||
|
|
│ └── server/
|
|||
|
|
│ └── main.go # 程序入口,注入fx应用
|
|||
|
|
├── internal/
|
|||
|
|
│ ├── config/ # 配置模块
|
|||
|
|
│ │ ├── config.go # 配置结构体定义
|
|||
|
|
│ │ └── loader.go # TOML加载与fsnotify热重载
|
|||
|
|
│ ├── protocol/ # 通用协议层
|
|||
|
|
│ │ └── onebot12.go # 核心接口定义
|
|||
|
|
│ ├── adapter/ # 适配器层
|
|||
|
|
│ │ ├── base.go # 适配器基类
|
|||
|
|
│ │ └── onebot11.go # OneBot11实现示例
|
|||
|
|
│ ├── engine/ # 核心引擎
|
|||
|
|
│ │ ├── eventbus.go # Channel发布订阅
|
|||
|
|
│ │ └── bot.go # 机器人实例管理
|
|||
|
|
│ └── di/ # 依赖注入
|
|||
|
|
│ └── wire.go # Provider定义
|
|||
|
|
├── pkg/
|
|||
|
|
│ └── net/ # 网络封装
|
|||
|
|
│ └── server.go # fasthttp服务器封装
|
|||
|
|
├── configs/
|
|||
|
|
│ └── config.toml # 默认配置文件
|
|||
|
|
└── go.mod
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Key Code Structures
|
|||
|
|
|
|||
|
|
**Event Bus (Channel-based)**: 使用类型安全的channel进行事件分发,支持并发订阅与取消订阅。
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
type EventBus struct {
|
|||
|
|
subscribers map[string][]chan Event
|
|||
|
|
mu sync.RWMutex
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func (eb *EventBus) Publish(eventType string, event Event) {
|
|||
|
|
// 发布逻辑
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func (eb *EventBus) Subscribe(eventType string) chan Event {
|
|||
|
|
// 订阅逻辑
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Dependency Injection (Fx)**: 使用Uber Fx管理应用生命周期,提供优雅的启动与关闭。
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
// 提供Config实例
|
|||
|
|
func ProvideConfig() *Config {
|
|||
|
|
return LoadConfig("config.toml")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 提供EventBus实例
|
|||
|
|
func ProvideEventBus() *EventBus {
|
|||
|
|
return NewEventBus()
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Technical Implementation Plan
|
|||
|
|
|
|||
|
|
1. **配置与热重载**
|
|||
|
|
|
|||
|
|
- 定义Config结构体,支持TOML映射。
|
|||
|
|
- 使用fsnotify监听文件变化,实现平滑热重载。
|
|||
|
|
|
|||
|
|
2. **通用协议框架**
|
|||
|
|
|
|||
|
|
- 抽象OneBot12核心概念:Action, Event, API。
|
|||
|
|
- 定义统一的接口契约。
|
|||
|
|
|
|||
|
|
3. **事件总线设计**
|
|||
|
|
|
|||
|
|
- 基于buffered channel实现高吞吐量。
|
|||
|
|
- 实现带类型检查的订阅机制。
|
|||
|
|
|
|||
|
|
4. **fasthttp集成**
|
|||
|
|
|
|||
|
|
- 封装fasthttp Server,处理WebSocket升级。
|
|||
|
|
- 实现连接池管理以优化性能。
|
|||
|
|
|
|||
|
|
5. **测试策略**
|
|||
|
|
|
|||
|
|
- 单元测试覆盖核心逻辑(EventBus, Config)。
|
|||
|
|
- 基准测试验证并发性能。
|
|||
|
|
|
|||
|
|
## Agent Extensions
|
|||
|
|
|
|||
|
|
### SubAgent
|
|||
|
|
|
|||
|
|
- **code-explorer**
|
|||
|
|
- Purpose: 搜索和分析现有项目结构,确保新代码与现有模式一致
|
|||
|
|
- Expected outcome: 确认当前目录结构和代码风格,生成符合规范的代码
|