Files
sub2api/backend/internal/plugin/host.go
T
shaw 8ba2fbd786 feat(plugin): Phase-1/1.5 进程内插件内核 + 开发套件后端
Caddy 式进程内模块系统(详见 docs/plugin-architecture/MODULE-AUTHOR-GUIDE.md):
- internal/plugin:命名空间注册表(init 注册/重复 panic)、Provision→Validate→Start→Stop
  生命周期(Start 半途逆序回滚、Stop 逆序+ctx deadline)、Host 四项 ports 能力面、
  modules: 配置子树(enabled 三态;viper 含点 key 手工提取)、Runtime 状态机
- internal/plugin/plugintest:模块测试夹具(NewHost Options + RunLifecycle)
- internal/modules:standard/imports.go 唯一插装清单 + job.hello 示例模块(默认 disabled)
- Wire/main 接入:Build+Start 失败 fail-fast(显式 Cleanup 防 leader 锁泄漏)、
  runtime.Stop 在 cleanup 并行组首位(先于 Redis/Ent)
- admin 可观测:GET /api/v1/admin/modules(只读,错误文本脱敏)
- 默认配置零行为变更(Phase-0 安全网 + bench allocs 零漂移验证)

含两轮对抗式审计修复(1×P1 启动失败泄漏 leader 锁 + 11×P2)与回归测试。
2026-06-11 22:58:51 +08:00

35 lines
1.3 KiB
Go

package plugin
import (
"github.com/redis/go-redis/v9"
"go.uber.org/zap"
ent "github.com/Wei-Shaw/sub2api/ent"
)
// Host 是模块可使用的宿主能力面(纯数据结构,由宿主装配后注入 Provision)。
//
// 边界纪律:Host 只暴露 ports 级基础能力,禁止暴露任何具体 Service;
// 本阶段仅 Logger / ConfigOf / DB / Redis 四项,后续每新增一项
// 必须在插件化 ROADMAP 决策记录中登记,防止 Host 膨胀为上帝对象。
type Host struct {
// Logger 是宿主提供的结构化日志器。模块应通过它输出日志,
// 而不是自建全局 logger。
Logger *zap.Logger
// ConfigOf 将 `modules:` 配置子树中 id 对应的 raw 私有配置解码到 out
// (out 必须是指向模块自定义配置 struct 的指针)。
// 模块未配置时不修改 out(模块应自带默认值);解码类型错误时返回错误。
//
// 该字段通常由宿主装配为 Config.Of;若装配时留空,
// NewRuntime 会默认绑定到 Runtime 自身持有的 Config。
ConfigOf func(id ModuleID, out any) error
// DB 是 Ent ORM 客户端(数据库访问能力)。
DB *ent.Client
// Redis 是 go-redis 客户端(缓存/队列能力)。
// 使用 UniversalClient 接口以兼容单机与集群部署形态。
Redis redis.UniversalClient
}