2026-04-25 01:18:30 +08:00

66 lines
2.5 KiB
Go
Raw 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.

// Package config 定义 im-service 的进程配置契约和 YAML 加载入口。
package config
import (
"time"
"hyapp/pkg/configx"
)
// Config 描述 im-service 启动所需的最小配置。
type Config struct {
// NodeID 标识当前 im-service 实例,写入 session 并透出到 health 响应便于定位节点。
NodeID string `yaml:"node_id"`
// HTTPAddr 是 HTTP health 与 WebSocket 的监听地址。
HTTPAddr string `yaml:"http_addr"`
// GRPCAddr 是 room-service 调用 RoomBridgeService 的内部 gRPC 监听地址。
GRPCAddr string `yaml:"grpc_addr"`
// JWTSecret 是 im-service 直接校验客户端 WS JWT 的 HS256 密钥。
JWTSecret string `yaml:"jwt_secret"`
// RoomHistoryLimit 控制每个房间保留的最近消息窗口大小。
RoomHistoryLimit int `yaml:"room_history_limit"`
// RoomServiceAddr 是发言权限和房间 presence 守卫查询的 room-service gRPC 地址。
RoomServiceAddr string `yaml:"room_service_addr"`
// ShutdownTimeout 是进程收到第一次退出信号后的总收敛预算。
ShutdownTimeout time.Duration `yaml:"shutdown_timeout"`
// HTTPDrainTimeout 是 HTTP listener 停止接新请求并等待普通 handler 返回的预算。
HTTPDrainTimeout time.Duration `yaml:"http_drain_timeout"`
// GRPCDrainTimeout 是内部 gRPC bridge 等待已进入 RPC 完成的预算。
GRPCDrainTimeout time.Duration `yaml:"grpc_drain_timeout"`
// WSDrainTimeout 是已有 WebSocket 收到 service_restart close 后自行断开的预算。
WSDrainTimeout time.Duration `yaml:"ws_drain_timeout"`
}
// Default 返回适合本地开发的默认配置。
func Default() Config {
// 默认端口遵守项目 13xxx 约束,避免重新引入 808x。
return Config{
NodeID: "im-node-local",
HTTPAddr: ":13002",
GRPCAddr: ":13003",
JWTSecret: "im-dev-secret",
RoomHistoryLimit: 200,
RoomServiceAddr: "127.0.0.1:13001",
ShutdownTimeout: 30 * time.Second,
HTTPDrainTimeout: 20 * time.Second,
GRPCDrainTimeout: 20 * time.Second,
WSDrainTimeout: 30 * time.Second,
}
}
// Load 从独立 config.yaml 读取 im-service 配置。
func Load(path string) (Config, error) {
cfg := Default()
if path == "" {
// 空路径代表显式使用默认值,便于单元测试和最小启动。
return cfg, nil
}
if err := configx.LoadYAML(path, &cfg); err != nil {
// 配置解析失败时返回空 Config避免调用方误用部分默认值继续启动。
return Config{}, err
}
return cfg, nil
}