2026-04-27 02:29:42 +08:00

106 lines
3.7 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 定义 user-service 的启动配置和 YAML 加载入口。
package config
import "hyapp/pkg/configx"
// Config 描述 user-service 启动配置。
type Config struct {
// ServiceName 是进程服务名,当前主要用于配置可读性。
ServiceName string `yaml:"service_name"`
// NodeID 是当前服务节点标识,预留给日志和后续健康响应使用。
NodeID string `yaml:"node_id"`
// GRPCAddr 是 user-service 内部 gRPC 监听地址。
GRPCAddr string `yaml:"grpc_addr"`
// MySQLDSN 非空时启用 MySQL repository空值只允许本地和测试走 memory repository。
MySQLDSN string `yaml:"mysql_dsn"`
// MySQLAutoMigrate 是配置占位,当前 app.New 尚未执行自动迁移。
MySQLAutoMigrate bool `yaml:"mysql_auto_migrate"`
// IDGenerator 控制 user_id 发号节点。
IDGenerator IDGeneratorConfig `yaml:"id_generator"`
// DisplayUserID 控制短号分配重试和默认短号修改冷却期。
DisplayUserID DisplayUserIDConfig `yaml:"display_user_id"`
// ThirdParty 控制本地三方登录 provider allowlist。
ThirdParty ThirdPartyConfig `yaml:"third_party"`
// JWT 控制 access token 和 refresh session 的签发参数。
JWT JWTConfig `yaml:"jwt"`
}
// IDGeneratorConfig 保存 user_id 发号节点配置。
type IDGeneratorConfig struct {
// NodeID 参与雪花 ID 发号,多个 user-service 节点必须不同。
NodeID int64 `yaml:"node_id"`
}
// DisplayUserIDConfig 保存短号分配和修改策略。
type DisplayUserIDConfig struct {
// AllocateMaxAttempts 是默认短号冲突时的最大重试次数。
AllocateMaxAttempts int `yaml:"allocate_max_attempts"`
// ChangeCooldownSec 是默认短号修改冷却期秒数。
ChangeCooldownSec int64 `yaml:"change_cooldown_sec"`
}
// ThirdPartyConfig 保存三方登录 provider allowlist。
type ThirdPartyConfig struct {
// AllowedProviders 是本地 verifier 接受的 provider 列表。
AllowedProviders []string `yaml:"allowed_providers"`
}
// JWTConfig 保存 access token 和 refresh token 的签发策略。
type JWTConfig struct {
// Issuer 写入 access token iss claim。
Issuer string `yaml:"issuer"`
// AccessTokenTTLSec 是短期 access token 有效期。
AccessTokenTTLSec int64 `yaml:"access_token_ttl_sec"`
// RefreshTokenTTLSec 是服务端 session/refresh token 有效期。
RefreshTokenTTLSec int64 `yaml:"refresh_token_ttl_sec"`
// SigningAlg 当前只支持 HS256。
SigningAlg string `yaml:"signing_alg"`
// SigningSecret 是 HS256 签名密钥,生产不能使用默认开发值。
SigningSecret string `yaml:"signing_secret"`
}
// Default 返回本地默认配置。
func Default() Config {
// 默认端口遵守项目 13xxx 约束MySQLDSN 为空表示默认本地 memory 模式。
return Config{
ServiceName: "user-service",
NodeID: "user-local",
GRPCAddr: ":13005",
MySQLDSN: "",
MySQLAutoMigrate: false,
IDGenerator: IDGeneratorConfig{
NodeID: 1,
},
DisplayUserID: DisplayUserIDConfig{
AllocateMaxAttempts: 8,
ChangeCooldownSec: 2592000,
},
ThirdParty: ThirdPartyConfig{
AllowedProviders: []string{"wechat"},
},
JWT: JWTConfig{
Issuer: "hyapp",
AccessTokenTTLSec: 1800,
RefreshTokenTTLSec: 2592000,
SigningAlg: "HS256",
SigningSecret: "dev-shared-secret",
},
}
}
// Load 从独立 config.yaml 读取 user-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
}