578 lines
20 KiB
Markdown
578 lines
20 KiB
Markdown
# 第十三部分:源码级设计
|
|
|
|
## 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: 消费所有事件(分析用) │
|
|
│ │
|
|
└──────────────────────────────────────────────────────────────────┘
|
|
```
|