1
0

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:
2026-04-16 00:47:20 +08:00
parent 915b004924
commit f18904af1e
77 changed files with 5727 additions and 1257 deletions

View File

@@ -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通过依赖注入连接
```
handlerHTTP 请求处理)
→ 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 或更高版本