Files
tyapi-server/COMPLETE_ARCHITECTURE_PLAN.md

24 KiB
Raw Blame History

🏗️ 2025 年最佳 Gin Web 架构完整实施计划

📋 项目概述

构建一个基于 Clean Architecture + DDD 的高性能、模块化 Gin Web 应用架构,支持快速开发、易维护、高扩展性。

🎯 架构目标

  • 高度解耦: 清晰的分层架构,依赖倒置
  • 模块化: 支持模块间快速复制和一键接入
  • 高性能: 优化的并发处理和自动缓存策略
  • 易测试: 完整的单元测试和集成测试
  • 易维护: 标准化的代码结构和文档
  • 可扩展: 支持微服务演进
  • 生产就绪: 完整的安全、监控、容错机制

📁 完整项目目录结构

tyapi-server-gin/
├── cmd/
│   └── api/
│       └── main.go                     # 应用程序入口
├── internal/
│   ├── config/                         # 全局配置
│   │   ├── config.go                  # 配置结构体
│   │   ├── database.go                # 数据库配置
│   │   ├── server.go                  # 服务器配置
│   │   └── loader.go                  # 配置加载器
│   ├── container/                      # 依赖注入容器
│   │   ├── container.go               # FX容器
│   │   ├── providers.go               # 全局依赖提供者
│   │   └── module_registry.go         # 模块注册器
│   ├── shared/                         # 共享基础设施
│   │   ├── database/
│   │   │   ├── connection.go          # 数据库连接
│   │   │   ├── base_repository.go     # 通用仓储基类
│   │   │   └── pool_manager.go        # 连接池管理器
│   │   ├── cache/
│   │   │   ├── redis.go               # Redis缓存实现
│   │   │   ├── cache_wrapper.go       # 查询缓存包装器
│   │   │   └── cache_manager.go       # 缓存管理器
│   │   ├── logger/
│   │   │   └── logger.go              # 结构化日志
│   │   ├── middleware/                # 共享中间件
│   │   │   ├── auth.go                # 简单认证
│   │   │   ├── cors.go                # 跨域处理
│   │   │   ├── logger.go              # 日志中间件
│   │   │   ├── recovery.go            # 异常恢复
│   │   │   └── security.go            # 安全中间件栈
│   │   ├── events/                    # 事件总线
│   │   │   ├── event_bus.go
│   │   │   └── event_handler.go
│   │   ├── saga/                      # 分布式事务
│   │   │   ├── saga.go
│   │   │   └── saga_executor.go
│   │   ├── metrics/                   # 指标收集
│   │   │   ├── simple_metrics.go
│   │   │   └── business_metrics.go
│   │   ├── tracing/                   # 链路追踪
│   │   │   └── simple_tracer.go
│   │   ├── resilience/                # 容错机制
│   │   │   ├── circuit_breaker.go
│   │   │   └── retry.go
│   │   ├── hooks/                     # 钩子系统
│   │   │   └── hook_system.go
│   │   ├── health/                    # 健康检查
│   │   │   └── health_checker.go
│   │   └── interfaces/
│   │       └── module.go              # 模块接口定义
│   └── domains/                       # 业务域
│       ├── user/                      # 用户域
│       │   ├── entities/
│       │   │   ├── user.go
│       │   │   ├── profile.go
│       │   │   └── auth_token.go
│       │   ├── repositories/
│       │   │   ├── user_repository.go          # 接口
│       │   │   └── user_repository_impl.go     # 实现
│       │   ├── services/
│       │   │   ├── user_service.go             # 接口
│       │   │   ├── user_service_impl.go        # 实现
│       │   │   └── auth_service.go
│       │   ├── dto/
│       │   │   ├── user_dto.go
│       │   │   └── auth_dto.go
│       │   ├── handlers/
│       │   │   ├── user_handler.go
│       │   │   └── auth_handler.go
│       │   ├── routes/
│       │   │   └── user_routes.go
│       │   ├── validators/
│       │   │   └── user_validator.go
│       │   ├── migrations/
│       │   │   └── 001_create_users_table.sql
│       │   ├── events/
│       │   │   └── user_events.go
│       │   └── module.go                       # 模块定义
│       ├── product/                    # 产品域
│       │   ├── entities/
│       │   │   ├── product.go
│       │   │   ├── category.go
│       │   │   └── inventory.go
│       │   ├── repositories/
│       │   │   ├── product_repository.go
│       │   │   ├── product_repository_impl.go
│       │   │   └── category_repository.go
│       │   ├── services/
│       │   │   ├── product_service.go
│       │   │   ├── product_service_impl.go
│       │   │   └── inventory_service.go
│       │   ├── dto/
│       │   │   ├── product_dto.go
│       │   │   └── inventory_dto.go
│       │   ├── handlers/
│       │   │   ├── product_handler.go
│       │   │   └── category_handler.go
│       │   ├── routes/
│       │   │   └── product_routes.go
│       │   ├── validators/
│       │   │   └── product_validator.go
│       │   ├── migrations/
│       │   │   └── 002_create_products_table.sql
│       │   ├── events/
│       │   │   └── product_events.go
│       │   └── module.go
│       ├── finance/                    # 财务域
│       │   ├── entities/
│       │   │   ├── order.go
│       │   │   ├── payment.go
│       │   │   └── invoice.go
│       │   ├── repositories/
│       │   │   ├── order_repository.go
│       │   │   ├── order_repository_impl.go
│       │   │   └── payment_repository.go
│       │   ├── services/
│       │   │   ├── order_service.go
│       │   │   ├── order_service_impl.go
│       │   │   └── payment_service.go
│       │   ├── dto/
│       │   │   ├── order_dto.go
│       │   │   └── payment_dto.go
│       │   ├── handlers/
│       │   │   ├── order_handler.go
│       │   │   └── payment_handler.go
│       │   ├── routes/
│       │   │   └── finance_routes.go
│       │   ├── validators/
│       │   │   └── order_validator.go
│       │   ├── migrations/
│       │   │   └── 003_create_orders_table.sql
│       │   ├── events/
│       │   │   └── finance_events.go
│       │   └── module.go
│       └── analytics/                  # 数据业务域
│           ├── entities/
│           │   ├── report.go
│           │   ├── metric.go
│           │   └── dashboard.go
│           ├── repositories/
│           │   ├── analytics_repository.go
│           │   └── analytics_repository_impl.go
│           ├── services/
│           │   ├── analytics_service.go
│           │   ├── analytics_service_impl.go
│           │   └── report_service.go
│           ├── dto/
│           │   ├── report_dto.go
│           │   └── metric_dto.go
│           ├── handlers/
│           │   ├── analytics_handler.go
│           │   └── report_handler.go
│           ├── routes/
│           │   └── analytics_routes.go
│           ├── validators/
│           │   └── report_validator.go
│           ├── migrations/
│           │   └── 004_create_analytics_table.sql
│           ├── events/
│           │   └── analytics_events.go
│           └── module.go
├── pkg/                                # 公共工具包
│   ├── utils/
│   │   ├── converter.go               # 类型转换
│   │   ├── validator.go               # 验证工具
│   │   └── response.go                # 响应工具
│   ├── constants/
│   │   ├── errors.go                  # 错误常量
│   │   └── status.go                  # 状态常量
│   └── errors/
│       └── errors.go                  # 自定义错误
├── scripts/                            # 脚本工具
│   ├── generate-domain.sh             # 域生成器
│   ├── generate-module.sh             # 模块生成器
│   ├── register-module.sh             # 模块注册器
│   ├── build.sh                       # 构建脚本
│   └── migrate.sh                     # 数据库迁移脚本
├── deployments/                       # 部署配置
│   ├── docker/
│   │   ├── Dockerfile                 # 多阶段构建
│   │   └── docker-compose.yml         # 生产环境
│   └── docker-compose.dev.yml         # 开发环境
├── docs/                              # 文档
│   ├── DEVELOPMENT.md                 # 开发指南
│   ├── DEPLOYMENT.md                  # 部署指南
│   └── API.md                         # API使用说明
├── test/                              # 测试
│   ├── integration/                   # 集成测试
│   └── fixtures/                      # 测试数据
├── .env.example                       # 环境变量示例
├── .gitignore
├── Makefile                           # 构建命令
├── go.mod
└── go.sum

🔧 技术栈选择

核心框架

  • Web 框架: Gin v1.10+
  • ORM: GORM v2 (支持泛型)
  • 依赖注入: Uber FX
  • 配置管理: Viper
  • 验证: go-playground/validator v10

数据存储

  • 主数据库: PostgreSQL 15+
  • 缓存: Redis 7+ (自动缓存数据库查询)

监控和日志

  • 日志: Zap + OpenTelemetry
  • 指标收集: 简化的业务指标系统
  • 链路追踪: 轻量级请求追踪
  • 健康检查: 数据库和 Redis 状态监控

开发工具

  • 代码生成: Wire (可选)
  • 测试: Testify + Testcontainers
  • Linting: golangci-lint

📅 分步骤实施计划

🚀 阶段 1: 基础架构搭建 (预计 2-3 小时)

Step 1.1: 项目初始化

  • 初始化 Go 模块
  • 创建基础目录结构
  • 配置.gitignore 和基础文件
  • 安装核心依赖

Step 1.2: 配置系统

  • 实现配置加载器 (Viper)
  • 创建环境变量管理
  • 设置不同环境配置 (dev/staging/prod)

Step 1.3: 日志系统

  • 集成 Zap 日志库
  • 配置结构化日志
  • 实现日志中间件

Step 1.4: 数据库连接

  • 配置 PostgreSQL 连接
  • 实现连接池管理
  • 集成 GORM
  • 创建数据库迁移机制

🏗️ 阶段 2: 架构核心层 (预计 3-4 小时)

Step 2.1: 领域层设计

  • 定义基础实体接口
  • 创建用户实体示例
  • 实现仓储接口定义
  • 设计业务服务接口

Step 2.2: 基础设施层

  • 实现通用仓储基类 (支持自动缓存)
  • 创建缓存包装器和管理器
  • 创建用户仓储实现 (集成缓存)
  • 集成 Redis 缓存
  • 实现监控指标收集

Step 2.3: 应用层

  • 定义 DTO 结构
  • 实现业务服务
  • 创建用例处理器
  • 实现数据转换器

Step 2.4: 依赖注入

  • 配置 FX 容器
  • 实现依赖提供者
  • 创建模块注册机制

🌐 阶段 3: Web 层实现 (预计 2-3 小时)

Step 3.1: HTTP 层基础

  • 创建 Gin 路由器
  • 实现基础中间件 (CORS, Recovery, Logger)
  • 配置路由组织结构

Step 3.2: 处理器实现

  • 实现用户 CRUD 处理器
  • 创建健康检查处理器
  • 实现统一响应格式
  • 添加请求验证

Step 3.3: 中间件系统

  • 实现简单认证中间件
  • 创建限流中间件
  • 添加请求 ID 追踪
  • 实现错误处理中间件
  • 集成安全头中间件

🔧 阶段 4: 高级特性实现 (预计 3-4 小时)

Step 4.1: 自动缓存系统

  • 实现缓存包装器
  • 集成查询结果自动缓存
  • 实现智能缓存失效策略
  • 添加缓存穿透防护

Step 4.2: 跨域事务处理

  • 实现 Saga 模式事务协调器
  • 创建事件驱动架构
  • 实现补偿机制
  • 添加视图聚合模式

Step 4.3: 可观测性

  • 集成简单指标收集
  • 实现链路追踪
  • 添加业务指标监控
  • 创建性能监控面板

Step 4.4: 容错机制

  • 实现简化熔断器
  • 添加智能重试机制
  • 集成钩子系统
  • 实现优雅降级

🚀 阶段 5: 部署和工具 (预计 2-3 小时)

Step 5.1: 容器化 (Docker Compose)

  • 创建多阶段 Dockerfile
  • 配置生产环境 docker-compose.yml
  • 配置开发环境 docker-compose.dev.yml
  • 集成 PostgreSQL 和 Redis 容器
  • 实现健康检查
  • 配置数据卷持久化

Step 5.2: 开发工具

  • 创建 Makefile 命令
  • 实现模块生成器脚本
  • 配置代码质量检查
  • 创建数据库迁移脚本

Step 5.3: 生产就绪

  • 实现优雅关闭
  • 配置信号处理
  • 添加安全性增强
  • 创建监控和告警

🔄 自动缓存架构设计

缓存包装器实现

// 缓存包装器接口
type CacheableRepository[T any] interface {
    GetWithCache(ctx context.Context, key string, finder func() (*T, error)) (*T, error)
    ListWithCache(ctx context.Context, key string, finder func() ([]*T, error)) ([]*T, error)
    InvalidateCache(ctx context.Context, pattern string) error
}

// 自动缓存的仓储实现
type UserRepository struct {
    db    *gorm.DB
    cache cache.Manager
}

func (r *UserRepository) GetByID(ctx context.Context, id uint) (*User, error) {
    cacheKey := fmt.Sprintf("user:id:%d", id)
    return r.cache.GetWithCache(ctx, cacheKey, func() (*User, error) {
        var user User
        err := r.db.First(&user, id).Error
        return &user, err
    })
}

缓存策略

  • 自动查询缓存: 数据库查询结果自动缓存
  • 智能缓存失效: 基于数据变更的缓存失效
  • 多级缓存架构: 内存 + Redis 组合
  • 缓存穿透防护: 空结果缓存和布隆过滤器
  • 缓存预热: 启动时预加载热点数据

🔄 跨域事务处理

Saga 模式实现

// Saga事务协调器
type Saga struct {
    ID       string
    Steps    []SagaStep
    Data     interface{}
    Status   SagaStatus
    executor SagaExecutor
}

type SagaStep struct {
    Name        string
    Action      func(ctx context.Context, data interface{}) error
    Compensate  func(ctx context.Context, data interface{}) error
}

跨域查询处理

视图聚合模式

// OrderView 订单视图聚合
type OrderView struct {
    // 订单基本信息 (来自finance域)
    OrderID     uint      `json:"order_id"`
    Amount      float64   `json:"amount"`
    Status      string    `json:"status"`
    CreatedAt   time.Time `json:"created_at"`

    // 用户信息 (来自user域)
    UserID      uint   `json:"user_id"`
    UserName    string `json:"user_name"`
    UserEmail   string `json:"user_email"`

    // 产品信息 (来自product域)
    ProductID   uint   `json:"product_id"`
    ProductName string `json:"product_name"`
    ProductPrice float64 `json:"product_price"`
}

🔄 模块化特性

快速添加新模块

# 使用脚本快速生成新模块
make add-domain name=inventory

# 自动生成:
# - 完整的目录结构和代码模板
# - 自动缓存支持的仓储层
# - 标准化的API接口
# - 依赖注入自动配置
# - 路由自动注册

# 立即可用的API
# GET    /api/v1/inventorys
# POST   /api/v1/inventorys
# GET    /api/v1/inventorys/:id
# PUT    /api/v1/inventorys/:id
# DELETE /api/v1/inventorys/:id
# GET    /api/v1/inventorys/search

模块间解耦

  • 通过接口定义模块边界
  • 使用事件驱动通信
  • 独立的数据模型
  • 可插拔的模块系统

🐳 Docker Compose 部署架构

生产环境配置

# docker-compose.yml
version: "3.8"
services:
    api:
        build: .
        ports:
            - "8080:8080"
        environment:
            - ENV=production
            - DB_HOST=postgres
            - REDIS_HOST=redis
        depends_on:
            - postgres
            - redis

    postgres:
        image: postgres:15-alpine
        environment:
            POSTGRES_DB: tyapi
            POSTGRES_USER: tyapi
            POSTGRES_PASSWORD: ${DB_PASSWORD}
        volumes:
            - postgres_data:/var/lib/postgresql/data
        ports:
            - "5432:5432"

    redis:
        image: redis:7-alpine
        volumes:
            - redis_data:/data
        ports:
            - "6379:6379"

volumes:
    postgres_data:
    redis_data:

多阶段 Dockerfile

# Build stage
FROM golang:1.23.4-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o main cmd/api/main.go

# Development stage
FROM golang:1.23.4-alpine AS development
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
CMD ["go", "run", "cmd/api/main.go"]

# Production stage
FROM alpine:latest AS production
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/main .
CMD ["./main"]

🛡️ 安全和监控特性

轻量安全中间件栈

// SecurityMiddleware 安全中间件集合
type SecurityMiddleware struct {
    jwtSecret    string
    rateLimiter  *rate.Limiter
    trustedIPs   map[string]bool
}

// Chain 安全中间件链
func (s *SecurityMiddleware) Chain() []gin.HandlerFunc {
    return []gin.HandlerFunc{
        s.RateLimit(),
        s.SecurityHeaders(),
        s.IPWhitelist(),
        s.RequestID(),
    }
}

简化的可观测性

// SimpleMetrics 简化的指标收集器
type SimpleMetrics struct {
    counters map[string]int64
    gauges   map[string]float64
    mu       sync.RWMutex
}

// BusinessMetrics 业务指标
type BusinessMetrics struct {
    metrics *SimpleMetrics
}

func (b *BusinessMetrics) RecordOrderCreated(amount float64) {
    b.metrics.IncCounter("orders.created.count", 1)
    b.metrics.IncCounter("orders.created.amount", int64(amount*100))
}

容错机制

// SimpleCircuitBreaker 简化的熔断器
type SimpleCircuitBreaker struct {
    maxFailures  int
    resetTimeout time.Duration
    state        CircuitState
}

// SimpleRetry 智能重试机制
func SimpleRetry(ctx context.Context, config RetryConfig, fn func() error) error {
    // 指数退避重试实现
}

健康检查

// HealthChecker 健康检查器
type HealthChecker struct {
    db    *gorm.DB
    redis *redis.Client
}

type HealthStatus struct {
    Status    string                 `json:"status"`
    Timestamp time.Time              `json:"timestamp"`
    Checks    map[string]CheckResult `json:"checks"`
}

📊 性能优化策略

数据库优化

  • 连接池动态调优
  • 查询结果自动缓存
  • 索引策略优化
  • 批量操作优化

缓存策略

  • 自动查询缓存: 透明的查询结果缓存
  • 智能失效: 数据变更时自动清理相关缓存
  • 多级架构: L1(内存) + L2(Redis) 缓存
  • 穿透防护: 空值缓存和布隆过滤器

并发优化

  • Goroutine 池管理
  • Context 超时控制
  • 异步任务处理
  • 批量数据加载

🔌 扩展性设计

钩子系统

// SimpleHookSystem 简化的钩子系统
type SimpleHookSystem struct {
    hooks map[string][]HookFunc
}

// 使用示例
hookSystem.Register("user.created", func(ctx context.Context, data interface{}) error {
    user := data.(*entities.User)
    return sendWelcomeEmail(user.Email)
})

事件驱动架构

// 跨域事件通信
type UserCreatedEvent struct {
    UserID    uint      `json:"user_id"`
    Email     string    `json:"email"`
    CreatedAt time.Time `json:"created_at"`
}

// 产品域监听用户创建事件
func (s *ProductService) OnUserCreated(event UserCreatedEvent) error {
    return s.CreateUserRecommendations(event.UserID)
}

🛠️ 开发工具

Makefile 快速命令

# 添加新的业务域
add-domain:
	@./scripts/generate-domain.sh $(name)
	@./scripts/register-module.sh $(name)

# 开发环境运行
run-dev:
	@go run cmd/api/main.go

# Docker开发环境
docker-dev:
	@docker-compose -f docker-compose.dev.yml up -d

# 数据库迁移
migrate:
	@go run cmd/migrate/main.go

域生成器脚本

#!/bin/bash
# scripts/generate-domain.sh

# 自动生成:
# - 实体定义和表结构
# - 仓储接口和实现(支持自动缓存)
# - 业务服务层
# - HTTP处理器
# - DTO和验证器
# - 路由注册
# - 模块定义和依赖注入

🎯 预期收益

  1. 开发效率: 模块生成器将新功能开发时间减少 70%
  2. 代码质量: 统一的架构模式和代码规范
  3. 维护性: 清晰的分层和依赖关系
  4. 可测试性: 依赖注入支持 100%的单元测试覆盖
  5. 性能: 自动缓存和并发优化策略
  6. 扩展性: 支持平滑的微服务演进
  7. 稳定性: 完整的容错和监控机制
  8. 安全性: 轻量但完备的安全防护

架构特色总结

🎯 核心优势

  1. 自动缓存系统:

    • 数据库查询自动缓存,性能提升显著
    • 智能缓存失效策略
    • 多级缓存架构(内存 + Redis)
  2. 模块化设计:

    • Clean Architecture + DDD 设计
    • 5 分钟快速生成完整业务域
    • 依赖注入容器(Uber FX)
  3. 跨域事务处理:

    • Saga 模式处理分布式事务
    • 视图聚合解决跨域查询
    • 事件驱动架构
  4. Docker Compose 部署:

    • 开发和生产环境分离
    • 多阶段构建优化
    • 数据持久化和网络隔离
  5. 生产就绪特性:

    • 轻量安全中间件栈
    • 简化的可观测性
    • 容错和稳定性保障
    • 健康检查和监控

📋 技术决策

数据库: PostgreSQL 15+ 主库 + Redis 7+ 缓存
缓存策略: 自动查询缓存 + 智能失效
部署方式: Docker Compose(生产/开发分离)
开发工具: 移除热重载,保留核心工具
认证方案: 简化 JWT 认证,无复杂 RBAC
测试策略: 手动编写,无自动生成
文档方案: 手动维护,无自动 API 文档

🚀 开始实施

架构设计已完成!总预计实施时间:12-15 小时,分 5 个阶段完成。

实施顺序:

  1. 基础架构搭建 (2-3 小时)
  2. 架构核心层 (3-4 小时)
  3. Web 层实现 (2-3 小时)
  4. 高级特性 (3-4 小时)
  5. 部署和工具 (2-3 小时)

关键特性:

  • 🚀 5 分钟生成新业务域 - 完整的模块化开发
  • 自动缓存系统 - 透明的性能优化
  • 🔄 跨域事务处理 - 企业级数据一致性
  • 🐳 容器化部署 - 生产就绪的部署方案
  • 🛡️ 安全和监控 - 轻量但完备的保障体系

准备好开始实施了吗? 🎯