架构设计
本文档介绍 DNS-Go 的系统架构设计,帮助开发者理解系统的整体结构和各模块之间的关系。
系统架构图
┌─────────────────────────────────────────────────────────────────────────────┐
│ 客户端层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ Web 浏览器 │ │ DNS 客户端 │ │ API 客户端 │ │ 监控/告警系统 │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ └──────────┬──────────┘ │
└─────────┼────────────────┼────────────────┼────────────────────┼────────────┘
│ │ │ │
│ HTTP 8085 │ UDP/TCP 53 │ HTTP 8085 │ HTTP 8085
│ │ │ │
┌─────────┼────────────────┼────────────────┼────────────────────┼────────────┐
│ │ DNS-Go 服务层 │ │
│ ┌──────┴────────────────┴────────────────┴────────────────────┐ │ │
│ │ HTTP 路由层 (Gin) │ │ │
│ └──────────────────────────────────────────────────────────────┘ │ │
│ │ │ │ │ │
│ ┌──────┴──────┐ ┌──────┴──────┐ ┌──────┴──────┐ ┌────────┴─────┐ │
│ │ Web 服务 │ │ DNS 服务 │ │ API 服务 │ │ 监控服务 │ │
│ │ (静态资源) │ │ (UDP/TCP) │ │ (RESTful) │ │ (Metrics) │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ └─────────────┘ │
│ │ │ │ │
│ ┌──────┴────────────────┴────────────────────┴──────────────────────┐ │
│ │ 业务逻辑层 │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ 域名管理 │ │ 记录管理 │ │ 上游管理 │ │ 日志管理 │ │ 用户管理 │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ 策略管理 │ │ 健康检查 │ │ 缓存管理 │ │ 系统监控 │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │ │ │ │
│ ┌──────┴────────────────┴────────────────────┴──────────────────────┐ │
│ │ 数据访问层 (Repository) │ │
│ └───────────────────────────────────────────────────────────────────┘ │
└─────────┼────────────────┼────────────────────┼───────────────────────────┘
│ │ │
┌─────────┼────────────────┼────────────────────┼───────────────────────────┐
│ │ 数据存储层 │
│ ┌──────┴──────┐ ┌──────┴──────┐ ┌──────┴──────┐ │
│ │ PostgreSQL │ │ MySQL │ │ SQLite │ │
│ │ (推荐) │ │ │ │ (嵌入式) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ 缓存层 │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Valkey │ │ Redis │ │ Memory │ │ │
│ │ │ (推荐) │ │ │ │ (内置) │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────────────────────┘模块说明
1. 接入层
Web 服务
- 提供静态资源服务(前端界面)
- 基于 Go 的 embed 功能嵌入前端构建产物
- 单二进制文件部署,无需额外 Nginx
DNS 服务
- 基于 miekg/dns 库实现
- 支持 UDP 和 TCP 协议
- 支持标准 DNS 查询类型
- 并发处理 DNS 请求
API 服务
- RESTful API 设计
- 基于 Gin 框架
- Swagger 文档自动生成
- JWT 认证
2. 业务逻辑层
域名管理模块
- 域名的增删改查
- 域名分组和标签
- 批量导入导出
解析记录模块
- 多种 DNS 记录类型支持
- 记录分组管理
- TTL 配置
上游管理模块
- 上游 DNS 服务器管理
- 多种负载均衡策略
- 健康检查集成
策略模块
- 轮询策略
- 权重策略
- 故障转移策略
- 最快响应策略
健康检查模块
- ICMP Ping 检测
- DNS 查询检测
- TCP 端口检测
- 自动故障切换
日志模块
- DNS 查询日志记录
- 操作日志记录
- 日志查询和筛选
用户管理模块
- 用户注册登录
- 角色权限管理
- JWT 认证
监控模块
- 系统资源监控
- DNS 性能监控
- 统计报表
3. 数据访问层
基于 GORM 实现的 Repository 模式:
go
// 通用接口定义
type Repository[T any] interface {
Create(entity *T) error
Update(entity *T) error
Delete(id uint) error
GetByID(id uint) (*T, error)
List(query Query) ([]T, int64, error)
}4. 数据存储层
数据库支持
| 数据库 | 驱动 | 适用场景 |
|---|---|---|
| PostgreSQL | pgx | 生产环境,推荐 |
| MySQL | go-sql-driver | 已有 MySQL 环境 |
| SQLite | mattn/go-sqlite3 | 开发测试,轻量级部署 |
缓存支持
| 缓存 | 驱动 | 适用场景 |
|---|---|---|
| Valkey | valkey-go | 生产环境,推荐 |
| Redis | go-redis | 已有 Redis 环境 |
| Memory | 内置 | 开发测试,单节点部署 |
核心流程
DNS 查询处理流程
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ 客户端 │────▶│ DNS 服务 │────▶│ 缓存检查 │────▶│ 命中返回 │
└──────────┘ └──────────┘ └────┬─────┘ └──────────┘
│ 未命中
▼
┌──────────────────┐
│ 本地记录匹配 │
└────┬─────────────┘
│
┌──────────────┼──────────────┐
│ 匹配成功 │ │ 匹配失败
▼ │ ▼
┌──────────┐ │ ┌──────────────┐
│ 返回记录 │ │ │ 上游查询 │
└──────────┘ │ └──────┬───────┘
│ │
│ ▼
│ ┌──────────────┐
│ │ 策略选择 │
│ └──────┬───────┘
│ │
│ ▼
│ ┌──────────────┐
│ │ 健康检查 │
│ └──────┬───────┘
│ │
│ ▼
│ ┌──────────────┐
│ │ 向上游查询 │
│ └──────┬───────┘
│ │
└────────────┘
│
▼
┌──────────┐
│ 缓存结果 │
└────┬─────┘
│
▼
┌──────────┐
│ 返回客户端 │
└──────────┘上游策略选择流程
┌──────────┐
│ 策略配置 │
└────┬─────┘
│
▼
┌──────────┐ ┌──────────┐
│ 轮询策略 │────▶│ 顺序选择 │
└──────────┘ └──────────┘
┌──────────┐ ┌──────────┐
│ 权重策略 │────▶│ 加权随机 │
└──────────┘ └──────────┘
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 故障转移 │────▶│ 主节点检查 │────▶│ 主可用? │
└──────────┘ └──────────┘ └────┬─────┘
│
┌────────────┼────────────┐
│ 是 │ │ 否
▼ │ ▼
┌──────────┐ │ ┌──────────┐
│ 使用主节点 │ │ │ 使用备节点 │
└──────────┘ │ └──────────┘
│
┌────────┴────────┐
│ 返回选中节点 │
└─────────────────┘技术选型
后端技术栈
| 技术 | 用途 | 版本 |
|---|---|---|
| Go | 编程语言 | 1.24+ |
| Gin | Web 框架 | v1.10+ |
| GORM | ORM 框架 | v1.30+ |
| miekg/dns | DNS 库 | v1.1+ |
| JWT | 认证 | v5+ |
| Zap | 日志 | v1.27+ |
| Swagger | API 文档 | v1.16+ |
前端技术栈
| 技术 | 用途 | 版本 |
|---|---|---|
| Vue 3 | 框架 | 3.4+ |
| Element Plus | UI 组件库 | 2.5+ |
| TypeScript | 类型系统 | 5.0+ |
| Vite | 构建工具 | 5.0+ |
| Pinia | 状态管理 | 2.1+ |
| Vue Router | 路由 | 4.2+ |
数据库和缓存
| 技术 | 用途 |
|---|---|
| PostgreSQL | 主数据库 |
| Valkey | 分布式缓存 |
| SQLite | 嵌入式数据库 |
扩展性设计
水平扩展
- 无状态设计,支持多实例部署
- 共享数据库和缓存
- 负载均衡器分发请求
插件机制(计划中)
- 自定义解析插件
- 自定义策略插件
- 自定义日志处理器
安全设计
- JWT 认证,支持 Token 刷新
- 密码 bcrypt 加密存储
- SQL 注入防护(GORM 参数化查询)
- XSS 防护(前端转义)
- CSRF 防护
- 速率限制