Files
photography/backend-old/cmd/server/CLAUDE.md
xujiang 604b9e59ba fix
2025-07-10 18:09:11 +08:00

363 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Server Entry Point - CLAUDE.md
本文件为 Claude Code 在服务器入口模块中工作时提供指导。
## 🎯 模块概览
这是后端服务的启动入口模块,负责应用初始化、配置加载、依赖注入和服务启动。
### 主要职责
- 🚀 应用启动和生命周期管理
- ⚙️ 配置文件加载和环境变量解析
- 🔌 依赖注入和组件初始化
- 🌐 HTTP 服务器启动和路由注册
- 📊 数据库连接和迁移管理
- 🔧 优雅关闭和资源清理
### 推荐文件结构Go 风格)
```
cmd/server/
├── CLAUDE.md # 📋 当前文件 - 服务启动指导
├── main.go # 🚀 统一入口点
├── app.go # 🏗️ 应用构建器
├── config.go # ⚙️ 配置加载器
├── dependencies.go # 🔌 依赖注入容器
└── server.go # 🌐 HTTP 服务器管理
```
## 🚀 启动模式说明
### 生产模式 (`main.go`)
```go
// 特点:
// - PostgreSQL 数据库
// - Redis 缓存
// - 完整的中间件栈
// - 生产级日志配置
// - 健康检查端点
```
**适用场景**: 生产环境、集成测试、性能测试
### 开发模式 (`main_with_db.go`)
```go
// 特点:
// - SQLite 数据库
// - 内存缓存
// - 开发友好的日志
// - 热重载支持
// - 调试工具集成
```
**适用场景**: 本地开发、单元测试、功能验证
### Mock 模式 (`simple_main.go`)
```go
// 特点:
// - 内存数据存储
// - 固定响应数据
// - 极快启动速度
// - 无数据库依赖
// - 最小化配置
```
**适用场景**: 前端开发、API 测试、演示环境
## 🔧 配置管理
### 配置文件层次
```
configs/
├── config.yaml # 基础配置
├── config.dev.yaml # 开发环境覆盖
└── config.prod.yaml # 生产环境覆盖
```
### 环境变量优先级
```
环境变量 > 配置文件 > 默认值
```
### 配置结构
```go
type Config struct {
Server ServerConfig `yaml:"server"`
Database DatabaseConfig `yaml:"database"`
Cache CacheConfig `yaml:"cache"`
Storage StorageConfig `yaml:"storage"`
Auth AuthConfig `yaml:"auth"`
Log LogConfig `yaml:"log"`
}
```
## 🏗️ 依赖注入
### 依赖层次
```
main.go
├── 📋 Config Service
├── 📊 Database Service
├── 💾 Cache Service
├── 📁 Storage Service
├── 🔐 Auth Service
├── 📚 Repository Layer
├── 🏢 Service Layer
└── 🌐 Handler Layer
```
### 依赖注入模式
```go
// 1. 配置加载
config := config.LoadConfig()
// 2. 基础服务初始化
db := database.NewConnection(config.Database)
cache := cache.NewRedisClient(config.Cache)
storage := storage.NewService(config.Storage)
// 3. 仓储层初始化
userRepo := repository.NewUserRepository(db)
photoRepo := repository.NewPhotoRepository(db)
// 4. 服务层初始化
userService := service.NewUserService(userRepo, cache)
photoService := service.NewPhotoService(photoRepo, storage)
// 5. 处理器层初始化
userHandler := handler.NewUserHandler(userService)
photoHandler := handler.NewPhotoHandler(photoService)
// 6. 路由设置
router := gin.New()
v1 := router.Group("/api/v1")
{
v1.POST("/users", userHandler.Create)
v1.GET("/users", userHandler.List)
v1.GET("/photos", photoHandler.List)
v1.POST("/photos", photoHandler.Create)
}
```
## 🔄 启动流程
### 标准启动流程
1. **配置加载**: 解析配置文件和环境变量
2. **日志初始化**: 设置日志级别和输出格式
3. **数据库连接**: 建立数据库连接池
4. **缓存连接**: 初始化 Redis 连接
5. **服务注册**: 注册各层服务
6. **中间件设置**: 配置认证、日志、CORS 等中间件
7. **路由注册**: 注册所有 API 路由
8. **健康检查**: 启动健康检查端点
9. **服务启动**: 启动 HTTP 服务器
10. **优雅关闭**: 处理关闭信号
### 启动命令
```bash
# 生产模式
go run cmd/server/main.go
# 开发模式
go run cmd/server/main_with_db.go
# Mock 模式
go run cmd/server/simple_main.go
# 使用 Makefile
make dev # 开发模式
make dev-simple # Mock 模式
make prod # 生产模式
```
## 📊 健康检查
### 健康检查端点
```go
GET /health
GET /health/ready
GET /health/live
```
### 健康检查内容
- **数据库连接状态**
- **缓存服务状态**
- **存储服务状态**
- **外部服务状态**
- **系统资源状态**
### 响应格式
```json
{
"status": "healthy",
"timestamp": "2024-01-01T00:00:00Z",
"version": "1.0.0",
"checks": {
"database": "healthy",
"cache": "healthy",
"storage": "healthy"
}
}
```
## 🔧 优雅关闭
### 关闭信号处理
```go
// 监听关闭信号
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
// 等待关闭信号
<-quit
log.Println("Shutting down server...")
// 设置关闭超时
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
// 优雅关闭服务器
if err := srv.Shutdown(ctx); err != nil {
log.Fatal("Server forced to shutdown:", err)
}
```
### 关闭流程
1. **停止接收新请求**
2. **等待现有请求完成**
3. **关闭数据库连接**
4. **关闭缓存连接**
5. **清理临时资源**
6. **记录关闭日志**
## 📋 环境变量配置
### 数据库配置
```bash
# PostgreSQL
DB_HOST=localhost
DB_PORT=5432
DB_NAME=photography
DB_USER=postgres
DB_PASSWORD=your_password
DB_SSL_MODE=disable
# SQLite (开发模式)
DB_TYPE=sqlite
DB_PATH=./photography.db
```
### 缓存配置
```bash
# Redis
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=
REDIS_DB=0
```
### 认证配置
```bash
# JWT
JWT_SECRET=your_jwt_secret
JWT_EXPIRES_IN=24h
JWT_REFRESH_EXPIRES_IN=168h
```
### 文件存储配置
```bash
# 本地存储
STORAGE_TYPE=local
STORAGE_PATH=./uploads
STORAGE_MAX_SIZE=10MB
# S3 存储
STORAGE_TYPE=s3
AWS_ACCESS_KEY_ID=your_access_key
AWS_SECRET_ACCESS_KEY=your_secret_key
AWS_BUCKET_NAME=your_bucket
AWS_REGION=us-east-1
```
## 🧪 开发调试
### 调试模式启动
```bash
# 开启调试模式
export GIN_MODE=debug
export LOG_LEVEL=debug
# 启动服务
go run cmd/server/main_with_db.go
```
### 调试工具
- **pprof**: 性能分析
- **gin-debug**: 路由调试
- **hot-reload**: 代码热重载
- **swagger**: API 文档
### 调试端点
```
GET /debug/pprof/ # 性能分析
GET /debug/routes # 路由列表
GET /debug/vars # 运行时变量
GET /swagger/* # API 文档
```
## 📊 监控指标
### 内置指标
- **HTTP 请求数量**
- **HTTP 响应时间**
- **数据库连接数**
- **缓存命中率**
- **内存使用量**
- **CPU 使用率**
### 指标端点
```
GET /metrics # Prometheus 指标
GET /stats # 应用统计信息
```
## 🔍 常见问题
### 启动失败
1. **端口被占用**: 检查端口配置,使用 `lsof -i :8080` 查看
2. **配置文件错误**: 检查 YAML 语法,验证配置项
3. **数据库连接失败**: 检查数据库服务状态和连接配置
4. **权限问题**: 检查文件读写权限
### 性能问题
1. **启动慢**: 检查数据库连接池配置
2. **内存泄漏**: 使用 pprof 分析内存使用
3. **连接超时**: 调整超时配置和连接池大小
### 日志问题
1. **日志文件过大**: 配置日志轮转
2. **日志格式混乱**: 统一日志格式配置
3. **敏感信息泄露**: 配置敏感信息过滤
## 💡 最佳实践
### 配置管理
- 使用环境变量覆盖敏感配置
- 配置验证和默认值设置
- 配置变更的版本控制
### 错误处理
- 统一错误响应格式
- 详细的错误日志记录
- 适当的错误码设计
### 安全考虑
- 敏感信息不在日志中输出
- 配置文件权限控制
- 环境变量加密存储
### 性能优化
- 合理的超时配置
- 连接池大小调优
- 资源及时释放
本模块为整个应用的入口,确保配置正确、启动流程清晰是项目成功的关键。在开发过程中,优先使用开发模式进行功能验证,在集成测试时使用生产模式。