66 lines
2.5 KiB
Go
66 lines
2.5 KiB
Go
// 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
|
||
}
|