feat: 实现分层架构,包含 domain、service、repository 和 pkg 层
- 新增 domain 层:model、provider、route、stats 实体 - 新增 service 层:models、providers、routing、stats 业务逻辑 - 新增 repository 层:models、providers、stats 数据访问 - 新增 pkg 工具包:errors、logger、validator - 新增中间件:CORS、logging、recovery、request ID - 新增数据库迁移:初始 schema 和索引 - 新增单元测试和集成测试 - 新增规范文档:config-management、database-migration、error-handling、layered-architecture、middleware-system、request-validation、structured-logging、test-coverage - 移除 config 子包和 model_router(已迁移至分层架构)
This commit is contained in:
@@ -10,13 +10,21 @@ AI 网关后端服务,提供统一的大模型 API 代理接口。
|
||||
- 支持 Function Calling / Tools
|
||||
- 多供应商配置和路由
|
||||
- 用量统计
|
||||
- 结构化日志(zap + lumberjack)
|
||||
- YAML 配置管理
|
||||
- 请求验证
|
||||
- 中间件支持(请求 ID、日志、恢复、CORS)
|
||||
|
||||
## 技术栈
|
||||
|
||||
- **语言**: Go
|
||||
- **语言**: Go 1.26+
|
||||
- **HTTP 框架**: Gin
|
||||
- **ORM**: GORM
|
||||
- **数据库**: SQLite
|
||||
- **日志**: zap + lumberjack
|
||||
- **配置**: gopkg.in/yaml.v3
|
||||
- **验证**: go-playground/validator/v10
|
||||
- **迁移**: goose
|
||||
|
||||
## 项目结构
|
||||
|
||||
@@ -24,37 +32,86 @@ AI 网关后端服务,提供统一的大模型 API 代理接口。
|
||||
backend/
|
||||
├── cmd/
|
||||
│ └── server/
|
||||
│ └── main.go # 主程序入口
|
||||
│ └── main.go # 主程序入口(依赖注入)
|
||||
├── internal/
|
||||
│ ├── config/ # 配置和数据库
|
||||
│ │ ├── config.go # 配置目录管理
|
||||
│ │ ├── database.go # 数据库连接
|
||||
│ │ ├── models.go # 数据模型
|
||||
│ │ ├── provider.go # 供应商 CRUD
|
||||
│ │ ├── model.go # 模型 CRUD
|
||||
│ │ └── stats.go # 统计记录
|
||||
│ ├── handler/ # HTTP 处理器
|
||||
│ ├── config/ # 配置管理
|
||||
│ │ ├── config.go # 配置加载/保存/验证
|
||||
│ │ └── models.go # GORM 数据模型
|
||||
│ ├── domain/ # 领域模型
|
||||
│ │ ├── provider.go
|
||||
│ │ ├── model.go
|
||||
│ │ ├── stats.go
|
||||
│ │ └── route.go
|
||||
│ ├── handler/ # HTTP 处理器
|
||||
│ │ ├── middleware/ # 中间件
|
||||
│ │ │ ├── request_id.go
|
||||
│ │ │ ├── logging.go
|
||||
│ │ │ ├── recovery.go
|
||||
│ │ │ └── cors.go
|
||||
│ │ ├── openai_handler.go
|
||||
│ │ ├── anthropic_handler.go
|
||||
│ │ ├── provider_handler.go
|
||||
│ │ ├── model_handler.go
|
||||
│ │ └── stats_handler.go
|
||||
│ ├── protocol/ # 协议适配器
|
||||
│ ├── protocol/ # 协议适配器
|
||||
│ │ ├── openai/
|
||||
│ │ │ ├── types.go
|
||||
│ │ │ └── adapter.go
|
||||
│ │ │ ├── types.go # 请求/响应类型 + 验证
|
||||
│ │ │ └── adapter.go # OpenAI 协议适配
|
||||
│ │ └── anthropic/
|
||||
│ │ ├── types.go
|
||||
│ │ ├── converter.go
|
||||
│ │ └── stream_converter.go
|
||||
│ ├── provider/ # 供应商客户端
|
||||
│ │ ├── types.go # 请求/响应类型 + 验证
|
||||
│ │ ├── converter.go # 协议转换
|
||||
│ │ └── stream_converter.go # 流式转换
|
||||
│ ├── provider/ # 供应商客户端
|
||||
│ │ └── client.go
|
||||
│ └── router/ # 模型路由
|
||||
│ └── model_router.go
|
||||
│ ├── repository/ # 数据访问层
|
||||
│ │ ├── provider_repo.go # 接口定义
|
||||
│ │ ├── provider_repo_impl.go
|
||||
│ │ ├── model_repo.go
|
||||
│ │ ├── model_repo_impl.go
|
||||
│ │ ├── stats_repo.go
|
||||
│ │ └── stats_repo_impl.go
|
||||
│ └── service/ # 业务逻辑层
|
||||
│ ├── provider_service.go # 接口定义
|
||||
│ ├── provider_service_impl.go
|
||||
│ ├── model_service.go
|
||||
│ ├── model_service_impl.go
|
||||
│ ├── routing_service.go
|
||||
│ ├── routing_service_impl.go
|
||||
│ ├── stats_service.go
|
||||
│ └── stats_service_impl.go
|
||||
├── pkg/ # 公共包
|
||||
│ ├── errors/ # 结构化错误
|
||||
│ │ ├── errors.go
|
||||
│ │ └── wrap.go
|
||||
│ ├── logger/ # 日志系统
|
||||
│ │ ├── logger.go
|
||||
│ │ ├── rotate.go
|
||||
│ │ └── context.go
|
||||
│ └── validator/ # 验证器
|
||||
│ └── validator.go
|
||||
├── migrations/ # 数据库迁移
|
||||
│ ├── 001_initial_schema.sql
|
||||
│ └── 002_add_indexes.sql
|
||||
├── tests/ # 测试
|
||||
│ ├── helpers.go
|
||||
│ ├── integration/
|
||||
│ ├── unit/
|
||||
│ └── testdata/
|
||||
├── Makefile
|
||||
├── go.mod
|
||||
└── README.md
|
||||
```
|
||||
|
||||
## 架构
|
||||
|
||||
采用三层架构(handler → service → repository),通过依赖注入连接:
|
||||
|
||||
```
|
||||
handler(HTTP 请求处理)
|
||||
→ service(业务逻辑)
|
||||
→ repository(数据访问)
|
||||
```
|
||||
|
||||
## 运行方式
|
||||
|
||||
### 安装依赖
|
||||
@@ -69,7 +126,59 @@ go mod download
|
||||
go run cmd/server/main.go
|
||||
```
|
||||
|
||||
服务将在端口 9826 启动。
|
||||
服务将在端口 9826 启动。首次启动会自动创建配置文件和运行数据库迁移。
|
||||
|
||||
## 配置
|
||||
|
||||
配置文件位于 `~/.nex/config.yaml`,首次启动自动生成。
|
||||
|
||||
```yaml
|
||||
server:
|
||||
port: 9826
|
||||
read_timeout: 30s
|
||||
write_timeout: 30s
|
||||
|
||||
database:
|
||||
path: ~/.nex/config.db
|
||||
max_idle_conns: 10
|
||||
max_open_conns: 100
|
||||
conn_max_lifetime: 1h
|
||||
|
||||
log:
|
||||
level: info
|
||||
path: ~/.nex/log
|
||||
max_size: 100 # MB
|
||||
max_backups: 10
|
||||
max_age: 30 # 天
|
||||
compress: true
|
||||
```
|
||||
|
||||
数据文件:
|
||||
- `~/.nex/config.yaml` - 配置文件
|
||||
- `~/.nex/config.db` - SQLite 数据库
|
||||
- `~/.nex/log/` - 日志目录
|
||||
|
||||
## 测试
|
||||
|
||||
```bash
|
||||
# 运行所有测试
|
||||
make test
|
||||
|
||||
# 生成覆盖率报告
|
||||
make test-coverage
|
||||
```
|
||||
|
||||
## 数据库迁移
|
||||
|
||||
```bash
|
||||
# 使用 Makefile
|
||||
make migrate-up DB_PATH=~/.nex/config.db
|
||||
make migrate-down DB_PATH=~/.nex/config.db
|
||||
make migrate-status DB_PATH=~/.nex/config.db
|
||||
|
||||
# 或直接使用 goose
|
||||
goose -dir migrations sqlite3 ~/.nex/config.db up
|
||||
```
|
||||
|
||||
## API 文档
|
||||
|
||||
@@ -169,20 +278,20 @@ POST /v1/messages
|
||||
- `end_date` - 结束日期(YYYY-MM-DD)
|
||||
- `group_by` - 聚合维度(provider/model/date)
|
||||
|
||||
## 配置
|
||||
|
||||
配置和数据存储在 `~/.nex/` 目录:
|
||||
|
||||
- `~/.nex/config.db` - SQLite 数据库
|
||||
|
||||
## 开发
|
||||
|
||||
### 构建
|
||||
|
||||
```bash
|
||||
go build -o ai-gateway cmd/server/main.go
|
||||
make build
|
||||
```
|
||||
|
||||
### 代码检查
|
||||
|
||||
```bash
|
||||
make lint
|
||||
```
|
||||
|
||||
### 环境要求
|
||||
|
||||
- Go 1.21 或更高版本
|
||||
- Go 1.26 或更高版本
|
||||
|
||||
Reference in New Issue
Block a user