mirror of
https://github.com/woodchen-ink/proxy-go.git
synced 2025-07-18 08:31:55 +08:00
- Removed the MetricsHistoryHandler and associated historical data export functionality to streamline the metrics handling process. - Updated the metrics template to improve label translations and ensure default values are used for optional data fields. - Enhanced the JavaScript code for metrics display by adding checks for undefined data arrays, improving robustness. - Cleaned up unused variables and functions to maintain code clarity and reduce complexity. These changes simplify the metrics system by eliminating outdated features and improving the overall reliability of data presentation.
132 lines
3.0 KiB
Go
132 lines
3.0 KiB
Go
package main
|
|
|
|
import (
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"os/signal"
|
|
"proxy-go/internal/compression"
|
|
"proxy-go/internal/config"
|
|
"proxy-go/internal/constants"
|
|
"proxy-go/internal/handler"
|
|
"proxy-go/internal/metrics"
|
|
"proxy-go/internal/middleware"
|
|
"strings"
|
|
"syscall"
|
|
)
|
|
|
|
func main() {
|
|
// 加载配置
|
|
cfg, err := config.Load("data/config.json")
|
|
if err != nil {
|
|
log.Fatal("Error loading config:", err)
|
|
}
|
|
|
|
// 更新常量配置
|
|
constants.UpdateFromConfig(cfg)
|
|
|
|
// 初始化指标收集器
|
|
if err := metrics.InitCollector(cfg); err != nil {
|
|
log.Fatal("Error initializing metrics collector:", err)
|
|
}
|
|
|
|
// 创建压缩管理器
|
|
compManager := compression.NewManager(compression.Config{
|
|
Gzip: compression.CompressorConfig(cfg.Compression.Gzip),
|
|
Brotli: compression.CompressorConfig(cfg.Compression.Brotli),
|
|
})
|
|
|
|
// 创建代理处理器
|
|
mirrorHandler := handler.NewMirrorProxyHandler()
|
|
proxyHandler := handler.NewProxyHandler(cfg)
|
|
|
|
// 创建处理器链
|
|
handlers := []struct {
|
|
matcher func(*http.Request) bool
|
|
handler http.Handler
|
|
}{
|
|
// Mirror代理处理器
|
|
{
|
|
matcher: func(r *http.Request) bool {
|
|
return strings.HasPrefix(r.URL.Path, "/mirror/")
|
|
},
|
|
handler: mirrorHandler,
|
|
},
|
|
// 固定路径处理器
|
|
{
|
|
matcher: func(r *http.Request) bool {
|
|
for _, fp := range cfg.FixedPaths {
|
|
if strings.HasPrefix(r.URL.Path, fp.Path) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
},
|
|
handler: middleware.FixedPathProxyMiddleware(cfg.FixedPaths)(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {})),
|
|
},
|
|
// 默认代理处理器
|
|
{
|
|
matcher: func(r *http.Request) bool {
|
|
return true // 总是匹配,作为默认处理器
|
|
},
|
|
handler: proxyHandler,
|
|
},
|
|
}
|
|
|
|
// 创建主处理器
|
|
mainHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
// 先处理监控路由
|
|
switch r.URL.Path {
|
|
case "/metrics":
|
|
proxyHandler.AuthMiddleware(proxyHandler.MetricsHandler)(w, r)
|
|
return
|
|
case "/metrics/ui":
|
|
proxyHandler.MetricsPageHandler(w, r)
|
|
return
|
|
case "/metrics/auth":
|
|
proxyHandler.MetricsAuthHandler(w, r)
|
|
return
|
|
case "/metrics/dashboard":
|
|
proxyHandler.MetricsDashboardHandler(w, r)
|
|
return
|
|
}
|
|
|
|
// 遍历所有处理器
|
|
for _, h := range handlers {
|
|
if h.matcher(r) {
|
|
h.handler.ServeHTTP(w, r)
|
|
return
|
|
}
|
|
}
|
|
})
|
|
|
|
// 添加压缩中间件
|
|
var handler http.Handler = mainHandler
|
|
if cfg.Compression.Gzip.Enabled || cfg.Compression.Brotli.Enabled {
|
|
handler = middleware.CompressionMiddleware(compManager)(handler)
|
|
}
|
|
|
|
// 创建服务器
|
|
server := &http.Server{
|
|
Addr: ":80",
|
|
Handler: handler,
|
|
}
|
|
|
|
// 优雅关闭
|
|
go func() {
|
|
sigChan := make(chan os.Signal, 1)
|
|
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
|
|
<-sigChan
|
|
log.Println("Shutting down server...")
|
|
if err := server.Close(); err != nil {
|
|
log.Printf("Error during server shutdown: %v\n", err)
|
|
}
|
|
}()
|
|
|
|
// 启动服务器
|
|
log.Println("Starting proxy server on :80")
|
|
if err := server.ListenAndServe(); err != http.ErrServerClosed {
|
|
log.Fatal("Error starting server:", err)
|
|
}
|
|
}
|