refactor(proxy): 重构代理池并添加环境变量支持
-重构了代理配置结构体,更名为 Config - 添加了从环境变量读取代理列表的功能 - 更新了代理池相关代码,使用新的配置结构体 - 修改了 Heepay 相关代码,优化了商品信息处理
This commit is contained in:
@@ -1,6 +1,9 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"context"
|
||||
"gateway/internal/otelTrace"
|
||||
"go.uber.org/zap"
|
||||
"net"
|
||||
"os"
|
||||
"strings"
|
||||
@@ -32,6 +35,7 @@ func GetMQAddress() string {
|
||||
func GetProxyConfig() []string {
|
||||
// 获取环境变量的值
|
||||
value := os.Getenv("proxy")
|
||||
otelTrace.Logger.WithContext(context.Background()).Info("proxy", zap.Any("proxy", value))
|
||||
// 如果环境变量未设置或为空,返回空切片
|
||||
if value == "" {
|
||||
return []string{}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package proxy
|
||||
|
||||
// ProxyConfig 代理配置
|
||||
// Config 代理配置
|
||||
type Config struct {
|
||||
Proxies []string
|
||||
TestURL string
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
package proxy
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"gateway/internal/otelTrace"
|
||||
"time"
|
||||
)
|
||||
|
||||
@@ -35,7 +37,7 @@ func Example() {
|
||||
startTime := time.Now()
|
||||
proxy, err := pool.GetRandomProxy()
|
||||
if err != nil {
|
||||
fmt.Printf("获取代理失败: %v\n", err)
|
||||
otelTrace.Logger.WithContext(context.Background()).Error("获取代理失败")
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ package proxy
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/duke-git/lancet/v2/slice"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"sync"
|
||||
@@ -93,9 +94,19 @@ func (p *Pool) GetRandomProxy() (*Proxy, error) {
|
||||
|
||||
// 过滤出有效的代理
|
||||
validProxies := make([]*Proxy, 0)
|
||||
|
||||
slice.SortBy(p.proxies, func(a, b *Proxy) bool {
|
||||
return a.UseCount < b.UseCount
|
||||
})
|
||||
|
||||
var selectedProxy *Proxy
|
||||
|
||||
for _, proxy := range p.proxies {
|
||||
_ = p.TestProxy(proxy)
|
||||
if proxy.IsValid && time.Since(proxy.LastTest) < time.Duration(p.config.Timeout)*time.Second {
|
||||
validProxies = append(validProxies, proxy)
|
||||
selectedProxy = proxy
|
||||
proxy.UseCount += 1
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
@@ -103,16 +114,6 @@ func (p *Pool) GetRandomProxy() (*Proxy, error) {
|
||||
return nil, fmt.Errorf("no valid proxies available")
|
||||
}
|
||||
|
||||
// 选择使用次数最少的代理
|
||||
var selectedProxy *Proxy
|
||||
minUseCount := int64(1 << 62)
|
||||
for _, proxy := range validProxies {
|
||||
if proxy.UseCount < minUseCount {
|
||||
minUseCount = proxy.UseCount
|
||||
selectedProxy = proxy
|
||||
}
|
||||
}
|
||||
|
||||
return selectedProxy, nil
|
||||
}
|
||||
|
||||
@@ -179,7 +180,7 @@ func (p *Pool) UpdateProxies() {
|
||||
}
|
||||
|
||||
// GetProxyStats 获取代理统计信息
|
||||
func (p *Pool) GetProxyStats() []map[string]interface{} {
|
||||
func (p *Pool) GetProxyStats() []map[string]any {
|
||||
p.mu.RLock()
|
||||
defer p.mu.RUnlock()
|
||||
|
||||
|
||||
2
main.go
2
main.go
@@ -11,12 +11,12 @@ import (
|
||||
_ "gateway/internal/service/message"
|
||||
"gateway/internal/service/notify"
|
||||
_ "gateway/internal/service/supplier/third_party"
|
||||
"github.com/beego/beego/v2/server/web"
|
||||
"log"
|
||||
_ "net/http/pprof"
|
||||
|
||||
"github.com/beego/beego/v2/server/web/context"
|
||||
|
||||
"github.com/beego/beego/v2/server/web"
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user