feat: 方案100%匹配 — RBAC动态权限+Grafana监控+目录库独立微服务+全国目录中心+标识同步
This commit is contained in:
@@ -12,6 +12,7 @@ import (
|
||||
"github.com/tcs-iptv/tcs/internal/config"
|
||||
"github.com/tcs-iptv/tcs/internal/httpx"
|
||||
"github.com/tcs-iptv/tcs/internal/macode"
|
||||
"github.com/tcs-iptv/tcs/internal/monitor"
|
||||
"github.com/tcs-iptv/tcs/internal/service"
|
||||
)
|
||||
|
||||
@@ -93,6 +94,14 @@ func main() {
|
||||
svc := service.New(ch, gen)
|
||||
h := api.NewHandler(svc)
|
||||
|
||||
// 用户/组织管理服务(系统管理模块)
|
||||
adminSvc := service.NewAdminService()
|
||||
adminH := api.NewAdminHandler(adminSvc)
|
||||
|
||||
// RBAC 动态权限矩阵(系统管理模块补足)
|
||||
rbac := httpx.NewRBACManager()
|
||||
rbacH := api.NewRBACHandler(rbac)
|
||||
|
||||
// 鉴权密钥库(MVP 预置四角色示例密钥;生产从 Vault/DB 加载)
|
||||
keys := httpx.NewMemoryKeyStore()
|
||||
keys.Add("ak-regulator", "sk-regulator", string(chain.RoleRegulator))
|
||||
@@ -103,8 +112,14 @@ func main() {
|
||||
r := gin.Default()
|
||||
httpx.Health(r, "api-svc")
|
||||
|
||||
// 运行监控:Prometheus 指标采集
|
||||
r.Use(monitor.Middleware())
|
||||
r.GET("/metrics", monitor.Handler())
|
||||
|
||||
v1 := r.Group("/api/v1", httpx.AuthMiddleware(keys))
|
||||
h.Register(v1)
|
||||
adminH.Register(v1)
|
||||
rbacH.Register(v1)
|
||||
|
||||
log.Printf("api-svc listening on %s", cfg.APIAddr)
|
||||
if err := r.Run(cfg.APIAddr); err != nil {
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
// catalog-svc 目录库独立微服务。
|
||||
//
|
||||
// 方案定位:目录库负责存储 MA、Hash、片库文件 ID、省内内容编码等映射关系,
|
||||
// 为标识查询接口提供统一入口。本服务可独立部署,也可嵌入 api-svc 使用。
|
||||
//
|
||||
// 部署模式:
|
||||
// - 嵌入模式:通过 api.NewCatalogHandler 挂载到 api-svc 路由组
|
||||
// - 独立模式:运行 catalog-svc,监听独立端口(默认 :8083)
|
||||
//
|
||||
// 环境变量:
|
||||
// - TCS_CATALOG_ADDR:监听地址(默认 :8083)
|
||||
// - TCS_CHAIN_BACKEND:链后端(memory/pg/chainmaker)
|
||||
// - TCS_POSTGRES_DSN:PostgreSQL 连接串
|
||||
package main
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"log"
|
||||
|
||||
_ "github.com/lib/pq"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/tcs-iptv/tcs/internal/api"
|
||||
"github.com/tcs-iptv/tcs/internal/catalog"
|
||||
"github.com/tcs-iptv/tcs/internal/chain"
|
||||
"github.com/tcs-iptv/tcs/internal/config"
|
||||
"github.com/tcs-iptv/tcs/internal/httpx"
|
||||
"github.com/tcs-iptv/tcs/internal/monitor"
|
||||
)
|
||||
|
||||
// openDB 尝试连接 PostgreSQL。
|
||||
func openDB(dsn string) *sql.DB {
|
||||
db, err := sql.Open("postgres", dsn)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
if err := db.Ping(); err != nil {
|
||||
return nil
|
||||
}
|
||||
return db
|
||||
}
|
||||
|
||||
// newChain 按配置选择链后端(与 api-svc 相同逻辑)。
|
||||
func newChain(backend, sdkConf string, db *sql.DB) chain.Client {
|
||||
switch backend {
|
||||
case "chainmaker":
|
||||
cm, err := chain.NewChainMakerClient(sdkConf, db)
|
||||
if err == nil {
|
||||
return cm
|
||||
}
|
||||
log.Printf("catalog-svc: ChainMaker 后端不可用(%v),降级", err)
|
||||
fallthrough
|
||||
case "pg":
|
||||
if db != nil {
|
||||
if pc, err := chain.NewPersistentChain(db); err == nil {
|
||||
return pc
|
||||
}
|
||||
}
|
||||
fallthrough
|
||||
default:
|
||||
log.Printf("catalog-svc: 使用内存链(仅开发用)")
|
||||
return chain.NewMemoryChain()
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
cfg := config.Load()
|
||||
catalogAddr := cfg.CatalogAddr
|
||||
|
||||
// 装配链后端
|
||||
db := openDB(cfg.PostgresDSN)
|
||||
ch := newChain(cfg.ChainBackend, cfg.ChainMakerSDKConf, db)
|
||||
|
||||
// 创建目录库服务
|
||||
cat := catalog.New(ch)
|
||||
|
||||
// 鉴权密钥库(与 api-svc 共享配置)
|
||||
keys := httpx.NewMemoryKeyStore()
|
||||
keys.Add("ak-regulator", "sk-regulator", string(chain.RoleRegulator))
|
||||
keys.Add("ak-reviewer", "sk-reviewer", string(chain.RoleReviewer))
|
||||
keys.Add("ak-cp", "sk-cp", string(chain.RoleCP))
|
||||
keys.Add("ak-operator", "sk-operator", string(chain.RoleOperator))
|
||||
|
||||
r := gin.Default()
|
||||
httpx.Health(r, "catalog-svc")
|
||||
|
||||
// 运行监控
|
||||
r.Use(monitor.Middleware())
|
||||
r.GET("/metrics", monitor.Handler())
|
||||
|
||||
// 目录库查询路由(受鉴权保护)
|
||||
v1 := r.Group("/api/v1", httpx.AuthMiddleware(keys))
|
||||
catH := api.NewCatalogHandler(cat)
|
||||
catH.Register(v1)
|
||||
|
||||
log.Printf("catalog-svc listening on %s", catalogAddr)
|
||||
if err := r.Run(catalogAddr); err != nil {
|
||||
log.Fatalf("catalog-svc failed: %v", err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user