ソースを参照

支持多微服务和多数据库测试通过

qdy 2ヶ月前
コミット
5cc821ad05
5個のファイルの変更313行の追加123行の削除
  1. 263
    55
      bootstraps/bootstrap.go
  2. 40
    37
      config/config.go
  3. 0
    28
      config/subconfigs/auth_config.go
  4. 8
    1
      config/subconfigs/service_config.go
  5. 2
    2
      test.go

+ 263
- 55
bootstraps/bootstrap.go ファイルの表示

@@ -11,6 +11,7 @@ import (
11 11
 	"time"
12 12
 
13 13
 	"git.x2erp.com/qdy/go-base/config"
14
+	"git.x2erp.com/qdy/go-base/config/subconfigs"
14 15
 	"git.x2erp.com/qdy/go-base/logger"
15 16
 )
16 17
 
@@ -19,32 +20,43 @@ type ShutdownHandler interface {
19 20
 	OnShutdown()
20 21
 }
21 22
 
23
+// WebService Web服务实例
24
+type WebService struct {
25
+	serviceName     string
26
+	serviceConfig   *subconfigs.ServiceConfig
27
+	HttpServer      *http.Server
28
+	Router          *http.ServeMux
29
+	quit            chan os.Signal
30
+	shutdownHandler ShutdownHandler
31
+}
32
+
22 33
 // Bootstrapper 服务启动器
23 34
 type Bootstrapper struct {
24
-	serviceName    string
25
-	serviceVersion string
26
-	Cfg            config.IConfig
27
-	HttpServer     *http.Server
28
-	Router         *http.ServeMux
29
-	quit           chan os.Signal
35
+	appName    string
36
+	appVersion string
37
+	Cfg        config.IConfig
38
+	services   map[string]*WebService // 存储多个服务实例
39
+	quit       chan os.Signal
30 40
 }
31 41
 
32
-// New 创建启动器
33
-func New(name, version string) *Bootstrapper {
42
+// NewBootstrapper 创建启动器
43
+func NewBootstrapper(name, version string) *Bootstrapper {
34 44
 	b := &Bootstrapper{
35
-		serviceName:    name,
36
-		serviceVersion: version,
37
-		quit:           make(chan os.Signal, 1),
38
-		Router:         http.NewServeMux(), // 直接创建路由器
45
+		appName:    name,
46
+		appVersion: version,
47
+		quit:       make(chan os.Signal, 1),
48
+		services:   make(map[string]*WebService),
39 49
 	}
40 50
 
51
+	b.init()
52
+
41 53
 	return b
42 54
 }
43 55
 
44 56
 // Init 初始化配置和日志
45
-func (b *Bootstrapper) Init() *Bootstrapper {
57
+func (b *Bootstrapper) init() *Bootstrapper {
46 58
 	// 1. 初始化启动日志
47
-	if err := logger.InitBootLog(b.serviceName); err != nil {
59
+	if err := logger.InitBootLog(b.appName); err != nil {
48 60
 		log.Fatal("无法初始化启动日志: ", err)
49 61
 	}
50 62
 
@@ -54,92 +66,200 @@ func (b *Bootstrapper) Init() *Bootstrapper {
54 66
 	if err != nil {
55 67
 		log.Fatalf("加载配置失败: %v", err)
56 68
 	}
57
-	cfg.SetServiceName(b.serviceName)
58
-	cfg.SetServiceVersion(b.serviceVersion)
69
+	cfg.SetAppName(b.appName)
70
+	cfg.SetAppVersion(b.appVersion)
59 71
 	b.Cfg = cfg
60 72
 
61 73
 	// 3. 初始化运行时日志
62
-	logger.InitRuntimeLogger(b.serviceName, b.serviceVersion, b.Cfg.GetLog())
74
+	logger.InitRuntimeLogger(b.appName, b.appVersion, b.Cfg.GetLog())
63 75
 	log.Println("配置和日志初始化完成")
64 76
 
65 77
 	return b
66 78
 }
67 79
 
68
-// StartService 启动HTTP服务
69
-func (b *Bootstrapper) StartService() *Bootstrapper {
70
-	serviceCfg := b.Cfg.GetService()
80
+// CreateService 创建Web服务实例
81
+func (b *Bootstrapper) CreateService(serviceName string) *WebService {
82
+	serviceCfg := b.Cfg.GetServiceConfig(serviceName)
83
+
84
+	// 检查是否已存在同名服务
85
+	if _, exists := b.services[serviceName]; exists {
86
+		logger.Debug("服务 %s 已存在,将返回现有实例", serviceName)
87
+		return b.services[serviceName]
88
+	}
89
+
90
+	// 创建新的服务实例
91
+	ws := &WebService{
92
+		serviceName:   serviceName,
93
+		serviceConfig: serviceCfg,
94
+		Router:        http.NewServeMux(),
95
+		quit:          make(chan os.Signal, 1),
96
+	}
71 97
 
72 98
 	// 创建HTTP服务器
73
-	b.HttpServer = &http.Server{
99
+	ws.HttpServer = &http.Server{
74 100
 		Addr:         fmt.Sprintf(":%d", serviceCfg.Port),
75
-		Handler:      b.Router, // 直接使用Router
101
+		Handler:      ws.Router,
76 102
 		ReadTimeout:  15 * time.Second,
77 103
 		WriteTimeout: 15 * time.Second,
78 104
 		IdleTimeout:  60 * time.Second,
79 105
 	}
80 106
 
81
-	log.Printf("正在启动服务: %s v%s", b.serviceName, b.serviceVersion)
107
+	// 存储服务实例
108
+	b.services[serviceName] = ws
109
+
110
+	logger.Debug("已创建服务实例: %s (端口: %d)", serviceCfg.ServiceName, serviceCfg.Port)
111
+
112
+	return ws
113
+}
114
+
115
+// GetAllServices 获取所有服务实例
116
+func (b *Bootstrapper) GetAllServices() map[string]*WebService {
117
+	return b.services
118
+}
119
+
120
+// StartService 启动指定服务
121
+func (b *Bootstrapper) StartService(serviceName string) *Bootstrapper {
122
+
123
+	service := b.CreateService(serviceName)
124
+
125
+	serviceCfg := service.serviceConfig
126
+	log.Printf("正在启动服务: %s ", serviceCfg.ServiceName)
82 127
 	log.Printf("模式: 独立运行 (net/http)")
83 128
 	log.Printf("服务端口: :%d", serviceCfg.Port)
84 129
 
85 130
 	return b
86 131
 }
87 132
 
88
-// Run 运行服务
89
-func (b *Bootstrapper) Run(handler ShutdownHandler) {
90
-	log.Printf("服务 %s 开始运行...", b.serviceName)
133
+// Run 运行所有服务
134
+func (b *Bootstrapper) Run(shutdownHandler ShutdownHandler) {
135
+	if len(b.services) == 0 {
136
+		log.Fatal("没有要运行的服务,请先创建服务实例")
137
+	}
138
+
139
+	log.Printf("开始运行 %d 个服务...", len(b.services))
91 140
 
92
-	// 设置信号监听 - 在这里设置,而不是在New中
141
+	// 设置全局信号监听
93 142
 	signal.Notify(b.quit, syscall.SIGINT, syscall.SIGTERM)
94 143
 
95
-	// 启动HTTP服务器
144
+	// 启动所有服务
145
+	for serviceName, service := range b.services {
146
+		go func(name string, ws *WebService) {
147
+			log.Printf("启动服务 %s 在 %s", name, ws.HttpServer.Addr)
148
+			if err := ws.HttpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed {
149
+				log.Fatalf("服务 %s 运行失败: %v", name, err)
150
+			}
151
+		}(serviceName, service)
152
+	}
153
+
154
+	// 等待中断信号
155
+	b.waitForShutdown(shutdownHandler)
156
+}
157
+
158
+// RunSingle 运行单个服务
159
+func (b *Bootstrapper) RunSingle(serviceName string, shutdownHandler ShutdownHandler) {
160
+	service := b.CreateService(serviceName)
161
+
162
+	log.Printf("服务 %s 开始运行...", service.serviceConfig.ServiceName)
163
+
164
+	// 设置服务级别的信号监听
165
+	signal.Notify(service.quit, syscall.SIGINT, syscall.SIGTERM)
166
+
167
+	// 启动服务
96 168
 	go func() {
97
-		log.Printf("服务器启动在 %s", b.HttpServer.Addr)
98
-		if err := b.HttpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed {
169
+		log.Printf("服务器启动在 %s", service.HttpServer.Addr)
170
+		if err := service.HttpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed {
99 171
 			log.Fatalf("服务运行失败: %v", err)
100 172
 		}
101 173
 	}()
102 174
 
103 175
 	// 等待中断信号
104
-	b.waitForShutdown(handler)
176
+	b.waitForServiceShutdown(service, shutdownHandler)
105 177
 }
106 178
 
107 179
 // RunTLS 运行HTTPS服务
108
-func (b *Bootstrapper) RunTLS(certFile, keyFile string, handler ShutdownHandler) {
109
-	log.Printf("服务 %s 开始运行(HTTPS)...", b.serviceName)
180
+func (b *Bootstrapper) RunTLS(serviceName, certFile, keyFile string, shutdownHandler ShutdownHandler) {
181
+	service := b.CreateService(serviceName)
110 182
 
111
-	// 设置信号监听
112
-	signal.Notify(b.quit, syscall.SIGINT, syscall.SIGTERM)
183
+	log.Printf("服务 %s 开始运行(HTTPS)...", service.serviceConfig.ServiceName)
184
+
185
+	// 设置服务级别的信号监听
186
+	signal.Notify(service.quit, syscall.SIGINT, syscall.SIGTERM)
113 187
 
114 188
 	// 启动HTTPS服务器
115 189
 	go func() {
116
-		log.Printf("HTTPS服务器启动在 %s", b.HttpServer.Addr)
117
-		if err := b.HttpServer.ListenAndServeTLS(certFile, keyFile); err != nil && err != http.ErrServerClosed {
190
+		log.Printf("HTTPS服务器启动在 %s", service.HttpServer.Addr)
191
+		if err := service.HttpServer.ListenAndServeTLS(certFile, keyFile); err != nil && err != http.ErrServerClosed {
118 192
 			log.Fatalf("服务运行失败: %v", err)
119 193
 		}
120 194
 	}()
121 195
 
122 196
 	// 等待中断信号
123
-	b.waitForShutdown(handler)
197
+	b.waitForServiceShutdown(service, shutdownHandler)
124 198
 }
125 199
 
126
-// waitForShutdown 等待关闭信号
200
+// waitForShutdown 等待关闭信号(关闭所有服务)
127 201
 func (b *Bootstrapper) waitForShutdown(handler ShutdownHandler) {
128
-	log.Println("按 Ctrl+C 停止服务")
202
+	log.Println("按 Ctrl+C 停止所有服务")
129 203
 
130 204
 	// 等待信号
131 205
 	<-b.quit
132
-	log.Println("接收到终止信号,正在优雅关闭服务...")
206
+	log.Println("接收到终止信号,正在优雅关闭所有服务...")
207
+
208
+	// 创建关闭上下文,给30秒完成当前请求
209
+	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
210
+	defer cancel()
211
+
212
+	// 关闭所有服务
213
+	shutdownComplete := make(chan bool, len(b.services))
214
+
215
+	for serviceName, service := range b.services {
216
+		go func(name string, ws *WebService) {
217
+			log.Printf("正在关闭服务: %s", name)
218
+			if err := ws.HttpServer.Shutdown(ctx); err != nil {
219
+				log.Printf("服务 %s 关闭失败: %v", name, err)
220
+			} else {
221
+				log.Printf("服务 %s 已关闭", name)
222
+			}
223
+			shutdownComplete <- true
224
+		}(serviceName, service)
225
+	}
226
+
227
+	// 等待所有服务关闭完成
228
+	for i := 0; i < len(b.services); i++ {
229
+		<-shutdownComplete
230
+	}
231
+
232
+	// 执行关闭处理
233
+	if handler != nil {
234
+		handler.OnShutdown()
235
+	}
236
+
237
+	// 停止日志写入
238
+	logger.StopESWriter()
239
+	log.Println("所有服务优雅关闭完成")
240
+
241
+	// 等待一小段时间确保日志写入完成
242
+	time.Sleep(100 * time.Millisecond)
243
+	os.Exit(0)
244
+}
245
+
246
+// waitForServiceShutdown 等待单个服务关闭
247
+func (b *Bootstrapper) waitForServiceShutdown(service *WebService, handler ShutdownHandler) {
248
+	log.Printf("按 Ctrl+C 停止服务 %s", service.serviceName)
249
+
250
+	// 等待信号
251
+	<-service.quit
252
+	log.Printf("接收到终止信号,正在优雅关闭服务 %s...", service.serviceName)
133 253
 
134 254
 	// 创建关闭上下文,给30秒完成当前请求
135 255
 	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
136 256
 	defer cancel()
137 257
 
138 258
 	// 停止接收新请求,完成当前请求
139
-	if err := b.HttpServer.Shutdown(ctx); err != nil {
140
-		log.Printf("服务关闭失败: %v", err)
259
+	if err := service.HttpServer.Shutdown(ctx); err != nil {
260
+		log.Printf("服务 %s 关闭失败: %v", service.serviceName, err)
141 261
 	} else {
142
-		log.Println("HTTP服务器已关闭")
262
+		log.Printf("服务 %s 已关闭", service.serviceName)
143 263
 	}
144 264
 
145 265
 	// 执行关闭处理
@@ -149,7 +269,7 @@ func (b *Bootstrapper) waitForShutdown(handler ShutdownHandler) {
149 269
 
150 270
 	// 停止日志写入
151 271
 	logger.StopESWriter()
152
-	log.Println("服务优雅关闭完成")
272
+	log.Printf("服务 %s 优雅关闭完成", service.serviceName)
153 273
 
154 274
 	// 等待一小段时间确保日志写入完成
155 275
 	time.Sleep(100 * time.Millisecond)
@@ -161,19 +281,107 @@ func (b *Bootstrapper) GetConfig() config.IConfig {
161 281
 	return b.Cfg
162 282
 }
163 283
 
164
-// GetRouter 获取路由器
165
-func (b *Bootstrapper) GetRouter() *http.ServeMux {
166
-	return b.Router
284
+// GetRouter 获取指定服务的路由器
285
+func (b *Bootstrapper) GetRouter(serviceName string) *http.ServeMux {
286
+	service := b.CreateService(serviceName)
287
+	return service.Router
167 288
 }
168 289
 
169
-// 兼容性方法
290
+// GetRouterDefault 获取第一个服务的路由器(兼容性方法)
291
+func (b *Bootstrapper) GetRouterDefault() *http.ServeMux {
292
+	for _, service := range b.services {
293
+		return service.Router
294
+	}
295
+	// 如果没有服务,创建默认路由器(向后兼容)
296
+	return http.NewServeMux()
297
+}
170 298
 
171
-// GetWebService 获取Web服务(兼容性方法)
172
-func (b *Bootstrapper) GetWebService() interface{} {
173
-	return b.Router
299
+// Handle 注册路由处理器到指定服务
300
+func (b *Bootstrapper) Handle(serviceName, pattern string, handler http.Handler) bool {
301
+	if service, exists := b.services[serviceName]; exists {
302
+		service.Router.Handle(pattern, handler)
303
+		return true
304
+	}
305
+	log.Printf("错误: 服务 %s 不存在", serviceName)
306
+	return false
174 307
 }
175 308
 
176
-// Handle 注册路由处理器(兼容性方法)
177
-func (b *Bootstrapper) Handle(pattern string, handler http.Handler) {
178
-	b.Router.Handle(pattern, handler)
309
+// SetShutdownHandler 为服务设置关闭处理器
310
+func (b *Bootstrapper) SetShutdownHandler(serviceName string, handler ShutdownHandler) bool {
311
+	if service, exists := b.services[serviceName]; exists {
312
+		service.shutdownHandler = handler
313
+		return true
314
+	}
315
+	return false
316
+}
317
+
318
+// ========== WebService 的方法 ==========
319
+
320
+// GetServiceName 获取服务名称
321
+func (ws *WebService) GetServiceName() string {
322
+	return ws.serviceName
323
+}
324
+
325
+// GetServiceConfig 获取服务配置
326
+func (ws *WebService) GetServiceConfig() *subconfigs.ServiceConfig {
327
+	return ws.serviceConfig
328
+}
329
+
330
+// GetRouter 获取服务的路由器
331
+func (ws *WebService) GetRouter() *http.ServeMux {
332
+	return ws.Router
333
+}
334
+
335
+// Handle 注册路由处理器
336
+func (ws *WebService) Handle(pattern string, handler http.Handler) {
337
+	ws.Router.Handle(pattern, handler)
338
+}
339
+
340
+// SetShutdownHandler 设置关闭处理器
341
+func (ws *WebService) SetShutdownHandler(handler ShutdownHandler) {
342
+	ws.shutdownHandler = handler
343
+}
344
+
345
+// Run 运行单个服务
346
+func (ws *WebService) Run(shutdownHandler ShutdownHandler) {
347
+	log.Printf("服务 %s 开始运行...", ws.serviceConfig.ServiceName)
348
+
349
+	// 设置信号监听
350
+	signal.Notify(ws.quit, syscall.SIGINT, syscall.SIGTERM)
351
+
352
+	// 启动服务
353
+	go func() {
354
+		log.Printf("服务器启动在 %s", ws.HttpServer.Addr)
355
+		if err := ws.HttpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed {
356
+			log.Fatalf("服务 %s 运行失败: %v", ws.serviceName, err)
357
+		}
358
+	}()
359
+
360
+	// 等待中断信号
361
+	log.Printf("按 Ctrl+C 停止服务 %s", ws.serviceName)
362
+	<-ws.quit
363
+
364
+	log.Printf("接收到终止信号,正在优雅关闭服务 %s...", ws.serviceName)
365
+
366
+	// 创建关闭上下文
367
+	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
368
+	defer cancel()
369
+
370
+	// 关闭服务
371
+	if err := ws.HttpServer.Shutdown(ctx); err != nil {
372
+		log.Printf("服务 %s 关闭失败: %v", ws.serviceName, err)
373
+	} else {
374
+		log.Printf("服务 %s 已关闭", ws.serviceName)
375
+	}
376
+
377
+	// 执行关闭处理
378
+	if shutdownHandler != nil {
379
+		shutdownHandler.OnShutdown()
380
+	} else if ws.shutdownHandler != nil {
381
+		ws.shutdownHandler.OnShutdown()
382
+	}
383
+
384
+	log.Printf("服务 %s 优雅关闭完成", ws.serviceName)
385
+	time.Sleep(100 * time.Millisecond)
386
+	os.Exit(0)
179 387
 }

+ 40
- 37
config/config.go ファイルの表示

@@ -14,12 +14,16 @@ type IConfig interface {
14 14
 	GetDatabases() *subconfigs.DatabasesConfig                // 获取所有数据库配置
15 15
 	GetDatabaseConfig(name string) *subconfigs.DatabaseConfig // 按名称获取数据库配置
16 16
 
17
+	//多服务支持
18
+	GetService() *subconfigs.ServiceConfig                  //获取默认微服务配置
19
+	GetServices() *subconfigs.ServicesConfig                //获所有定义的微服务配置
20
+	GetServiceConfig(name string) *subconfigs.ServiceConfig //获取微服务配置
21
+
17 22
 	// 其他配置(保持不变)
18 23
 	GetRedis() *subconfigs.RedisConfig
19 24
 	GetDoris() *subconfigs.DorisConfig
20 25
 	GetRabbitMQ() *subconfigs.RabbitMQConfig
21
-	GetAuth() *subconfigs.AuthConfig
22
-	GetService() *subconfigs.ServiceConfig
26
+
23 27
 	GetHTTP() *subconfigs.HTTPConfig
24 28
 	GetMicro() *subconfigs.MicroConfig
25 29
 	GetLog() *subconfigs.LogConfig
@@ -31,19 +35,19 @@ type IConfig interface {
31 35
 	IsDorisConfigured() bool
32 36
 	IsRedisConfigured() bool
33 37
 
34
-	SetServiceName(name string)
35
-	SetServiceVersion(version string)
36
-	SetEnv(name string)
38
+	SetAppName(name string)
39
+	SetAppVersion(version string)
40
+	SetAppEnv(name string)
37 41
 
38
-	GetServiceVersion() string
39
-	GetEnv() string
42
+	GetAppName() string
43
+	GetAppVersion() string
44
+	GetAppEnv() string
45
+	GetAppAuthToken() string
40 46
 }
41 47
 
42 48
 // Config 主配置结构体 - 访问门面
43 49
 type Config struct {
44
-	initError      error  // 初始化错误
45
-	ServiceVersion string //当前启动微服务版本
46
-	env            string //当前启动微服务环境dev test prod
50
+	initError error // 初始化错误
47 51
 }
48 52
 
49 53
 // ========== 数据库相关方法(更新) ==========
@@ -118,13 +122,6 @@ func (c *Config) GetRabbitMQ() *subconfigs.RabbitMQConfig {
118 122
 	return nil
119 123
 }
120 124
 
121
-func (c *Config) GetAuth() *subconfigs.AuthConfig {
122
-	if config := subconfigs.GetRegisteredConfig("auth"); config != nil {
123
-		return config.(*subconfigs.AuthConfig)
124
-	}
125
-	return nil
126
-}
127
-
128 125
 // ========== 微服务相关方法(更新) ==========
129 126
 
130 127
 // GetServices 获取所有微服务配置
@@ -193,28 +190,41 @@ func (c *Config) IsRedisConfigured() bool {
193 190
 }
194 191
 
195 192
 // 设置方法
196
-func (c *Config) SetEnv(name string) {
197
-	c.env = name
193
+func (c *Config) SetAppEnv(name string) {
194
+	if c.GetAppEnv() == "" {
195
+		c.GetServices().AppEnv = name
196
+	}
198 197
 }
199 198
 
200
-func (c *Config) SetServiceName(name string) {
201
-	if c.GetService().ServiceName == "" {
202
-		c.GetService().ServiceName = name
199
+func (c *Config) SetAppName(name string) {
200
+	if c.GetAppName() == "" {
201
+		c.GetServices().AppName = name
203 202
 	}
204 203
 }
204
+func (c *Config) SetAppVersion(name string) {
205
+	if c.GetAppVersion() == "" {
206
+		c.GetServices().AppVersion = name
207
+	}
208
+}
209
+
210
+// GetAppVersion 获取服务版本
211
+func (c *Config) GetAppVersion() string {
212
+	return c.GetServices().AppVersion
213
+}
205 214
 
206
-func (c *Config) SetServiceVersion(version string) {
207
-	c.ServiceVersion = version
215
+// GetAppEnv 获取环境
216
+func (c *Config) GetAppEnv() string {
217
+	return c.GetServices().AppEnv
208 218
 }
209 219
 
210
-// GetServiceVersion 获取服务版本
211
-func (c *Config) GetServiceVersion() string {
212
-	return c.ServiceVersion
220
+// GetAppName 获取当前应用名称
221
+func (c *Config) GetAppName() string {
222
+	return c.GetServices().AppName
213 223
 }
214 224
 
215
-// GetEnv 获取环境
216
-func (c *Config) GetEnv() string {
217
-	return c.env
225
+// GetAppAuthToken 得到当前配置文件里的token
226
+func (c *Config) GetAppAuthToken() string {
227
+	return c.GetServices().AppAuthToken
218 228
 }
219 229
 
220 230
 // ========== 包级便捷函数(更新) ==========
@@ -274,13 +284,6 @@ func GetMicro() *subconfigs.MicroConfig {
274 284
 	return cfgInstance.GetMicro()
275 285
 }
276 286
 
277
-func GetAuth() *subconfigs.AuthConfig {
278
-	if cfgInstance == nil {
279
-		return &subconfigs.AuthConfig{}
280
-	}
281
-	return cfgInstance.GetAuth()
282
-}
283
-
284 287
 func GetService() *subconfigs.ServiceConfig {
285 288
 	if cfgInstance == nil {
286 289
 		return &subconfigs.ServiceConfig{}

+ 0
- 28
config/subconfigs/auth_config.go ファイルの表示

@@ -1,28 +0,0 @@
1
-package subconfigs
2
-
3
-// AuthConfig 认证配置
4
-type AuthConfig struct {
5
-	BaseConfig
6
-	Token string `yaml:"token"`
7
-}
8
-
9
-func NewAuthConfig() *AuthConfig {
10
-	return &AuthConfig{}
11
-}
12
-
13
-func (c *AuthConfig) SetDefaults() {
14
-	// 默认不设置token
15
-}
16
-
17
-func (c *AuthConfig) Load(data map[string]interface{}) error {
18
-	return c.LoadFromYAML(data, c)
19
-}
20
-
21
-func (c *AuthConfig) Validate() error {
22
-	// token 可以为空,有些环境不需要认证
23
-	return nil
24
-}
25
-
26
-func (c *AuthConfig) IsConfigured() bool {
27
-	return c.Token != ""
28
-}

+ 8
- 1
config/subconfigs/service_config.go ファイルの表示

@@ -8,7 +8,11 @@ import (
8 8
 
9 9
 type ServicesConfig struct {
10 10
 	BaseConfig
11
-	Services map[string]*ServiceConfig `yaml:"services"`
11
+	AppName      string                    `yaml:"app_name"`       //当前应用名称
12
+	AppVersion   string                    `yaml:"app_version"`    //当前应用版本
13
+	AppEnv       string                    `yaml:"app_env"`        //环境参数 dev test prod
14
+	AppAuthToken string                    `yaml:"app_auth_token"` //使用静态认证的时候使用的token
15
+	Services     map[string]*ServiceConfig `yaml:"services"`       //多个服务配置项
12 16
 }
13 17
 
14 18
 // DatabaseConfig 数据库配置
@@ -24,6 +28,9 @@ type ServiceConfig struct {
24 28
 
25 29
 // SetDefaults 设置默认值 - 实现 ConfigLoader 接口
26 30
 func (c *ServicesConfig) SetDefaults() {
31
+	if c.AppEnv == "" {
32
+		c.AppEnv = "dev"
33
+	}
27 34
 	//因为是多集合,外层调这里赋默认值,这个时候对象还没有建立。赋默认值的地方移到其他地方去
28 35
 }
29 36
 

+ 2
- 2
test.go ファイルの表示

@@ -24,8 +24,8 @@ func main() {
24 24
 		fmt.Printf("Database: %s\n", dbConfig.Database)
25 25
 	}
26 26
 
27
-	authConfig := cfg.GetAuth()
28
-	fmt.Printf("token: %s\n", authConfig.Token)
27
+	//authConfig := cfg.GetAuth()
28
+	//fmt.Printf("token: %s\n", authConfig.Token)
29 29
 
30 30
 	serviceConfig := cfg.GetService()
31 31
 	fmt.Printf("ReadTimeout: %d秒\n", serviceConfig.ReadTimeout)

読み込み中…
キャンセル
保存