Açıklama Yok
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.6KB

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