logo
0
0
WeChat Login
更新配置管理模块,添加配置验证器系统,支持多种验证规则和动态验证器管理。优化文档添加新特性说明。

Sysconf 验证器系统使用指南

Go Version MIT License

Sysconf 验证器系统 是一个企业级的配置验证框架,提供30+种内置验证规则、预定义验证器和灵活的自定义验证机制,确保配置数据的正确性和安全性。

🎯 核心特性

✨ 验证器类型

  • 🔧 预定义验证器: 针对常见场景的即用型验证器
  • 📝 规则验证器: 基于规则引擎的灵活验证
  • 🔗 复合验证器: 组合多个验证器的强大验证
  • ⚡ 函数式验证器: 支持自定义验证逻辑

🛡️ 验证规则

  • 📊 数据类型: string, number, boolean, array, object
  • 🌐 网络相关: email, url, ipv4, ipv6, hostname, port
  • 📐 数值范围: range, min, max, length
  • 🔒 格式验证: uuid, json, base64, regex, alphanum
  • 📅 时间相关: datetime, timezone
  • 💳 业务规则: creditcard, phonenumber
  • 🎚️ 枚举验证: enum, oneof

🚀 高级功能

  • 动态验证器管理: 运行时添加/移除验证器
  • 嵌套配置验证: 支持深层次配置结构验证
  • 错误聚合: 收集并报告所有验证错误
  • 性能优化: 高效的验证执行引擎

📦 快速开始

基础使用

package main import ( "log" "github.com/darkit/sysconf" "github.com/darkit/sysconf/validation" ) func main() { // 创建配置实例,集成验证器 cfg, err := sysconf.New( sysconf.WithPath("configs"), sysconf.WithName("app"), sysconf.WithMode("yaml"), // 🆕 添加预定义验证器 sysconf.WithValidators( validation.NewDatabaseValidator(), // 数据库配置验证 validation.NewWebServerValidator(), // Web服务器配置验证 validation.NewRedisValidator(), // Redis配置验证 ), ) if err != nil { log.Fatal("创建配置失败:", err) } // 配置值会自动进行验证 cfg.Set("server.port", 8080) // ✅ 有效端口 cfg.Set("server.port", 70000) // ❌ 被验证器拦截 cfg.Set("database.host", "localhost") // ✅ 有效主机名 }

🔧 预定义验证器

1. 数据库验证器 (DatabaseValidator)

验证数据库连接相关的配置项:

validator := validation.NewDatabaseValidator() // 验证的配置项: // - database.host : 主机名验证 // - database.port : 端口范围验证 (1-65535) // - database.username : 必填用户名 // - database.password : 必填密码 // - database.type : 数据库类型 (mysql,postgresql,sqlite,mongodb) // - database.database : 数据库名称 // - database.max_conns : 连接数范围 (1-100) // - database.timeout : 超时设置验证

示例配置:

database: host: "localhost" # hostname验证 port: 5432 # port验证 (1-65535) username: "postgres" # required验证 password: "secret123" # required验证 database: "myapp" # required验证 type: "postgresql" # enum验证 max_conns: 10 # range验证 (1-100) timeout: "30s" # 超时格式验证

2. Web服务器验证器 (WebServerValidator)

验证Web服务器相关配置:

validator := validation.NewWebServerValidator() // 验证的配置项: // - server.host : 主机名验证 // - server.port : 端口范围验证 // - server.mode : 运行模式 (development,production,testing) // - server.timeout : 超时设置验证 // - server.ssl.* : SSL配置验证

示例配置:

server: host: "0.0.0.0" # hostname验证 port: 8080 # port验证 mode: "production" # enum验证 timeout: "30s" # 超时验证 ssl: enabled: true # boolean验证 cert_file: "/path/to/cert.pem" # required验证 key_file: "/path/to/key.pem" # required验证

3. Redis验证器 (RedisValidator)

验证Redis缓存配置:

validator := validation.NewRedisValidator() // 验证的配置项: // - redis.host : 主机名验证 // - redis.port : 端口验证 // - redis.db : 数据库索引 (0-15) // - redis.password : 密码验证(可选) // - redis.addresses : 地址列表验证 // - redis.timeout : 超时验证

4. 日志验证器 (LogValidator)

验证日志配置:

validator := validation.NewLogValidator() // 验证的配置项: // - logging.level : 日志级别 (debug,info,warn,error,fatal) // - logging.format : 日志格式 (json,text) // - logging.path : 日志路径验证

5. 邮件验证器 (EmailValidator)

验证邮件发送配置:

validator := validation.NewEmailValidator() // 验证的配置项: // - email.smtp.host : SMTP主机名验证 // - email.smtp.port : SMTP端口验证 // - email.smtp.username : 邮箱格式验证 // - email.smtp.password : 必填密码验证 // - email.from : 发件人邮箱验证

6. API验证器 (APIValidator)

验证API接口配置:

validator := validation.NewAPIValidator() // 验证的配置项: // - api.base_url : URL格式验证 // - api.timeout : 超时范围 (1-300秒) // - api.rate_limit.enabled : 布尔值验证 // - api.rate_limit.requests_per_minute : 范围验证 (1-10000) // - api.auth.api_key : 必填API密钥 // - api.auth.jwt.* : JWT配置验证

📝 规则验证器

创建自定义规则验证器

// 创建业务逻辑验证器 businessValidator := validation.NewRuleValidator("业务配置验证器") // 添加结构化规则 businessValidator.AddRule("company.name", validation.Required("公司名称不能为空")) businessValidator.AddRule("company.tax_id", validation.Pattern(`^\d{18}$`, "税务登记号必须是18位数字")) // 添加字符串规则 businessValidator.AddStringRule("company.industry", "enum:technology,finance,healthcare,education") businessValidator.AddStringRule("company.employee_count", "range:1,10000") businessValidator.AddStringRule("company.email", "email") businessValidator.AddStringRule("company.website", "url") // 应用验证器 cfg.AddValidator(businessValidator)

支持的字符串规则

基础验证

"required" // 必填字段 "string" // 字符串类型 "number" // 数字类型

网络相关

"email" // 邮箱格式 "url" // URL格式 "ipv4" // IPv4地址 "ipv6" // IPv6地址 "hostname" // 主机名 "port" // 端口号 (1-65535)

数值范围

"range:1,100" // 数值范围 "length:5,20" // 字符串长度范围

格式验证

"regex:^[A-Z][a-z]+$" // 正则表达式 "enum:apple,banana,orange" // 枚举值 "alphanum" // 字母数字 "uuid" // UUID格式 "json" // JSON格式 "base64" // Base64编码

时间相关

"datetime" // 日期时间格式 "timezone" // 时区验证

业务规则

"creditcard" // 信用卡号 "phonenumber" // 电话号码

结构化规则API

validator := validation.NewRuleValidator("结构化规则示例") // 基础规则 validator.AddRule("user.name", validation.Required("用户名不能为空")) validator.AddRule("user.age", validation.Range("18", "65", "年龄必须在18-65岁之间")) validator.AddRule("user.email", validation.Pattern(`^[^@]+@[^@]+\.[^@]+$`, "邮箱格式不正确")) // 枚举规则 validator.AddRule("user.role", validation.Enum("admin,user,guest", "角色必须是admin、user或guest之一")) // 长度规则 validator.AddRule("user.password", validation.Length("8", "密码长度必须是8位"))

🔗 复合验证器

创建复合验证器

// 创建企业级应用验证器 enterpriseValidator := validation.NewCompositeValidator("企业级应用验证器", validation.NewDatabaseValidator(), // 数据库验证 validation.NewWebServerValidator(), // Web服务器验证 validation.NewRedisValidator(), // Redis验证 validation.NewEmailValidator(), // 邮件验证 validation.NewAPIValidator(), // API验证 ) // 添加到配置 cfg.AddValidator(enterpriseValidator) // 获取子验证器信息 subValidators := enterpriseValidator.GetValidators() fmt.Printf("包含 %d 个子验证器\n", len(subValidators))

预定义复合验证器

// 通用验证器(包含常用验证器) commonValidator := validation.NewCommonValidator() // 最小化验证器(仅包含基础验证器) minimalValidator := validation.NewMinimalValidator()

⚡ 函数式验证器

创建函数式验证器

// 自定义业务逻辑验证 cfg.AddValidateFunc(func(config map[string]any) error { // 检查数据库连接配置的一致性 if dbConfig, exists := config["database"].(map[string]any); exists { if dbType, ok := dbConfig["type"].(string); ok && dbType == "mysql" { if port, ok := dbConfig["port"].(int); ok && port != 3306 { return fmt.Errorf("MySQL数据库应使用默认端口3306") } } } return nil }) // 环境特定验证 cfg.AddValidateFunc(func(config map[string]any) error { if appConfig, exists := config["app"].(map[string]any); exists { if env, ok := appConfig["env"].(string); ok && env == "production" { // 生产环境必须启用SSL if serverConfig, exists := config["server"].(map[string]any); exists { if sslConfig, exists := serverConfig["ssl"].(map[string]any); exists { if enabled, ok := sslConfig["enabled"].(bool); !ok || !enabled { return fmt.Errorf("生产环境必须启用SSL") } } } } } return nil })

🎛️ 动态验证器管理

运行时管理验证器

// 获取当前验证器列表 validators := cfg.GetValidators() fmt.Printf("当前验证器数量: %d\n", len(validators)) // 动态添加验证器 tempValidator := validation.NewRuleValidator("临时验证器") tempValidator.AddStringRule("temp.value", "required") cfg.AddValidator(tempValidator) // 清除所有验证器 cfg.ClearValidators() // 重新添加必要的验证器 cfg.AddValidator(validation.NewDatabaseValidator()) cfg.AddValidator(validation.NewWebServerValidator())

条件验证器

// 根据环境动态添加验证器 env := cfg.GetString("app.env", "development") switch env { case "production": cfg.AddValidator(validation.NewEmailValidator()) // 生产环境需要邮件配置 cfg.AddValidator(validation.NewAPIValidator()) // 生产环境需要API配置 case "development": cfg.AddValidator(validation.NewMinimalValidator()) // 开发环境使用最小验证 }

🔧 高级用法

1. 嵌套配置验证

// 验证深层嵌套的配置 validator := validation.NewRuleValidator("嵌套配置验证器") // 支持点号分隔的深层路径 validator.AddStringRule("app.security.jwt.secret", "required") validator.AddStringRule("app.security.jwt.expires_in", "required") validator.AddStringRule("app.database.connections.read.host", "hostname") validator.AddStringRule("app.database.connections.write.host", "hostname") cfg.AddValidator(validator)

2. 条件验证

// 基于配置值的条件验证 cfg.AddValidateFunc(func(config map[string]any) error { // 如果启用了缓存,必须配置Redis if cacheEnabled := getNestedValue(config, "app.cache.enabled"); cacheEnabled == true { if redisHost := getNestedValue(config, "redis.host"); redisHost == nil || redisHost == "" { return fmt.Errorf("启用缓存时必须配置Redis主机地址") } } return nil })

3. 批量验证

// 批量设置配置并验证 updates := map[string]interface{}{ "server.host": "api.example.com", "server.port": 443, "database.host": "db.example.com", "database.port": 5432, "redis.host": "cache.example.com", } // 所有更新都会经过验证器验证 for key, value := range updates { if err := cfg.Set(key, value); err != nil { log.Printf("设置 %s 失败: %v", key, err) } }

4. 自定义验证规则

// 注册自定义验证规则 validation.RegisterValidator("chinese_phone", func(value any, params string) (bool, string) { phone, ok := value.(string) if !ok { return false, "手机号必须是字符串类型" } // 中国手机号验证 matched, _ := regexp.MatchString(`^1[3-9]\d{9}$`, phone) if !matched { return false, "无效的中国手机号格式" } return true, "" }) // 使用自定义规则 validator := validation.NewRuleValidator("中国本地化验证器") validator.AddStringRule("user.phone", "chinese_phone") cfg.AddValidator(validator)

🧪 测试支持

验证器单元测试

func TestValidators(t *testing.T) { // 创建测试配置 cfg, err := sysconf.New( sysconf.WithContent(` database: host: "localhost" port: 5432 username: "test" password: "test123" type: "postgresql" `), sysconf.WithValidators( validation.NewDatabaseValidator(), ), ) require.NoError(t, err) // 测试有效配置 err = cfg.Set("database.port", 3306) assert.NoError(t, err) // 测试无效配置 err = cfg.Set("database.port", 70000) assert.Error(t, err) assert.Contains(t, err.Error(), "port") // 测试配置解析 var config struct { Database struct { Host string `config:"host"` Port int `config:"port"` } `config:"database"` } err = cfg.Unmarshal(&config) assert.NoError(t, err) assert.Equal(t, "localhost", config.Database.Host) }

验证器性能测试

func BenchmarkValidation(b *testing.B) { validator := validation.NewDatabaseValidator() config := map[string]any{ "database": map[string]any{ "host": "localhost", "port": 5432, "username": "test", "password": "test123", "type": "postgresql", }, } b.ResetTimer() for i := 0; i < b.N; i++ { err := validator.Validate(config) if err != nil { b.Fatalf("验证失败: %v", err) } } }

🚨 错误处理

验证错误类型

// 尝试设置无效配置 if err := cfg.Set("server.port", 70000); err != nil { // 验证错误包含详细信息 fmt.Printf("验证失败: %v\n", err) // 输出: validator 'Web Server Configuration Validator' - field 'server.port': port number must be between 1-65535 } // 结构体验证错误 var config AppConfig if err := cfg.Unmarshal(&config); err != nil { fmt.Printf("配置解析失败: %v\n", err) }

错误聚合

验证器会聚合多个验证错误,提供完整的错误信息:

// 同时设置多个无效值 cfg.Set("server.port", 70000) // 端口错误 cfg.Set("database.host", "") // 主机名错误 cfg.Set("redis.db", 20) // Redis DB索引错误 // 获取所有验证错误 errors := cfg.GetValidationErrors() // 自定义方法,返回所有错误 for _, err := range errors { fmt.Printf("验证错误: %v\n", err) }

🎯 最佳实践

1. 验证器组织

// ✅ 推荐:按模块组织验证器 func setupValidators(cfg *sysconf.Config, env string) { // 基础验证器(所有环境) cfg.AddValidator(validation.NewDatabaseValidator()) cfg.AddValidator(validation.NewWebServerValidator()) // 环境特定验证器 switch env { case "production": cfg.AddValidator(validation.NewEmailValidator()) cfg.AddValidator(validation.NewAPIValidator()) case "development": cfg.AddValidator(validation.NewLogValidator()) } // 业务逻辑验证器 cfg.AddValidator(createBusinessValidator()) }

2. 错误处理策略

// ✅ 推荐:优雅的错误处理 func loadConfig() (*AppConfig, error) { cfg, err := sysconf.New(/* 选项 */) if err != nil { return nil, fmt.Errorf("创建配置失败: %w", err) } var config AppConfig if err := cfg.Unmarshal(&config); err != nil { // 配置验证失败,使用默认配置 log.Printf("配置验证失败,使用默认配置: %v", err) return getDefaultConfig(), nil } return &config, nil }

3. 性能优化

// ✅ 推荐:验证器复用 var ( commonValidators = []validation.Validator{ validation.NewDatabaseValidator(), validation.NewWebServerValidator(), validation.NewRedisValidator(), } ) func createConfig() *sysconf.Config { cfg, _ := sysconf.New( sysconf.WithValidators(commonValidators...), ) return cfg }

4. 配置分层验证

// ✅ 推荐:分层验证策略 func createLayeredValidation() *validation.CompositeValidator { return validation.NewCompositeValidator("分层验证器", // 第一层:基础格式验证 validation.NewRuleValidator("格式验证器"). AddStringRule("*.port", "port"). AddStringRule("*.host", "hostname"). AddStringRule("*.email", "email"), // 第二层:业务逻辑验证 createBusinessValidator(), // 第三层:环境特定验证 createEnvironmentValidator(), ) }

📚 API 参考

验证器接口

type Validator interface { Validate(config map[string]any) error GetName() string }

主要类型

// 规则验证器 type StructuredValidator struct { // 添加规则 AddRule(key string, rule ValidationRule) *StructuredValidator AddStringRule(key string, rule string) *StructuredValidator AddRules(key string, rules ...ValidationRule) *StructuredValidator AddStringRules(key string, rules ...string) *StructuredValidator } // 复合验证器 type CompositeValidator struct { // 添加验证器 AddValidator(validator Validator) *CompositeValidator GetValidators() []Validator } // 函数式验证器 type ValidatorFunc func(config map[string]any) error

配置方法

// 验证器管理 cfg.AddValidator(validator Validator) cfg.AddValidateFunc(func(config map[string]any) error) cfg.GetValidators() []Validator cfg.ClearValidators() // 验证相关配置选项 sysconf.WithValidators(validators ...Validator)

🔗 相关资源


验证器系统让您的配置更安全、更可靠

🏠 返回主文档🐛 问题反馈💡 功能建议