Sin descripción
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

config.go 8.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. package config
  2. import (
  3. "sync"
  4. "git.x2erp.com/qdy/go-base/config/subconfigs"
  5. "git.x2erp.com/qdy/go-base/logger"
  6. )
  7. // IConfig 主配置接口(更新支持多数据库)
  8. type IConfig interface {
  9. // 多数据库支持
  10. GetDatabase() *subconfigs.DatabaseConfig // 获取默认数据库(向后兼容)
  11. GetDatabases() *subconfigs.DatabasesConfig // 获取所有数据库配置
  12. GetDatabaseConfig(name string) *subconfigs.DatabaseConfig // 按名称获取数据库配置
  13. // 其他配置(保持不变)
  14. GetRedis() *subconfigs.RedisConfig
  15. GetDoris() *subconfigs.DorisConfig
  16. GetRabbitMQ() *subconfigs.RabbitMQConfig
  17. GetAuth() *subconfigs.AuthConfig
  18. GetService() *subconfigs.ServiceConfig
  19. GetHTTP() *subconfigs.HTTPConfig
  20. GetMicro() *subconfigs.MicroConfig
  21. GetLog() *subconfigs.LogConfig
  22. GetInitError() error
  23. // 配置检查(更新)
  24. IsDatabaseConfigured() bool
  25. IsDatabaseConfiguredByName(name string) bool
  26. IsDorisConfigured() bool
  27. IsRedisConfigured() bool
  28. SetServiceName(name string)
  29. SetServiceVersion(version string)
  30. SetEnv(name string)
  31. GetServiceVersion() string
  32. GetEnv() string
  33. }
  34. // Config 主配置结构体 - 访问门面
  35. type Config struct {
  36. initError error // 初始化错误
  37. ServiceVersion string //当前启动微服务版本
  38. env string //当前启动微服务环境dev test prod
  39. }
  40. // ========== 数据库相关方法(更新) ==========
  41. // GetDatabases 获取所有数据库配置
  42. func (c *Config) GetDatabases() *subconfigs.DatabasesConfig {
  43. if config := subconfigs.GetRegisteredConfig("databases"); config != nil {
  44. if dbs, ok := config.(*subconfigs.DatabasesConfig); ok {
  45. return dbs
  46. }
  47. }
  48. return nil
  49. }
  50. // GetDatabase 获取默认数据库配置(向后兼容)
  51. func (c *Config) GetDatabase() *subconfigs.DatabaseConfig {
  52. dbs := c.GetDatabases()
  53. if dbs == nil {
  54. logger.Errorf("获取默认数据库连接配置发生错误:配置为空!")
  55. return nil
  56. }
  57. return dbs.GetDefaultDatabase()
  58. }
  59. // GetDatabaseConfig 按名称获取数据库配置
  60. func (c *Config) GetDatabaseConfig(name string) *subconfigs.DatabaseConfig {
  61. dbs := c.GetDatabases()
  62. if dbs == nil {
  63. return nil
  64. }
  65. return dbs.GetDatabase(name)
  66. }
  67. // IsDatabaseConfigured 检查默认数据库是否配置
  68. func (c *Config) IsDatabaseConfigured() bool {
  69. dbs := c.GetDatabases()
  70. if dbs == nil {
  71. return false
  72. }
  73. return dbs.IsConfigured()
  74. }
  75. // IsDatabaseConfiguredByName 检查指定名称的数据库是否配置
  76. func (c *Config) IsDatabaseConfiguredByName(name string) bool {
  77. dbs := c.GetDatabases()
  78. if dbs == nil {
  79. return false
  80. }
  81. return dbs.IsConfigured()
  82. }
  83. // ========== 其他配置方法(保持不变) ==========
  84. func (c *Config) GetRedis() *subconfigs.RedisConfig {
  85. if config := subconfigs.GetRegisteredConfig("redis"); config != nil {
  86. return config.(*subconfigs.RedisConfig)
  87. }
  88. return nil
  89. }
  90. func (c *Config) GetDoris() *subconfigs.DorisConfig {
  91. if config := subconfigs.GetRegisteredConfig("doris"); config != nil {
  92. return config.(*subconfigs.DorisConfig)
  93. }
  94. return nil
  95. }
  96. func (c *Config) GetRabbitMQ() *subconfigs.RabbitMQConfig {
  97. if config := subconfigs.GetRegisteredConfig("rabbitmq"); config != nil {
  98. return config.(*subconfigs.RabbitMQConfig)
  99. }
  100. return nil
  101. }
  102. func (c *Config) GetAuth() *subconfigs.AuthConfig {
  103. if config := subconfigs.GetRegisteredConfig("auth"); config != nil {
  104. return config.(*subconfigs.AuthConfig)
  105. }
  106. return nil
  107. }
  108. // ========== 微服务相关方法(更新) ==========
  109. // GetServices 获取所有微服务配置
  110. func (c *Config) GetServices() *subconfigs.ServicesConfig {
  111. if config := subconfigs.GetRegisteredConfig("services"); config != nil {
  112. if dbs, ok := config.(*subconfigs.ServicesConfig); ok {
  113. return dbs
  114. }
  115. }
  116. return nil
  117. }
  118. // GetService 获取默认微服务配置(向后兼容)
  119. func (c *Config) GetService() *subconfigs.ServiceConfig {
  120. dbs := c.GetServices()
  121. if dbs == nil {
  122. logger.Errorf("获取默认微服务配置发生错误:配置为空!")
  123. return nil
  124. }
  125. return dbs.GetDefaultService()
  126. }
  127. // GetServiceConfig 按名称获取微服务配置
  128. func (c *Config) GetServiceConfig(name string) *subconfigs.ServiceConfig {
  129. dbs := c.GetServices()
  130. if dbs == nil {
  131. return nil
  132. }
  133. return dbs.GetService(name)
  134. }
  135. func (c *Config) GetHTTP() *subconfigs.HTTPConfig {
  136. if config := subconfigs.GetRegisteredConfig("http"); config != nil {
  137. return config.(*subconfigs.HTTPConfig)
  138. }
  139. return nil
  140. }
  141. func (c *Config) GetMicro() *subconfigs.MicroConfig {
  142. if config := subconfigs.GetRegisteredConfig("micro"); config != nil {
  143. return config.(*subconfigs.MicroConfig)
  144. }
  145. return nil
  146. }
  147. func (c *Config) GetLog() *subconfigs.LogConfig {
  148. if config := subconfigs.GetRegisteredConfig("log"); config != nil {
  149. return config.(*subconfigs.LogConfig)
  150. }
  151. return nil
  152. }
  153. func (c *Config) GetInitError() error {
  154. return c.initError
  155. }
  156. // 实现 IConfig 接口的其他方法
  157. func (c *Config) IsDorisConfigured() bool {
  158. doris := c.GetDoris()
  159. return doris != nil && doris.IsConfigured()
  160. }
  161. func (c *Config) IsRedisConfigured() bool {
  162. redis := c.GetRedis()
  163. return redis != nil && redis.IsConfigured()
  164. }
  165. // 设置方法
  166. func (c *Config) SetEnv(name string) {
  167. c.env = name
  168. }
  169. func (c *Config) SetServiceName(name string) {
  170. if c.GetService().ServiceName == "" {
  171. c.GetService().ServiceName = name
  172. }
  173. }
  174. func (c *Config) SetServiceVersion(version string) {
  175. c.ServiceVersion = version
  176. }
  177. // GetServiceVersion 获取服务版本
  178. func (c *Config) GetServiceVersion() string {
  179. return c.ServiceVersion
  180. }
  181. // GetEnv 获取环境
  182. func (c *Config) GetEnv() string {
  183. return c.env
  184. }
  185. // ========== 包级便捷函数(更新) ==========
  186. // GetDatabases 包级便捷函数 - 获取所有数据库配置
  187. func GetDatabases() *subconfigs.DatabasesConfig {
  188. if cfgInstance == nil {
  189. return nil
  190. }
  191. return cfgInstance.GetDatabases()
  192. }
  193. // GetDatabase 包级便捷函数 - 获取默认数据库配置(向后兼容)
  194. func GetDatabase() *subconfigs.DatabaseConfig {
  195. if cfgInstance == nil {
  196. return &subconfigs.DatabaseConfig{}
  197. }
  198. return cfgInstance.GetDatabase()
  199. }
  200. // GetDatabaseConfig 包级便捷函数 - 按名称获取数据库配置
  201. func GetDatabaseConfig(name string) *subconfigs.DatabaseConfig {
  202. if cfgInstance == nil {
  203. return nil
  204. }
  205. return cfgInstance.GetDatabaseConfig(name)
  206. }
  207. // GetRedis 包级便捷函数 - 获取Redis配置
  208. func GetRedis() *subconfigs.RedisConfig {
  209. if cfgInstance == nil {
  210. return &subconfigs.RedisConfig{}
  211. }
  212. return cfgInstance.GetRedis()
  213. }
  214. // GetHTTP 包级便捷函数 - 获取HTTP配置
  215. func GetHTTP() *subconfigs.HTTPConfig {
  216. if cfgInstance == nil {
  217. return &subconfigs.HTTPConfig{}
  218. }
  219. return cfgInstance.GetHTTP()
  220. }
  221. // GetLog 包级便捷函数 - 获取日志配置
  222. func GetLog() *subconfigs.LogConfig {
  223. if cfgInstance == nil {
  224. return &subconfigs.LogConfig{}
  225. }
  226. return cfgInstance.GetLog()
  227. }
  228. func GetMicro() *subconfigs.MicroConfig {
  229. if cfgInstance == nil {
  230. return &subconfigs.MicroConfig{}
  231. }
  232. return cfgInstance.GetMicro()
  233. }
  234. func GetAuth() *subconfigs.AuthConfig {
  235. if cfgInstance == nil {
  236. return &subconfigs.AuthConfig{}
  237. }
  238. return cfgInstance.GetAuth()
  239. }
  240. func GetService() *subconfigs.ServiceConfig {
  241. if cfgInstance == nil {
  242. return &subconfigs.ServiceConfig{}
  243. }
  244. return cfgInstance.GetService()
  245. }
  246. // GetServiceConfig 包级便捷函数 - 按名称获取数微服务配置
  247. func GetServiceConfig(name string) *subconfigs.ServiceConfig {
  248. if cfgInstance == nil {
  249. return nil
  250. }
  251. return cfgInstance.GetServiceConfig(name)
  252. }
  253. // ========== 单例管理 ==========
  254. var (
  255. cfgInstance *Config
  256. once sync.Once
  257. )
  258. // GetConfig 获取主配置(单例模式)
  259. func GetConfig() (IConfig, error) {
  260. once.Do(func() {
  261. cfgInstance = &Config{}
  262. cfgInstance.initError = LoadConfig() // 加载配置到注册表
  263. })
  264. return cfgInstance, cfgInstance.initError
  265. }
  266. // GetInitError 包级函数 - 兼容现有代码调用
  267. func GetInitError() error {
  268. return cfgInstance.GetInitError()
  269. }
  270. // GetConfigWithError 新方法 - 同时获取配置和错误
  271. func GetConfigWithError() (IConfig, error) {
  272. cfg, err := GetConfig()
  273. return cfg, err
  274. }