后端架构
后端架构
ModelGate 后端采用清晰的分层架构设计,使用 Go 语言开发。
整体架构
┌─────────────────────────────────────────────────────────────┐
│ 应用层 (App) │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Admin API │ │ Relay API │ │
│ │ (Gin Router) │ │ (Gin Router) │ │
│ └─────────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 业务层 (Module) │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ System 模块 │ │ Relay 模块 │ │
│ │ - 用户 │ │ - 供应商 │ │
│ │ - 角色 │ │ - 模型 │ │
│ │ - 菜单 │ │ - 转发引擎 │ │
│ │ - 权限 │ │ - 计费 │ │
│ └─────────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 数据层 (DAO) │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ GORM ORM │ │ 数据库模型 │ │
│ └─────────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 数据库 (MySQL/PG/SQLite) │
└─────────────────────────────────────────────────────────────┘项目结构
modelgate/
├── cmd/ # 命令行入口
├── configs/ # 配置文件目录
│ ├── config.toml # 主配置文件
│ └── .env # 环境变量文件
├── deployments/ # 部署相关
├── docs/ # 文档
├── internal/ # 内部代码
│ ├── app/ # 应用层 (HTTP/RPC 处理器)
│ │ ├── admin/ # 管理后台服务
│ │ └── api/ # API 转发服务
│ ├── config/ # 配置管理
│ ├── relay/ # 业务模块
│ │ ├── dao/ # 数据访问层
│ │ ├── model/ # 数据模型
│ │ └── service/ # 业务逻辑层
│ ├── runtime/ # 运行时 (转发执行引擎)
│ │ ├── core/ # 核心转发逻辑
│ │ ├── hooks/ # 转发钩子
│ │ └── provider/ # 供应商适配器
│ │ ├── openai/
│ │ ├── anthropic/
│ │ └── zhipu/
│ ├── server/ # 服务器 (路由、中间件)
│ │ └── middleware/ # 中间件
│ └── system/ # 系统模块 (用户、角色、菜单)
├── pkg/ # 公共包
│ ├── db/ # 数据库工具
│ ├── proto/ # Protobuf 生成代码
│ └── utils/ # 通用工具
├── proto/ # Protobuf 定义
├── go.mod
├── go.sum
├── buf.yaml
└── LICENSE核心模块
1. Relay 模块
Relay 模块是 ModelGate 的核心,负责处理大模型 API 转发。
结构:
internal/relay/
├── dao/ # 数据访问层
├── model/ # 数据模型
└── service/ # 业务逻辑层2. Runtime 模块
Runtime 模块是转发的核心引擎,负责实际的请求转发和响应处理。
结构:
internal/runtime/
├── core/ # 核心转发逻辑
├── hooks/ # 转发钩子,用于扩展功能
└── provider/ # 供应商适配器
├── openai/
├── anthropic/
└── zhipu/支持的提供商:
- OpenAI
- Anthropic
- 智谱 (Zhipu AI)
3. System 模块
System 模块提供基础系统功能。
结构:
internal/module/system/
├── user/ # 用户模块
├── role/ # 角色模块
└── menu/ # 菜单模块功能:
- 用户注册、登录、认证
- 角色和权限管理
- 菜单和路由配置
3. 通信协议
ModelGate 使用两种协议:
HTTP/REST (Gin):
- 管理后台 API
- API 转发接口
- 健康检查等
gRPC-Web (Connect RPC):
- 前端与后端通信
- Protobuf 定义在
proto/目录
依赖注入
使用 samber/do 实现依赖注入:
// 在 internal/app/inject.go 中
func NewInjector(cfg *config.Config) (*injector, error) {
injector := &injector{}
// 数据库
provider.ProvideValue(injector, cfg)
provider.Provide(injector, db.NewDB)
// DAO 层
provider.Provide(injector, user_dao.New)
provider.Provide(injector, provider_dao.New)
// Service 层
provider.Provide(injector, user_service.New)
provider.Provide(injector, provider_service.New)
// Handler 层
provider.Provide(injector, handler.NewUserHandler)
provider.Provide(injector, handler.NewProviderHandler)
return injector, nil
}中间件
位于 internal/server/middleware/:
- AuthMiddleware - JWT 认证
- RBACMiddleware - 权限控制
- RequestLogMiddleware - 请求日志
- CORS Middleware - 跨域支持
数据库模型
使用 GORM 定义数据模型:
// 用户模型
type User struct {
ID uint `gorm:"primarykey"`
Username string `gorm:"uniqueIndex"`
Email string `gorm:"uniqueIndex"`
Password string
RoleID uint
CreatedAt time.Time
UpdatedAt time.Time
}
// 供应商模型
type Provider struct {
ID uint `gorm:"primarykey"`
Name string `gorm:"uniqueIndex"`
Type string
APIKey string
BaseURL string
CreatedAt time.Time
UpdatedAt time.Time
}
// 模型模型
type Model struct {
ID uint `gorm:"primarykey"`
Name string `gorm:"uniqueIndex"`
ProviderID uint
InputPrice float64
OutputPrice float64
CreatedAt time.Time
UpdatedAt time.Time
}配置管理
使用 Viper 管理配置:
- config.toml - 主配置文件
- .env - 环境变量(敏感信息)
配置项包括:
- 服务器配置(端口、模式)
- 数据库配置
- JWT 配置
- 日志配置
- 各供应商 API 配置
安全设计
- 密码加密:使用 bcrypt 加密存储
- JWT 认证:无状态认证机制
- RBAC 权限:基于 Casbin 的角色权限控制
- API 密钥:独立的 API 密钥管理系统
- CORS 控制:可配置的跨域策略