- Remove unused benchmark/tools package - Make ValidAlgorithms private (validAlgorithms) in loadbalance - Remove dead code (_ = result) in lua/api_socket_tcp.go - Fix code formatting with goimports Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
194 lines
5.8 KiB
Go
194 lines
5.8 KiB
Go
// Package server 提供服务器初始化函数。
|
||
//
|
||
// 该文件包含 Start() 方法中分离出的可测试初始化函数:
|
||
// - Goroutine 池初始化
|
||
// - 文件缓存初始化
|
||
// - Lua 引擎初始化
|
||
// - 错误页面管理器初始化
|
||
//
|
||
// 主要用途:
|
||
//
|
||
// 将 Start() 方法中的初始化逻辑分离,便于单元测试
|
||
//
|
||
// 注意事项:
|
||
// - 这些函数仅在 Server.Start() 内部调用
|
||
// - 分离后保持原逻辑不变,仅提取为独立函数
|
||
//
|
||
// 作者:xfy
|
||
package server
|
||
|
||
import (
|
||
"fmt"
|
||
"time"
|
||
|
||
"rua.plus/lolly/internal/cache"
|
||
"rua.plus/lolly/internal/config"
|
||
"rua.plus/lolly/internal/handler"
|
||
"rua.plus/lolly/internal/logging"
|
||
"rua.plus/lolly/internal/lua"
|
||
)
|
||
|
||
// initGoroutinePool 初始化 Goroutine 池。
|
||
//
|
||
// 根据配置创建并启动 Goroutine 池,用于优化请求处理性能。
|
||
//
|
||
// 参数:
|
||
// - cfg: 性能配置,包含 GoroutinePool 配置
|
||
//
|
||
// 返回值:
|
||
// - *GoroutinePool: 初始化的 Goroutine 池,未启用时返回 nil
|
||
func initGoroutinePool(cfg *config.PerformanceConfig) *GoroutinePool {
|
||
if cfg == nil || !cfg.GoroutinePool.Enabled {
|
||
return nil
|
||
}
|
||
|
||
pool := NewGoroutinePool(PoolConfig{
|
||
MaxWorkers: cfg.GoroutinePool.MaxWorkers,
|
||
MinWorkers: cfg.GoroutinePool.MinWorkers,
|
||
IdleTimeout: cfg.GoroutinePool.IdleTimeout,
|
||
})
|
||
pool.Start()
|
||
|
||
logging.Info().
|
||
Int("maxWorkers", cfg.GoroutinePool.MaxWorkers).
|
||
Int("minWorkers", cfg.GoroutinePool.MinWorkers).
|
||
Msg("Goroutine 池已启动")
|
||
|
||
return pool
|
||
}
|
||
|
||
// initFileCache 初始化文件缓存。
|
||
//
|
||
// 根据配置创建文件缓存实例,用于缓存静态文件内容。
|
||
//
|
||
// 参数:
|
||
// - cfg: 性能配置,包含 FileCache 配置
|
||
//
|
||
// 返回值:
|
||
// - *cache.FileCache: 初始化的文件缓存,未启用时返回 nil
|
||
func initFileCache(cfg *config.PerformanceConfig) *cache.FileCache {
|
||
// 检查是否配置了缓存
|
||
if cfg == nil || (cfg.FileCache.MaxEntries <= 0 && cfg.FileCache.MaxSize <= 0) {
|
||
return nil
|
||
}
|
||
|
||
fileCache := cache.NewFileCache(
|
||
cfg.FileCache.MaxEntries,
|
||
cfg.FileCache.MaxSize,
|
||
cfg.FileCache.Inactive,
|
||
)
|
||
|
||
logging.Info().
|
||
Int64("maxEntries", cfg.FileCache.MaxEntries).
|
||
Int64("maxSize", cfg.FileCache.MaxSize).
|
||
Msg("文件缓存已启动")
|
||
|
||
return fileCache
|
||
}
|
||
|
||
// initLuaEngine 初始化 Lua 引擎。
|
||
//
|
||
// 根据配置创建 Lua 引擎实例,用于执行 Lua 脚本。
|
||
//
|
||
// 参数:
|
||
// - luaCfg: Lua 中间件配置
|
||
//
|
||
// 返回值:
|
||
// - *lua.LuaEngine: 初始化的 Lua 引擎,未启用时返回 nil
|
||
// - error: 初始化过程中遇到的错误
|
||
func initLuaEngine(luaCfg *config.LuaMiddlewareConfig) (*lua.LuaEngine, error) {
|
||
if luaCfg == nil || !luaCfg.Enabled {
|
||
return nil, nil
|
||
}
|
||
|
||
engineCfg := &lua.Config{
|
||
MaxConcurrentCoroutines: luaCfg.GlobalSettings.MaxConcurrentCoroutines,
|
||
CoroutineTimeout: luaCfg.GlobalSettings.CoroutineTimeout,
|
||
CodeCacheSize: luaCfg.GlobalSettings.CodeCacheSize,
|
||
CodeCacheTTL: time.Hour, // 默认值
|
||
EnableFileWatch: luaCfg.GlobalSettings.EnableFileWatch,
|
||
MaxExecutionTime: luaCfg.GlobalSettings.MaxExecutionTime,
|
||
EnableOSLib: false, // 安全默认值
|
||
EnableIOLib: false,
|
||
EnableLoadLib: false,
|
||
LStatePoolInitialSize: luaCfg.GlobalSettings.LStatePoolInitialSize,
|
||
LStatePoolMaxSize: luaCfg.GlobalSettings.LStatePoolMaxSize,
|
||
}
|
||
|
||
// 设置协程栈优化选项
|
||
if luaCfg.GlobalSettings.CoroutineStackSize > 0 {
|
||
engineCfg.CoroutineStackSize = luaCfg.GlobalSettings.CoroutineStackSize
|
||
} else {
|
||
engineCfg.CoroutineStackSize = 64 // 默认优化值
|
||
}
|
||
engineCfg.MinimizeStackMemory = luaCfg.GlobalSettings.MinimizeStackMemory
|
||
if luaCfg.GlobalSettings.CoroutinePoolWarmup > 0 {
|
||
engineCfg.CoroutinePoolWarmup = luaCfg.GlobalSettings.CoroutinePoolWarmup
|
||
} else {
|
||
engineCfg.CoroutinePoolWarmup = 4 // 默认预热数量
|
||
}
|
||
|
||
// 设置默认值
|
||
if engineCfg.MaxConcurrentCoroutines == 0 {
|
||
engineCfg.MaxConcurrentCoroutines = 1000
|
||
}
|
||
if engineCfg.CoroutineTimeout == 0 {
|
||
engineCfg.CoroutineTimeout = 30 * time.Second
|
||
}
|
||
if engineCfg.CodeCacheSize == 0 {
|
||
engineCfg.CodeCacheSize = 1000
|
||
}
|
||
if engineCfg.MaxExecutionTime == 0 {
|
||
engineCfg.MaxExecutionTime = 30 * time.Second
|
||
}
|
||
if engineCfg.LStatePoolInitialSize == 0 {
|
||
engineCfg.LStatePoolInitialSize = 100
|
||
}
|
||
if engineCfg.LStatePoolMaxSize == 0 {
|
||
engineCfg.LStatePoolMaxSize = 1000
|
||
}
|
||
// EnableFileWatch 默认启用(用于 Lua 脚本热更新)
|
||
// 由于 bool 零值是 false,当配置未设置时默认启用文件监控
|
||
engineCfg.EnableFileWatch = true
|
||
|
||
engine, err := lua.NewEngine(engineCfg)
|
||
if err != nil {
|
||
return nil, fmt.Errorf("failed to initialize Lua engine: %w", err)
|
||
}
|
||
|
||
logging.Info().Msg("Lua engine started")
|
||
return engine, nil
|
||
}
|
||
|
||
// initErrorPageManager 初始化错误页面管理器。
|
||
//
|
||
// 根据配置创建错误页面管理器,用于加载和提供自定义错误页面。
|
||
//
|
||
// 参数:
|
||
// - errorPageCfg: 错误页面配置
|
||
//
|
||
// 返回值:
|
||
// - *handler.ErrorPageManager: 初始化的错误页面管理器,未配置时返回 nil
|
||
// - error: 初始化过程中遇到的错误
|
||
func initErrorPageManager(errorPageCfg *config.ErrorPageConfig) (*handler.ErrorPageManager, error) {
|
||
// 检查是否配置了错误页面
|
||
if errorPageCfg == nil || (len(errorPageCfg.Pages) == 0 && errorPageCfg.Default == "") {
|
||
return nil, nil
|
||
}
|
||
|
||
manager, err := handler.NewErrorPageManager(errorPageCfg)
|
||
if err != nil {
|
||
// 检查是否是部分加载失败
|
||
if _, ok := err.(*handler.PartialLoadError); ok {
|
||
logging.Warn().Msg("Some error pages failed to load: " + err.Error())
|
||
// 返回部分加载的管理器
|
||
return manager, nil
|
||
}
|
||
// 全部加载失败
|
||
return nil, fmt.Errorf("failed to load error pages: %w", err)
|
||
}
|
||
|
||
logging.Info().Msg("Error page manager started")
|
||
return manager, nil
|
||
}
|