refactor(server): extract createProxyForConfig helper

- 新增 createProxyForConfig 统一代理创建逻辑
- 重构 registerProxyRoutesWithLocationEngine 和 registerProxyRoutes
- 消除约 40 行重复代码

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
xfy 2026-04-29 17:52:40 +08:00
parent 7eaea845e7
commit d25c7b21a6

View File

@ -12,14 +12,9 @@ import (
"rua.plus/lolly/internal/proxy" "rua.plus/lolly/internal/proxy"
) )
// registerProxyRoutesWithLocationEngine 使用 LocationEngine 注册代理路由。 // createProxyForConfig 创建代理实例并配置健康检查。
// // 返回创建的代理实例,如果创建失败则返回 nil。
// 根据配置为 LocationEngine 注册代理路径,创建代理处理器和健康检查器。 func (s *Server) createProxyForConfig(proxyCfg *config.ProxyConfig) *proxy.Proxy {
// 支持通过 LocationType 配置不同的匹配方式。
func (s *Server) registerProxyRoutesWithLocationEngine(serverCfg *config.ServerConfig) {
for i := range serverCfg.Proxy {
proxyCfg := &serverCfg.Proxy[i]
// 转换目标 // 转换目标
targets := make([]*loadbalance.Target, len(proxyCfg.Targets)) targets := make([]*loadbalance.Target, len(proxyCfg.Targets))
for j, t := range proxyCfg.Targets { for j, t := range proxyCfg.Targets {
@ -38,7 +33,7 @@ func (s *Server) registerProxyRoutesWithLocationEngine(serverCfg *config.ServerC
p, err := proxy.NewProxy(proxyCfg, targets, &s.config.Performance.Transport, s.luaEngine) p, err := proxy.NewProxy(proxyCfg, targets, &s.config.Performance.Transport, s.luaEngine)
if err != nil { if err != nil {
logging.Error().Msg("Failed to create proxy: " + err.Error()) logging.Error().Msg("Failed to create proxy: " + err.Error())
continue return nil
} }
// 设置 DNS 解析器(如果已配置) // 设置 DNS 解析器(如果已配置)
@ -61,6 +56,22 @@ func (s *Server) registerProxyRoutesWithLocationEngine(serverCfg *config.ServerC
// 保存代理实例用于缓存统计 // 保存代理实例用于缓存统计
s.proxies = append(s.proxies, p) s.proxies = append(s.proxies, p)
return p
}
// registerProxyRoutesWithLocationEngine 使用 LocationEngine 注册代理路由。
//
// 根据配置为 LocationEngine 注册代理路径,创建代理处理器和健康检查器。
// 支持通过 LocationType 配置不同的匹配方式。
func (s *Server) registerProxyRoutesWithLocationEngine(serverCfg *config.ServerConfig) {
for i := range serverCfg.Proxy {
proxyCfg := &serverCfg.Proxy[i]
p := s.createProxyForConfig(proxyCfg)
if p == nil {
continue
}
// 根据 LocationType 注册路由 // 根据 LocationType 注册路由
locType := proxyCfg.LocationType locType := proxyCfg.LocationType
if locType == "" { if locType == "" {
@ -162,47 +173,11 @@ func (s *Server) registerProxyRoutes(router *handler.Router, serverCfg *config.S
for i := range serverCfg.Proxy { for i := range serverCfg.Proxy {
proxyCfg := &serverCfg.Proxy[i] proxyCfg := &serverCfg.Proxy[i]
// 转换目标 p := s.createProxyForConfig(proxyCfg)
targets := make([]*loadbalance.Target, len(proxyCfg.Targets)) if p == nil {
for j, t := range proxyCfg.Targets {
failTimeout := t.FailTimeout
if t.MaxFails > 0 && failTimeout == 0 {
failTimeout = 10 * time.Second
}
targets[j] = loadbalance.NewTargetFromConfig(
t.URL, t.Weight,
int64(t.MaxConns), int64(t.MaxFails), failTimeout,
t.Backup, t.Down, t.ProxyURI,
)
}
// 传递 Transport 配置和 Lua 引擎
p, err := proxy.NewProxy(proxyCfg, targets, &s.config.Performance.Transport, s.luaEngine)
if err != nil {
logging.Error().Msg("Failed to create proxy: " + err.Error())
continue continue
} }
// 设置 DNS 解析器(如果已配置)
if s.resolver != nil {
p.SetResolver(s.resolver)
if err := p.Start(); err != nil {
logging.Error().Err(err).Msg("Failed to start proxy")
}
}
// 启动健康检查
if proxyCfg.HealthCheck.Interval > 0 {
hc := proxy.NewHealthChecker(targets, &proxyCfg.HealthCheck)
hc.Start()
s.healthCheckers = append(s.healthCheckers, hc)
// 设置被动健康检查
p.SetHealthChecker(hc)
}
// 保存代理实例用于缓存统计
s.proxies = append(s.proxies, p)
// 使用前缀匹配(通配符)注册代理路由 // 使用前缀匹配(通配符)注册代理路由
// path: / 匹配所有子路径如 /sorry/index // path: / 匹配所有子路径如 /sorry/index
// path: /api/ 匹配 /api/* 所有子路径 // path: /api/ 匹配 /api/* 所有子路径