@@ -33,7 +33,6 @@ type App struct {
3333 requestLogService * services.RequestLogService
3434 cronChecker * keypool.CronChecker
3535 keyPoolProvider * keypool.KeyProvider
36- leaderLock * store.LeaderLock
3736 proxyServer * proxy.ProxyServer
3837 storage store.Store
3938 db * gorm.DB
@@ -51,7 +50,6 @@ type AppParams struct {
5150 RequestLogService * services.RequestLogService
5251 CronChecker * keypool.CronChecker
5352 KeyPoolProvider * keypool.KeyProvider
54- LeaderLock * store.LeaderLock
5553 ProxyServer * proxy.ProxyServer
5654 Storage store.Store
5755 DB * gorm.DB
@@ -68,7 +66,6 @@ func NewApp(params AppParams) *App {
6866 requestLogService : params .RequestLogService ,
6967 cronChecker : params .CronChecker ,
7068 keyPoolProvider : params .KeyPoolProvider ,
71- leaderLock : params .LeaderLock ,
7269 proxyServer : params .ProxyServer ,
7370 storage : params .Storage ,
7471 db : params .DB ,
@@ -77,70 +74,50 @@ func NewApp(params AppParams) *App {
7774
7875// Start runs the application, it is a non-blocking call.
7976func (a * App ) Start () error {
77+ // Master 节点执行初始化
78+ if a .configManager .IsMaster () {
79+ logrus .Info ("Starting as Master Node." )
80+
81+ // 数据库迁移
82+ if err := a .db .AutoMigrate (
83+ & models.SystemSetting {},
84+ & models.Group {},
85+ & models.APIKey {},
86+ & models.RequestLog {},
87+ & models.GroupHourlyStat {},
88+ ); err != nil {
89+ return fmt .Errorf ("database auto-migration failed: %w" , err )
90+ }
91+ logrus .Info ("Database auto-migration completed." )
8092
81- // 启动 Leader Lock 服务并等待选举结果
82- if err := a .leaderLock .Start (); err != nil {
83- return fmt .Errorf ("leader service failed to start: %w" , err )
84- }
85-
86- // Leader 节点执行初始化,Follower 节点等待
87- if a .leaderLock .IsLeader () {
88- logrus .Info ("Leader mode. Performing initial one-time tasks..." )
89- acquired , err := a .leaderLock .AcquireInitializingLock ()
90- if err != nil {
91- return fmt .Errorf ("failed to acquire initializing lock: %w" , err )
93+ // 初始化系统设置
94+ if err := a .settingsManager .EnsureSettingsInitialized (); err != nil {
95+ return fmt .Errorf ("failed to initialize system settings: %w" , err )
9296 }
93- if ! acquired {
94- logrus .Warn ("Could not acquire initializing lock, another leader might be active. Switching to follower mode for initialization." )
95- if err := a .leaderLock .WaitForInitializationToComplete (); err != nil {
96- return fmt .Errorf ("failed to wait for initialization as a fallback follower: %w" , err )
97- }
98- } else {
99- defer a .leaderLock .ReleaseInitializingLock ()
100-
101- // 数据库迁移
102- if err := a .db .AutoMigrate (
103- & models.SystemSetting {},
104- & models.Group {},
105- & models.APIKey {},
106- & models.RequestLog {},
107- & models.GroupHourlyStat {},
108- ); err != nil {
109- return fmt .Errorf ("database auto-migration failed: %w" , err )
110- }
111- logrus .Info ("Database auto-migration completed." )
112-
113- // 初始化系统设置
114- if err := a .settingsManager .EnsureSettingsInitialized (); err != nil {
115- return fmt .Errorf ("failed to initialize system settings: %w" , err )
116- }
117- logrus .Info ("System settings initialized in DB." )
118-
119- a .settingsManager .Initialize (a .storage , a .groupManager , a .leaderLock )
120-
121- // 从数据库加载密钥到 Redis
122- if err := a .keyPoolProvider .LoadKeysFromDB (); err != nil {
123- return fmt .Errorf ("failed to load keys into key pool: %w" , err )
124- }
125- logrus .Debug ("API keys loaded into Redis cache by leader." )
97+ logrus .Info ("System settings initialized in DB." )
98+
99+ a .settingsManager .Initialize (a .storage , a .groupManager , a .configManager .IsMaster ())
100+
101+ // 从数据库加载密钥到 Redis
102+ if err := a .keyPoolProvider .LoadKeysFromDB (); err != nil {
103+ return fmt .Errorf ("failed to load keys into key pool: %w" , err )
126104 }
105+ logrus .Debug ("API keys loaded into Redis cache by master." )
106+
107+ // 仅 Master 节点启动的服务
108+ a .requestLogService .Start ()
109+ a .logCleanupService .Start ()
110+ a .cronChecker .Start ()
127111 } else {
128- logrus .Info ("Follower Mode. Waiting for leader to complete initialization." )
129- if err := a .leaderLock .WaitForInitializationToComplete (); err != nil {
130- return fmt .Errorf ("follower failed to start: %w" , err )
131- }
132- a .settingsManager .Initialize (a .storage , a .groupManager , a .leaderLock )
112+ logrus .Info ("Starting as Slave Node." )
113+ a .settingsManager .Initialize (a .storage , a .groupManager , a .configManager .IsMaster ())
133114 }
134115
135116 // 显示配置并启动所有后台服务
136117 a .configManager .DisplayServerConfig ()
137118
138119 a .groupManager .Initialize ()
139120
140- a .requestLogService .Start ()
141- a .logCleanupService .Start ()
142- a .cronChecker .Start ()
143-
144121 // Create HTTP server
145122 serverConfig := a .configManager .GetEffectiveServerConfig ()
146123 a .httpServer = & http.Server {
@@ -174,8 +151,6 @@ func (a *App) Stop(ctx context.Context) {
174151
175152 // 动态计算 HTTP 关机超时时间,为后台服务固定预留 5 秒
176153 httpShutdownTimeout := totalTimeout - 5 * time .Second
177-
178- // 为 HTTP 服务器的优雅关闭创建一个独立的 context
179154 httpShutdownCtx , cancelHttpShutdown := context .WithTimeout (context .Background (), httpShutdownTimeout )
180155 defer cancelHttpShutdown ()
181156
@@ -190,14 +165,18 @@ func (a *App) Stop(ctx context.Context) {
190165
191166 // 使用原始的总超时 context 继续关闭其他后台服务
192167 stoppableServices := []func (context.Context ){
193- a .cronChecker .Stop ,
194- a .leaderLock .Stop ,
195- a .logCleanupService .Stop ,
196- a .requestLogService .Stop ,
197168 a .groupManager .Stop ,
198169 a .settingsManager .Stop ,
199170 }
200171
172+ if serverConfig .IsMaster {
173+ stoppableServices = append (stoppableServices ,
174+ a .cronChecker .Stop ,
175+ a .logCleanupService .Stop ,
176+ a .requestLogService .Stop ,
177+ )
178+ }
179+
201180 var wg sync.WaitGroup
202181 wg .Add (len (stoppableServices ))
203182
@@ -221,7 +200,6 @@ func (a *App) Stop(ctx context.Context) {
221200 logrus .Warn ("Shutdown timed out, some services may not have stopped gracefully." )
222201 }
223202
224- // Step 3: Close storage connection last.
225203 if a .storage != nil {
226204 a .storage .Close ()
227205 }
0 commit comments