feat: 初始化多机器人服务端项目框架
基于Go语言构建多机器人服务端框架,包含配置管理、事件总线、依赖注入等核心模块 添加项目基础结构、README、gitignore和初始代码实现
This commit is contained in:
11
internal/di/app.go
Normal file
11
internal/di/app.go
Normal file
@@ -0,0 +1,11 @@
|
||||
package di
|
||||
|
||||
import "go.uber.org/fx"
|
||||
|
||||
// NewApp 创建应用实例
|
||||
func NewApp() *fx.App {
|
||||
return fx.New(
|
||||
Providers,
|
||||
Lifecycle,
|
||||
)
|
||||
}
|
||||
77
internal/di/lifecycle.go
Normal file
77
internal/di/lifecycle.go
Normal file
@@ -0,0 +1,77 @@
|
||||
package di
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"cellbot/internal/engine"
|
||||
"cellbot/internal/protocol"
|
||||
"cellbot/pkg/net"
|
||||
"go.uber.org/fx"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
// RegisterLifecycleHooks 注册应用生命周期钩子
|
||||
func RegisterLifecycleHooks(
|
||||
logger *zap.Logger,
|
||||
eventBus *engine.EventBus,
|
||||
dispatcher *engine.Dispatcher,
|
||||
botManager *protocol.BotManager,
|
||||
server *net.Server,
|
||||
) fx.Option {
|
||||
return fx.Invoke(
|
||||
func(lc fx.Lifecycle) {
|
||||
lc.Append(fx.Hook{
|
||||
OnStart: func(ctx context.Context) error {
|
||||
logger.Info("Starting CellBot application...")
|
||||
|
||||
// 启动事件总线
|
||||
eventBus.Start()
|
||||
|
||||
// 启动分发器
|
||||
dispatcher.Start(ctx)
|
||||
|
||||
// 启动所有机器人
|
||||
if err := botManager.StartAll(ctx); err != nil {
|
||||
logger.Error("Failed to start bots", zap.Error(err))
|
||||
}
|
||||
|
||||
// 启动HTTP服务器
|
||||
if err := server.Start(); err != nil {
|
||||
logger.Error("Failed to start server", zap.Error(err))
|
||||
return err
|
||||
}
|
||||
|
||||
logger.Info("CellBot application started successfully")
|
||||
return nil
|
||||
},
|
||||
OnStop: func(ctx context.Context) error {
|
||||
logger.Info("Stopping CellBot application...")
|
||||
|
||||
// 停止HTTP服务器
|
||||
if err := server.Stop(); err != nil {
|
||||
logger.Error("Failed to stop server", zap.Error(err))
|
||||
}
|
||||
|
||||
// 停止所有机器人
|
||||
if err := botManager.StopAll(ctx); err != nil {
|
||||
logger.Error("Failed to stop bots", zap.Error(err))
|
||||
}
|
||||
|
||||
// 停止分发器
|
||||
dispatcher.Stop()
|
||||
|
||||
// 停止事件总线
|
||||
eventBus.Stop()
|
||||
|
||||
logger.Info("CellBot application stopped successfully")
|
||||
return nil
|
||||
},
|
||||
})
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
// Lifecycle 生命周期管理选项
|
||||
var Lifecycle = fx.Options(
|
||||
fx.Invoke(RegisterLifecycleHooks),
|
||||
)
|
||||
70
internal/di/providers.go
Normal file
70
internal/di/providers.go
Normal file
@@ -0,0 +1,70 @@
|
||||
package di
|
||||
|
||||
import (
|
||||
"cellbot/internal/config"
|
||||
"cellbot/internal/engine"
|
||||
"cellbot/internal/protocol"
|
||||
"cellbot/pkg/net"
|
||||
"go.uber.org/fx"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
// ProvideLogger 提供日志实例
|
||||
func ProvideLogger(cfg *config.Config) (*zap.Logger, error) {
|
||||
return config.InitLogger(&cfg.Log)
|
||||
}
|
||||
|
||||
// ProvideConfig 提供配置实例
|
||||
func ProvideConfig() (*config.Config, error) {
|
||||
configManager := config.NewConfigManager("configs/config.toml", zap.NewNop())
|
||||
if err := configManager.Load(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return configManager.Get(), nil
|
||||
}
|
||||
|
||||
// ProvideConfigManager 提供配置管理器
|
||||
func ProvideConfigManager(logger *zap.Logger) (*config.ConfigManager, error) {
|
||||
configManager := config.NewConfigManager("configs/config.toml", logger)
|
||||
if err := configManager.Load(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// 启动配置文件监听
|
||||
if err := configManager.Watch(); err != nil {
|
||||
logger.Warn("Failed to watch config file", zap.Error(err))
|
||||
}
|
||||
return configManager, nil
|
||||
}
|
||||
|
||||
// ProvideEventBus 提供事件总线
|
||||
func ProvideEventBus(logger *zap.Logger) *engine.EventBus {
|
||||
return engine.NewEventBus(logger, 10000)
|
||||
}
|
||||
|
||||
// ProvideDispatcher 提供事件分发器
|
||||
func ProvideDispatcher(eventBus *engine.EventBus, logger *zap.Logger) *engine.Dispatcher {
|
||||
return engine.NewDispatcher(eventBus, logger)
|
||||
}
|
||||
|
||||
// ProvideBotManager 提供机器人管理器
|
||||
func ProvideBotManager(logger *zap.Logger) *protocol.BotManager {
|
||||
return protocol.NewBotManager(logger)
|
||||
}
|
||||
|
||||
// ProvideServer 提供HTTP服务器
|
||||
func ProvideServer(cfg *config.Config, logger *zap.Logger, botManager *protocol.BotManager, eventBus *engine.EventBus) *net.Server {
|
||||
return net.NewServer(cfg.Server.Host, cfg.Server.Port, logger, botManager, eventBus)
|
||||
}
|
||||
|
||||
// Providers 依赖注入提供者列表
|
||||
var Providers = fx.Options(
|
||||
fx.Provide(
|
||||
ProvideConfig,
|
||||
ProvideConfigManager,
|
||||
ProvideLogger,
|
||||
ProvideEventBus,
|
||||
ProvideDispatcher,
|
||||
ProvideBotManager,
|
||||
ProvideServer,
|
||||
),
|
||||
)
|
||||
Reference in New Issue
Block a user