# 第十三部分：源码级设计

## 13.1 项目目录结构

```
game-accelerator/
├── README.md
├── LICENSE
├── Makefile
├── docker-compose.yml
├── .github/
│   └── workflows/
│       ├── ci.yml
│       ├── release.yml
│       └── deploy.yml
│
├── docs/                          # 文档
│   ├── architecture.md
│   ├── api.md
│   ├── deployment.md
│   └── contributing.md
│
├── proto/                         # Protobuf定义
│   ├── user.proto
│   ├── node.proto
│   ├── dispatch.proto
│   ├── game.proto
│   └── common.proto
│
├── client/                        # 客户端
│   ├── windows/                   # Windows客户端
│   │   ├── CMakeLists.txt
│   │   ├── src/
│   │   │   ├── main.cpp
│   │   │   ├── core/
│   │   │   │   ├── tunnel.h/cpp         # 隧道模块
│   │   │   │   ├── protocol.h/cpp       # 协议处理
│   │   │   │   ├── crypto.h/cpp         # 加密模块
│   │   │   │   ├── session.h/cpp        # 会话管理
│   │   │   │   └── config.h/cpp         # 配置管理
│   │   │   ├── capture/
│   │   │   │   ├── wfp_driver.h/cpp     # WFP驱动交互
│   │   │   │   ├── traffic_filter.h/cpp # 流量过滤
│   │   │   │   └── game_detect.h/cpp    # 游戏检测
│   │   │   ├── network/
│   │   │   │   ├── udp_relay.h/cpp      # UDP转发
│   │   │   │   ├── quic_tunnel.h/cpp    # QUIC隧道
│   │   │   │   ├── fec.h/cpp            # 前向纠错
│   │   │   │   └── multipath.h/cpp      # 多路径
│   │   │   ├── scheduler/
│   │   │   │   ├── node_selector.h/cpp  # 节点选择
│   │   │   │   ├── speed_test.h/cpp     # 测速
│   │   │   │   └── auto_switch.h/cpp    # 自动切换
│   │   │   └── ui/
│   │   │       ├── main_window.h/cpp    # 主窗口
│   │   │       ├── login_dialog.h/cpp   # 登录对话框
│   │   │       ├── game_list.h/cpp      # 游戏列表
│   │   │       └── settings.h/cpp       # 设置页面
│   │   ├── driver/                  # WFP驱动
│   │   │   ├── driver.c
│   │   │   ├── callout.c
│   │   │   ├── filter.c
│   │   │   └── utils.c
│   │   └── resources/
│   │       ├── icons/
│   │       └── strings/
│   │
│   ├── macos/                     # macOS客户端
│   │   ├── Package.swift
│   │   ├── Sources/
│   │   │   ├── Accelerator/
│   │   │   │   ├── Core/
│   │   │   │   ├── Network/
│   │   │   │   └── UI/
│   │   │   └── NetworkExtension/
│   │   └── Tests/
│   │
│   ├── android/                   # Android客户端
│   │   ├── build.gradle.kts
│   │   ├── app/
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── com/accelerator/
│   │   │           │       ├── core/
│   │   │           │       ├── vpn/
│   │   │           │       ├── ui/
│   │   │           │       └── service/
│   │   │           └── res/
│   │   └── build.gradle.kts
│   │
│   └── ios/                       # iOS客户端
│       ├── Accelerator.xcodeproj
│       ├── Accelerator/
│       │   ├── Core/
│       │   ├── Network/
│       │   └── UI/
│       └── PacketTunnel/
│
├── server/                        # 服务端
│   ├── go.mod
│   ├── go.sum
│   ├── cmd/                       # 入口
│   │   ├── api-gateway/           # API网关
│   │   │   └── main.go
│   │   ├── user-service/          # 用户服务
│   │   │   └── main.go
│   │   ├── order-service/         # 订单服务
│   │   │   └── main.go
│   │   ├── node-service/          # 节点服务
│   │   │   └── main.go
│   │   ├── dispatch-service/      # 调度服务
│   │   │   └── main.go
│   │   ├── game-service/          # 游戏服务
│   │   │   └── main.go
│   │   ├── relay-service/         # 转发服务
│   │   │   └── main.go
│   │   └── monitor-service/       # 监控服务
│   │       └── main.go
│   │
│   ├── internal/                  # 内部包
│   │   ├── model/                 # 数据模型
│   │   │   ├── user.go
│   │   │   ├── node.go
│   │   │   ├── order.go
│   │   │   ├── game.go
│   │   │   └── session.go
│   │   ├── repository/            # 数据访问层
│   │   │   ├── mysql/
│   │   │   │   ├── user_repo.go
│   │   │   │   ├── node_repo.go
│   │   │   │   └── order_repo.go
│   │   │   └── redis/
│   │   │       ├── cache.go
│   │   │       └── session.go
│   │   ├── service/               # 业务逻辑层
│   │   │   ├── auth/
│   │   │   │   ├── auth.go
│   │   │   │   ├── jwt.go
│   │   │   │   └── password.go
│   │   │   ├── user/
│   │   │   │   ├── user.go
│   │   │   │   └── device.go
│   │   │   ├── node/
│   │   │   │   ├── node.go
│   │   │   │   ├── health.go
│   │   │   │   └── discovery.go
│   │   │   ├── dispatch/
│   │   │   │   ├── scheduler.go
│   │   │   │   ├── scorer.go
│   │   │   │   └── router.go
│   │   │   ├── order/
│   │   │   │   ├── order.go
│   │   │   │   └── payment.go
│   │   │   └── relay/
│   │   │       ├── udp_relay.go
│   │   │       ├── quic_tunnel.go
│   │   │       └── fec.go
│   │   ├── handler/               # HTTP/RPC处理器
│   │   │   ├── http/
│   │   │   │   ├── user_handler.go
│   │   │   │   ├── node_handler.go
│   │   │   │   └── order_handler.go
│   │   │   └── grpc/
│   │   │       ├── dispatch_handler.go
│   │   │       └── node_handler.go
│   │   ├── middleware/            # 中间件
│   │   │   ├── auth.go
│   │   │   ├── rate_limit.go
│   │   │   ├── cors.go
│   │   │   └── logger.go
│   │   ├── config/                # 配置
│   │   │   └── config.go
│   │   └── pkg/                   # 公共包
│   │       ├── crypto/
│   │       │   ├── aes.go
│   │       │   └── ecdh.go
│   │       ├── network/
│   │       │   ├── bbr.go
│   │       │   └── fec.go
│   │       └── utils/
│   │           ├── ip.go
│   │           └── geo.go
│   │
│   └── migrations/                # 数据库迁移
│       ├── 001_users.up.sql
│       ├── 001_users.down.sql
│       ├── 002_nodes.up.sql
│       └── ...
│
├── admin/                         # 管理后台
│   ├── package.json
│   ├── tsconfig.json
│   ├── vite.config.ts
│   ├── src/
│   │   ├── App.tsx
│   │   ├── main.tsx
│   │   ├── pages/
│   │   │   ├── Dashboard/
│   │   │   ├── Users/
│   │   │   ├── Nodes/
│   │   │   ├── Games/
│   │   │   ├── Orders/
│   │   │   ├── Monitoring/
│   │   │   └── Settings/
│   │   ├── components/
│   │   │   ├── Layout/
│   │   │   ├── Charts/
│   │   │   └── Common/
│   │   ├── services/
│   │   │   ├── api.ts
│   │   │   ├── user.ts
│   │   │   ├── node.ts
│   │   │   └── order.ts
│   │   ├── stores/
│   │   │   ├── auth.ts
│   │   │   └── app.ts
│   │   └── utils/
│   │       ├── request.ts
│   │       └── auth.ts
│   └── public/
│
├── deploy/                        # 部署配置
│   ├── docker/
│   │   ├── Dockerfile.api-gateway
│   │   ├── Dockerfile.user-service
│   │   ├── Dockerfile.relay-service
│   │   └── ...
│   ├── k8s/
│   │   ├── namespace.yaml
│   │   ├── configmap.yaml
│   │   ├── secrets.yaml
│   │   ├── deployments/
│   │   │   ├── api-gateway.yaml
│   │   │   ├── user-service.yaml
│   │   │   └── ...
│   │   ├── services/
│   │   └── ingress/
│   ├── terraform/
│   │   ├── main.tf
│   │   ├── variables.tf
│   │   ├── outputs.tf
│   │   └── modules/
│   │       ├── alicloud/
│   │       ├── aws/
│   │       └── gcp/
│   └── ansible/
│       ├── playbooks/
│       └── roles/
│
├── scripts/                       # 脚本
│   ├── build.sh
│   ├── deploy.sh
│   ├── test.sh
│   └── seed_data.sh
│
└── test/                          # 测试
    ├── unit/
    ├── integration/
    ├── e2e/
    └── performance/
```

## 13.2 核心模块接口定义

### 13.2.1 用户服务接口

```go
// server/internal/service/user/user.go
package user

import (
    "context"
    "time"
)

// Service 用户服务接口
type Service interface {
    // Register 用户注册
    Register(ctx context.Context, req *RegisterRequest) (*RegisterResponse, error)
    
    // Login 用户登录
    Login(ctx context.Context, req *LoginRequest) (*LoginResponse, error)
    
    // Logout 用户登出
    Logout(ctx context.Context, userID uint64) error
    
    // RefreshToken 刷新Token
    RefreshToken(ctx context.Context, refreshToken string) (*TokenPair, error)
    
    // GetProfile 获取用户信息
    GetProfile(ctx context.Context, userID uint64) (*UserProfile, error)
    
    // UpdateProfile 更新用户信息
    UpdateProfile(ctx context.Context, userID uint64, req *UpdateProfileRequest) error
    
    // ChangePassword 修改密码
    ChangePassword(ctx context.Context, userID uint64, req *ChangePasswordRequest) error
    
    // BindDevice 绑定设备
    BindDevice(ctx context.Context, userID uint64, device *DeviceInfo) error
    
    // UnbindDevice 解绑设备
    UnbindDevice(ctx context.Context, userID uint64, deviceID string) error
    
    // GetDevices 获取设备列表
    GetDevices(ctx context.Context, userID uint64) ([]*DeviceInfo, error)
}

// RegisterRequest 注册请求
type RegisterRequest struct {
    Phone    string `json:"phone" validate:"required"`
    Password string `json:"password" validate:"required,min=8"`
    Code     string `json:"code" validate:"required"` // 验证码
}

// LoginRequest 登录请求
type LoginRequest struct {
    Phone    string `json:"phone"`
    Email    string `json:"email"`
    Password string `json:"password" validate:"required"`
    DeviceID string `json:"device_id" validate:"required"`
}

// LoginResponse 登录响应
type LoginResponse struct {
    AccessToken  string       `json:"access_token"`
    RefreshToken string       `json:"refresh_token"`
    ExpiresIn    int64        `json:"expires_in"`
    User         *UserProfile `json:"user"`
}

// TokenPair Token对
type TokenPair struct {
    AccessToken  string `json:"access_token"`
    RefreshToken string `json:"refresh_token"`
    ExpiresIn    int64  `json:"expires_in"`
}

// UserProfile 用户信息
type UserProfile struct {
    ID        uint64    `json:"id"`
    UUID      string    `json:"uuid"`
    Phone     string    `json:"phone"`
    Email     string    `json:"email"`
    Nickname  string    `json:"nickname"`
    Avatar    string    `json:"avatar"`
    Status    int       `json:"status"`
    CreatedAt time.Time `json:"created_at"`
}

// DeviceInfo 设备信息
type DeviceInfo struct {
    DeviceID   string    `json:"device_id"`
    DeviceName string    `json:"device_name"`
    DeviceType string    `json:"device_type"`
    OSVersion  string    `json:"os_version"`
    LastActive time.Time `json:"last_active"`
}
```

### 13.2.2 调度服务接口

```go
// server/internal/service/dispatch/dispatch.go
package dispatch

import (
    "context"
)

// Service 调度服务接口
type Service interface {
    // GetBestNode 获取最优节点
    GetBestNode(ctx context.Context, req *DispatchRequest) (*NodeInfo, error)
    
    // GetNodeList 获取节点列表
    GetNodeList(ctx context.Context, req *NodeListRequest) (*NodeListResponse, error)
    
    // ReportQuality 上报链路质量
    ReportQuality(ctx context.Context, report *QualityReport) error
    
    // GetRoute 获取路由路径
    GetRoute(ctx context.Context, req *RouteRequest) (*RouteInfo, error)
    
    // SwitchNode 切换节点
    SwitchNode(ctx context.Context, sessionID string, newNodeID string) error
}

// DispatchRequest 调度请求
type DispatchRequest struct {
    UserID    uint64  `json:"user_id"`
    GameID    string  `json:"game_id"`
    ServerIP  string  `json:"server_ip"`
    UserIP    string  `json:"user_ip"`
    UserISP   string  `json:"user_isp"`
    UserCity  string  `json:"user_city"`
    Protocol  string  `json:"protocol"`
}

// NodeInfo 节点信息
type NodeInfo struct {
    NodeID      string  `json:"node_id"`
    Name        string  `json:"name"`
    IP          string  `json:"ip"`
    Port        int     `json:"port"`
    Region      string  `json:"region"`
    City        string  `json:"city"`
    ISP         string  `json:"isp"`
    Score       float64 `json:"score"`
    RTT         float64 `json:"rtt"`
    LossRate    float64 `json:"loss_rate"`
    LoadRate    float64 `json:"load_rate"`
    Protocol    string  `json:"protocol"`
}

// QualityReport 质量报告
type QualityReport struct {
    UserID    uint64  `json:"user_id"`
    SessionID string  `json:"session_id"`
    NodeID    string  `json:"node_id"`
    RTT       float64 `json:"rtt"`
    LossRate  float64 `json:"loss_rate"`
    Jitter    float64 `json:"jitter"`
    Timestamp int64   `json:"timestamp"`
}

// RouteInfo 路由信息
type RouteInfo struct {
    AccessNode  *NodeInfo   `json:"access_node"`
    RelayNodes  []*NodeInfo `json:"relay_nodes"`
    ExitNode    *NodeInfo   `json:"exit_node"`
    Protocol    string      `json:"protocol"`
    TotalRTT    float64     `json:"total_rtt"`
}
```

### 13.2.3 RPC定义

```protobuf
// proto/dispatch.proto
syntax = "proto3";

package dispatch;

option go_package = "github.com/accelerator/proto/dispatch";

// 调度服务
service DispatchService {
  // 获取最优节点
  rpc GetBestNode (DispatchRequest) returns (DispatchResponse);
  
  // 获取节点列表
  rpc GetNodeList (NodeListRequest) returns (NodeListResponse);
  
  // 上报质量
  rpc ReportQuality (QualityReport) returns (QualityReportResponse);
  
  // 获取路由
  rpc GetRoute (RouteRequest) returns (RouteResponse);
  
  // 切换节点
  rpc SwitchNode (SwitchNodeRequest) returns (SwitchNodeResponse);
}

message DispatchRequest {
  uint64 user_id = 1;
  string game_id = 2;
  string server_ip = 3;
  string user_ip = 4;
  string user_isp = 5;
  string user_city = 6;
  string protocol = 7;
}

message DispatchResponse {
  NodeInfo node = 1;
  repeated NodeInfo backup_nodes = 2;
  RouteInfo route = 3;
}

message NodeInfo {
  string node_id = 1;
  string name = 2;
  string ip = 3;
  int32 port = 4;
  string region = 5;
  string city = 6;
  string isp = 7;
  double score = 8;
  double rtt = 9;
  double loss_rate = 10;
  double load_rate = 11;
}

message RouteInfo {
  NodeInfo access_node = 1;
  repeated NodeInfo relay_nodes = 2;
  NodeInfo exit_node = 3;
  string protocol = 4;
  double total_rtt = 5;
}

message QualityReport {
  uint64 user_id = 1;
  string session_id = 2;
  string node_id = 3;
  double rtt = 4;
  double loss_rate = 5;
  double jitter = 6;
  int64 timestamp = 7;
}

message QualityReportResponse {
  bool success = 1;
}

message NodeListRequest {
  string region = 1;
  string game_id = 2;
  int32 page = 3;
  int32 page_size = 4;
}

message NodeListResponse {
  repeated NodeInfo nodes = 1;
  int32 total = 2;
}

message SwitchNodeRequest {
  string session_id = 1;
  string new_node_id = 2;
}

message SwitchNodeResponse {
  bool success = 1;
  NodeInfo new_node = 2;
}
```

## 13.3 消息队列设计

```
┌──────────────────────────────────────────────────────────────────┐
│                    Kafka Topic 设计                                │
├──────────────────────────────────────────────────────────────────┤
│                                                                  │
│  Topic列表：                                                     │
│  ┌────────────────────┬──────────┬──────────────────────────┐   │
│  │ Topic              │ 分区数   │ 说明                      │   │
│  ├────────────────────┼──────────┼──────────────────────────┤   │
│  │ user.events        │ 6        │ 用户事件（登录/注册等）   │   │
│  │ order.events       │ 6        │ 订单事件（创建/支付等）   │   │
│  │ session.events     │ 12       │ 会话事件（开始/结束等）   │   │
│  │ quality.reports    │ 12       │ 链路质量报告              │   │
│  │ node.events        │ 6        │ 节点事件（上线/下线等）   │   │
│  │ risk.events        │ 3        │ 风控事件                  │   │
│  │ log.events         │ 12       │ 日志事件                  │   │
│  └────────────────────┴──────────┴──────────────────────────┘   │
│                                                                  │
│  消息格式（JSON）：                                              │
│  {                                                               │
│    "event_id": "uuid",                                          │
│    "event_type": "user.login",                                  │
│    "timestamp": 1717651200,                                     │
│    "source": "user-service",                                    │
│    "data": { ... }                                              │
│  }                                                               │
│                                                                  │
│  消费者组：                                                      │
│  - user-service-group: 消费user.events                          │
│  - order-service-group: 消费order.events                        │
│  - monitor-group: 消费所有事件（监控用）                         │
│  - analytics-group: 消费所有事件（分析用）                       │
│                                                                  │
└──────────────────────────────────────────────────────────────────┘
```
