refactor(server): extract createProxyForConfig helper
- 新增 createProxyForConfig 统一代理创建逻辑 - 重构 registerProxyRoutesWithLocationEngine 和 registerProxyRoutes - 消除约 40 行重复代码 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
7eaea845e7
commit
d25c7b21a6
@ -12,6 +12,53 @@ import (
|
|||||||
"rua.plus/lolly/internal/proxy"
|
"rua.plus/lolly/internal/proxy"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// createProxyForConfig 创建代理实例并配置健康检查。
|
||||||
|
// 返回创建的代理实例,如果创建失败则返回 nil。
|
||||||
|
func (s *Server) createProxyForConfig(proxyCfg *config.ProxyConfig) *proxy.Proxy {
|
||||||
|
// 转换目标
|
||||||
|
targets := make([]*loadbalance.Target, len(proxyCfg.Targets))
|
||||||
|
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())
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置 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)
|
||||||
|
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
// registerProxyRoutesWithLocationEngine 使用 LocationEngine 注册代理路由。
|
// registerProxyRoutesWithLocationEngine 使用 LocationEngine 注册代理路由。
|
||||||
//
|
//
|
||||||
// 根据配置为 LocationEngine 注册代理路径,创建代理处理器和健康检查器。
|
// 根据配置为 LocationEngine 注册代理路径,创建代理处理器和健康检查器。
|
||||||
@ -20,47 +67,11 @@ func (s *Server) registerProxyRoutesWithLocationEngine(serverCfg *config.ServerC
|
|||||||
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)
|
|
||||||
|
|
||||||
// 根据 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/* 所有子路径
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user