Files
Meshray-Manager/docs/Provider 重构完成报告.md
2026-06-30 15:14:37 +08:00

7.9 KiB
Raw Permalink Blame History

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
    ...
}

改进点:

  • 名称更直观:ServiceProviderExternalService
  • 字段名统一:ProviderTypeServiceType
  • 分类扩展:从固定的 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 - 核心实现

  1. 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)
    }
    
  2. 具体服务实现

    • STUNServerProvider
    • TURNServerProvider
    • DDNSAliyunProvider
    • DDNSTencentProvider
    • DDNSCloudflareProvider
  3. 动态表单系统

    • JSON Schema 生成
    • 前端动态渲染

P1 - 完善功能

  1. 连通性测试

    • STUN 可达性测试
    • TURN 凭证验证
    • DDNS DNS 解析测试
  2. 服务监控

    • 定期健康检查
    • 延迟统计
    • 状态告警

💡 架构优势

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 字段是业务概念,不予修改

  1. DDNSConfig.Provider

    • 含义:DNS 服务提供商(aliyun/tencent/cloudflare
    • 作用:区分不同的 DNS 服务商
    • 保留原因:这是业务字段,不是架构概念
  2. 其他类似的字段

    • ca_provider(证书颁发机构)
    • oauth_providerOAuth 提供商)
    • 这些都属于业务字段,保持原样

重构完成时间:2026-03-20
版本:v2.1.0
重构负责人:AI Assistant