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