Skip to content

架构设计

本文档介绍 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. 数据存储层

数据库支持

数据库驱动适用场景
PostgreSQLpgx生产环境,推荐
MySQLgo-sql-driver已有 MySQL 环境
SQLitemattn/go-sqlite3开发测试,轻量级部署

缓存支持

缓存驱动适用场景
Valkeyvalkey-go生产环境,推荐
Redisgo-redis已有 Redis 环境
Memory内置开发测试,单节点部署

核心流程

DNS 查询处理流程

┌──────────┐     ┌──────────┐     ┌──────────┐     ┌──────────┐
│  客户端   │────▶│ DNS 服务  │────▶│ 缓存检查  │────▶│ 命中返回  │
└──────────┘     └──────────┘     └────┬─────┘     └──────────┘
                                        │ 未命中

                              ┌──────────────────┐
                              │   本地记录匹配    │
                              └────┬─────────────┘

                    ┌──────────────┼──────────────┐
                    │ 匹配成功      │              │ 匹配失败
                    ▼              │              ▼
            ┌──────────┐          │      ┌──────────────┐
            │ 返回记录  │          │      │  上游查询    │
            └──────────┘          │      └──────┬───────┘
                                  │             │
                                  │             ▼
                                  │     ┌──────────────┐
                                  │     │  策略选择    │
                                  │     └──────┬───────┘
                                  │            │
                                  │            ▼
                                  │     ┌──────────────┐
                                  │     │  健康检查    │
                                  │     └──────┬───────┘
                                  │            │
                                  │            ▼
                                  │     ┌──────────────┐
                                  │     │  向上游查询  │
                                  │     └──────┬───────┘
                                  │            │
                                  └────────────┘


                                        ┌──────────┐
                                        │ 缓存结果  │
                                        └────┬─────┘


                                        ┌──────────┐
                                        │ 返回客户端 │
                                        └──────────┘

上游策略选择流程

┌──────────┐
│ 策略配置  │
└────┬─────┘


┌──────────┐     ┌──────────┐
│ 轮询策略  │────▶│ 顺序选择  │
└──────────┘     └──────────┘

┌──────────┐     ┌──────────┐
│ 权重策略  │────▶│ 加权随机  │
└──────────┘     └──────────┘

┌──────────┐     ┌──────────┐     ┌──────────┐
│ 故障转移  │────▶│ 主节点检查 │────▶│ 主可用?  │
└──────────┘     └──────────┘     └────┬─────┘

                          ┌────────────┼────────────┐
                          │ 是          │            │ 否
                          ▼             │            ▼
                   ┌──────────┐        │     ┌──────────┐
                   │ 使用主节点 │        │     │ 使用备节点 │
                   └──────────┘        │     └──────────┘

                              ┌────────┴────────┐
                              │  返回选中节点   │
                              └─────────────────┘

技术选型

后端技术栈

技术用途版本
Go编程语言1.24+
GinWeb 框架v1.10+
GORMORM 框架v1.30+
miekg/dnsDNS 库v1.1+
JWT认证v5+
Zap日志v1.27+
SwaggerAPI 文档v1.16+

前端技术栈

技术用途版本
Vue 3框架3.4+
Element PlusUI 组件库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 防护
  • 速率限制

基于 MIT 许可发布