Files

101 lines
2.7 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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_DSNPostgreSQL 连接串
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)
}
}