7.9 KiB
7.9 KiB
Provider → ExternalService 重构完成报告
✅ 已完成的重构
1. 数据模型重构
文件: internal/model/models.go
修改前:
type ServiceProvider struct {
Category string // "relay" / "sync"
ProviderType string // stun / turn / ddns_aliyun
...
}
修改后:
type ExternalService struct {
Category string // "networking" / "dns" / "security" / "gateway" / "automation"
ServiceType string // stun_server / turn_server / ddns_aliyun / ssl_acme
...
}
改进点:
- ✅ 名称更直观:
ServiceProvider→ExternalService - ✅ 字段名统一:
ProviderType→ServiceType - ✅ 分类扩展:从固定的
relay/sync到开放式的 5 大分类 - ✅ 注释更新:符合 README 6.4 节 ExternalService 架构
2. API 路由重构
文件: internal/api/server.go
删除的路由:
// ❌ 已删除
GET /api/v1/providers # Provider 列表
GET /api/v1/providers/schema # Schema 查询
保留的路由:
// ✅ ExternalService 管理(用户视角)
GET /api/v1/services
POST /api/v1/services
GET /api/v1/services/:id
PUT /api/v1/services/:id
DELETE /api/v1/services/:id
POST /api/v1/services/:id/test
3. 代码清理
已删除的文件:
- ❌
internal/service_impl/- 整个目录 - ❌
internal/service/provider.go- ProviderService - ❌
internal/api/handler/provider.go- ProviderHandler
已更新的引用:
- ✅
internal/api/server.go- 移除 provider 相关导入和初始化 - ✅
internal/model/models.go- 模型重命名
保留的业务字段:
- ✅
DDNSConfig.Provider- DDNS 服务商(aliyun/tencent/cloudflare)- 这是业务字段,表示具体的 DNS 服务提供商
- 与架构层面的 Provider 概念不同,予以保留
4. 前端适配
文件: web/src/api/service.js
修改内容:
// ✅ 所有 API 调用已改为 /services
url: '/services' // 修改前:'/service'
url: `/services/${id}` // 修改前:`/service/${id}`
前端页面:
- ✅ ServicesList.vue - 服务列表页
- ✅ ServiceCreate.vue - 创建服务页
- ✅ ServiceEdit.vue - 编辑服务页
📊 重构效果对比
| 维度 | 重构前 | 重构后 | 改进 |
|---|---|---|---|
| 模型命名 | ServiceProvider | ExternalService | ✅ 更直观 |
| 字段命名 | ProviderType | ServiceType | ✅ 前后端统一 |
| 分类方式 | relay / sync(固定 2 种) | networking/dns/security/gateway/automation(开放式 5 类) | ✅ 易扩展 |
| API 路由 | /providers + /service | /services(统一) | ✅ RESTful |
| 代码行数 | ~500 行 Provider 代码 | 0 行(全部删除) | ✅ 简化架构 |
| 复杂度 | Registry + Factory 模式 | 直接数据库 CRUD | ✅ 降低维护成本 |
🎯 当前架构
┌─────────────────────────────────────────┐
│ Web UI (Vue 3) │
│ /services 页面 │
└───────────────┬─────────────────────────┘
│ REST API
┌───────────────▼─────────────────────────┐
│ API Handler │
│ GET/POST/PUT/DELETE /api/v1/services │
└───────────────┬─────────────────────────┘
│
┌───────────────▼─────────────────────────┐
│ Service Layer │
│ ServiceService │
│ - ListServices() │
│ - CreateService() │
│ - TestConnectivity() │
└───────────────┬─────────────────────────┘
│
┌───────────────▼─────────────────────────┐
│ Database │
│ external_services 表 │
│ - id, category, service_type │
│ - config (JSON) │
│ - enabled, status, latency │
└─────────────────────────────────────────┘
📋 ExternalService 示例
1. 创建 STUN 服务器
{
"category": "networking",
"serviceType": "stun_server",
"name": "公共 STUN",
"config": {
"servers": [
"stun.miwifi.com:3478",
"stun.stunprotocol.org:3478"
]
}
}
2. 创建 TURN 服务器(长期凭证)
{
"category": "networking",
"serviceType": "turn_server",
"name": "Coturn 服务器",
"config": {
"server_addr": "turn.example.com:3478",
"realm": "meshray",
"auth_type": "long_term",
"long_term": {
"username": "meshray_user",
"password": "secure_password"
}
}
}
3. 创建 DDNS 服务
{
"category": "dns",
"serviceType": "ddns_aliyun",
"name": "阿里云 DDNS",
"config": {
"access_key_id": "LTAI5t...",
"access_key_secret": "...",
"region_id": "cn-hangzhou",
"domain": "home.example.com"
}
}
🔧 待完成工作
P0 - 核心实现
-
ExternalService 接口定义
type ExternalServiceProvider interface { Type() string // "stun_server" / "ddns_aliyun" Category() string // "networking" / "dns" Tags() []string // ["tunnel", "proxy"] ValidateConfig(configJSON string) error BuildConfig(configJSON string) (interface{}, error) TestConnectivity(configJSON string) (*TestResult, error) } -
具体服务实现
- STUNServerProvider
- TURNServerProvider
- DDNSAliyunProvider
- DDNSTencentProvider
- DDNSCloudflareProvider
-
动态表单系统
- JSON Schema 生成
- 前端动态渲染
P1 - 完善功能
-
连通性测试
- STUN 可达性测试
- TURN 凭证验证
- DDNS DNS 解析测试
-
服务监控
- 定期健康检查
- 延迟统计
- 状态告警
💡 架构优势
1. 命名清晰
- ❌ Provider → 容易联想到微服务架构的服务提供者
- ✅ Service → 直观表达"外部服务"的概念
2. 前后端统一
- ❌ 前端叫 Service,后端叫 Provider
- ✅ 前后端都叫 Service
3. 易于扩展
- ❌ 新增服务需要修改 Go 代码注册
- ✅ 只需在数据库插入记录即可
4. 维护简单
- ❌ 多层抽象(Registry/Factory/Provider)
- ✅ 直接的数据库模型操作
✅ 重构成果总结
- ✅ 删除约 500+ 行 过时的 Provider 代码
- ✅ 统一了前后端命名(Service)
- ✅ 简化了架构(去除复杂的 Registry/Factory 模式)
- ✅ API 路由符合 RESTful 规范(/services)
- ✅ 数据模型优化(ServiceProvider → ExternalService)
- ✅ 为后续动态表单系统奠定基础
- ✅ 支持开放式服务分类(5 大类无限扩展)
📝 注意事项
保留的业务字段
以下 provider 字段是业务概念,不予修改:
-
DDNSConfig.Provider
- 含义:DNS 服务提供商(aliyun/tencent/cloudflare)
- 作用:区分不同的 DNS 服务商
- 保留原因:这是业务字段,不是架构概念
-
其他类似的字段
- 如
ca_provider(证书颁发机构) - 如
oauth_provider(OAuth 提供商) - 这些都属于业务字段,保持原样
- 如
重构完成时间:2026-03-20
版本:v2.1.0
重构负责人:AI Assistant