// Command server 启动 sundynix-gateway —— 第 2 层业务网关 / 统一接入层。 package main import ( "context" "log" "os" "github.com/sundynix/sundynix-gateway/internal/nats" "github.com/sundynix/sundynix-gateway/internal/router" "github.com/sundynix/sundynix-gateway/internal/store" "github.com/sundynix/sundynix-shared/contract" ) func main() { natsURL := envOr("NATS_URL", "nats://localhost:4222") pgDSN := envOr("POSTGRES_DSN", "postgres://sundynix:sundynix@localhost:5432/sundynix?sslmode=disable") redisAddr := envOr("REDIS_ADDR", "localhost:6379") db := store.OpenPostgres(pgDSN) // MainDB: Users / Billing / DSL(连不上则降级) defer db.Close() cache := store.OpenRedis(redisAddr) // CacheDB: Session / Rate Limit(连不上则降级) defer cache.Close() bus := nats.MustConnect(natsURL) // 接入 NATS 零拷贝骨干网 + 声明任务流 defer bus.Close() // 配置控制面:响应 Dispatcher 对当前激活模型配置的请求。 if _, err := bus.ServeModelConfig(func() *contract.ModelConfig { row, _ := db.GetActiveModel(context.Background()) if row == nil { return nil } return &contract.ModelConfig{Provider: row.Provider, BaseURL: row.BaseURL, APIKey: row.APIKey, Model: row.Model} }); err != nil { log.Printf("[gateway] serve model config: %v", err) } r := router.New(db, cache, bus) addr := envOr("GATEWAY_ADDR", ":8080") log.Printf("[gateway] listening on %s", addr) if err := r.Run(addr); err != nil { log.Fatalf("[gateway] exit: %v", err) } } func envOr(key, def string) string { if v := os.Getenv(key); v != "" { return v } return def }