fix
Some checks failed
部署后端服务 / 🧪 测试后端 (push) Failing after 5m8s
部署后端服务 / 🚀 构建并部署 (push) Has been skipped
部署后端服务 / 🔄 回滚部署 (push) Has been skipped

This commit is contained in:
xujiang
2025-07-10 18:09:11 +08:00
parent 35004f224e
commit 010fe2a8c7
96 changed files with 23709 additions and 19 deletions

View File

@ -0,0 +1,363 @@
# 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. **敏感信息泄露**: 配置敏感信息过滤
## 💡 最佳实践
### 配置管理
- 使用环境变量覆盖敏感配置
- 配置验证和默认值设置
- 配置变更的版本控制
### 错误处理
- 统一错误响应格式
- 详细的错误日志记录
- 适当的错误码设计
### 安全考虑
- 敏感信息不在日志中输出
- 配置文件权限控制
- 环境变量加密存储
### 性能优化
- 合理的超时配置
- 连接池大小调优
- 资源及时释放
本模块为整个应用的入口,确保配置正确、启动流程清晰是项目成功的关键。在开发过程中,优先使用开发模式进行功能验证,在集成测试时使用生产模式。