e5fa0ae36c
第 2 层网关持久层落地,遵守 sundynix_ 表名前缀 + AutoMigrate 约定。 - store: GORM(NamingStrategy 前缀 sundynix_/单数) → User=sundynix_user, Task=sundynix_task 启动 AutoMigrate;go-redis/v9 滑动窗口限流(Incr+Expire,按 IP) - 优雅降级:连不上库则 warn 继续(不 fatal),保证无 Docker 的 make demo 仍跑通 - handler: SubmitTask 持久化任务(best-effort),Billing 真实读库返回 tasks_submitted - main: OpenPostgres/OpenRedis 读 POSTGRES_DSN/REDIS_ADDR 环境变量 - 验证: 4 模块 build ✓;e2e 3 测试 PASS;live 双路径(真实库持久化 + 坏DSN降级)实测通过 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
39 lines
1.1 KiB
Go
39 lines
1.1 KiB
Go
// Command server 启动 sundynix-gateway —— 第 2 层业务网关 / 统一接入层。
|
|
package main
|
|
|
|
import (
|
|
"log"
|
|
"os"
|
|
|
|
"github.com/sundynix/sundynix-gateway/internal/nats"
|
|
"github.com/sundynix/sundynix-gateway/internal/router"
|
|
"github.com/sundynix/sundynix-gateway/internal/store"
|
|
)
|
|
|
|
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()
|
|
|
|
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
|
|
}
|