7efc72b362
1. ✅ 监控指标收集 2. ✅ 中间件机制 3. ✅ 配置热更新 4. ✅ 优雅关闭 5. ✅ 插件系统 6. ✅ API文档 7. ✅ 认证授权系统 8. ✅ 请求/响应压缩优化
184 lines
5.4 KiB
Go
184 lines
5.4 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"os/signal"
|
|
"strings"
|
|
"syscall"
|
|
"time"
|
|
|
|
"github.com/darkit/goproxy/internal/config"
|
|
"github.com/darkit/goproxy/internal/proxy"
|
|
"github.com/darkit/goproxy/internal/reverse"
|
|
"github.com/darkit/goproxy/internal/rule"
|
|
)
|
|
|
|
var (
|
|
// 监听地址
|
|
addr = flag.String("addr", ":8080", "反向代理服务器监听地址")
|
|
// 后端服务器
|
|
backend = flag.String("backend", "192.168.1.212:80", "后端服务器地址")
|
|
// 路由规则文件
|
|
routeFile = flag.String("route-file", "", "路由规则文件路径")
|
|
// 是否启用URL重写
|
|
enableRewrite = flag.Bool("enable-rewrite", false, "是否启用URL重写")
|
|
// 是否启用缓存
|
|
enableCache = flag.Bool("enable-cache", false, "是否启用缓存")
|
|
// 是否启用压缩
|
|
enableCompression = flag.Bool("enable-compression", false, "是否启用压缩")
|
|
// 是否启用监控
|
|
enableMetrics = flag.Bool("enable-metrics", false, "是否启用监控")
|
|
// 监控地址
|
|
metricsAddr = flag.String("metrics-addr", ":8082", "监控服务器监听地址")
|
|
// 是否添加X-Forwarded-For
|
|
addXForwardedFor = flag.Bool("add-x-forwarded-for", true, "是否添加X-Forwarded-For头")
|
|
// 是否添加X-Real-IP
|
|
addXRealIP = flag.Bool("add-x-real-ip", true, "是否添加X-Real-IP头")
|
|
// 是否启用CORS
|
|
enableCORS = flag.Bool("enable-cors", false, "是否启用CORS")
|
|
// 路径前缀
|
|
pathPrefix = flag.String("path-prefix", "", "路径前缀,将从请求路径中移除")
|
|
)
|
|
|
|
func main() {
|
|
// 解析命令行参数
|
|
flag.Parse()
|
|
|
|
// 创建配置
|
|
cfg := config.DefaultConfig()
|
|
cfg.ReverseProxy = true
|
|
cfg.EnableCache = *enableCache
|
|
cfg.EnableCompression = *enableCompression
|
|
cfg.EnableURLRewrite = *enableRewrite
|
|
cfg.AddXForwardedFor = *addXForwardedFor
|
|
cfg.AddXRealIP = *addXRealIP
|
|
cfg.EnableCORS = *enableCORS
|
|
cfg.ReverseProxyRulesFile = *routeFile
|
|
|
|
// 创建反向代理配置
|
|
reverseCfg := reverse.DefaultConfig()
|
|
reverseCfg.ListenAddr = *addr
|
|
reverseCfg.BaseConfig.EnableCompression = *enableCompression
|
|
reverseCfg.BaseConfig.EnableCORS = *enableCORS
|
|
reverseCfg.BaseConfig.AddXForwardedFor = *addXForwardedFor
|
|
reverseCfg.BaseConfig.AddXRealIP = *addXRealIP
|
|
|
|
// 创建规则管理器
|
|
ruleManager := rule.NewManager(nil)
|
|
|
|
// 如果有路径前缀,添加重写规则
|
|
if *pathPrefix != "" {
|
|
log.Printf("添加路径重写规则: 从请求路径移除前缀 %s\n", *pathPrefix)
|
|
rewriteRule := &rule.RewriteRule{
|
|
BaseRule: rule.BaseRule{
|
|
ID: "path-prefix-rewrite",
|
|
Type: rule.RuleTypeRewrite,
|
|
Priority: 100,
|
|
Pattern: *pathPrefix,
|
|
MatchType: rule.MatchTypePath,
|
|
Enabled: true,
|
|
},
|
|
Replacement: "",
|
|
}
|
|
if err := ruleManager.AddRule(rewriteRule); err != nil {
|
|
log.Printf("添加重写规则失败: %v", err)
|
|
}
|
|
}
|
|
|
|
// 创建反向代理
|
|
reverseProxy, err := reverse.New(reverseCfg)
|
|
if err != nil {
|
|
log.Fatalf("创建反向代理失败: %v", err)
|
|
}
|
|
|
|
// 创建HTTP服务器
|
|
server := &http.Server{
|
|
Addr: *addr,
|
|
Handler: reverseProxy,
|
|
}
|
|
|
|
// 启动HTTP服务器
|
|
go func() {
|
|
log.Printf("反向代理服务器启动在 %s,后端服务器为 %s\n", *addr, *backend)
|
|
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
|
log.Fatalf("代理服务器启动失败: %v", err)
|
|
}
|
|
}()
|
|
|
|
// 等待信号
|
|
quit := make(chan os.Signal, 1)
|
|
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
|
|
<-quit
|
|
|
|
log.Println("正在关闭代理服务器...")
|
|
server.Close()
|
|
log.Println("代理服务器已关闭")
|
|
}
|
|
|
|
// ReverseProxyDelegate 反向代理委托
|
|
type ReverseProxyDelegate struct {
|
|
proxy.DefaultDelegate
|
|
backend string
|
|
prefix string
|
|
}
|
|
|
|
// ResolveBackend 解析后端服务器
|
|
func (d *ReverseProxyDelegate) ResolveBackend(req *http.Request) (string, error) {
|
|
// 这里可以实现基于请求路径、主机名等的路由逻辑
|
|
return d.backend, nil
|
|
}
|
|
|
|
// ModifyRequest 修改请求
|
|
func (d *ReverseProxyDelegate) ModifyRequest(req *http.Request) {
|
|
// 移除路径前缀
|
|
if d.prefix != "" && strings.HasPrefix(req.URL.Path, d.prefix) {
|
|
req.URL.Path = strings.TrimPrefix(req.URL.Path, d.prefix)
|
|
if req.URL.Path == "" {
|
|
req.URL.Path = "/"
|
|
}
|
|
}
|
|
|
|
// 添加自定义请求头
|
|
req.Header.Set("X-Proxy-Time", time.Now().Format(time.RFC3339))
|
|
}
|
|
|
|
// ModifyResponse 修改响应
|
|
func (d *ReverseProxyDelegate) ModifyResponse(resp *http.Response) error {
|
|
// 添加自定义响应头
|
|
resp.Header.Set("X-Proxied-By", "GoProxy")
|
|
return nil
|
|
}
|
|
|
|
// Connect 连接事件
|
|
func (d *ReverseProxyDelegate) Connect(ctx *proxy.Context, rw http.ResponseWriter) {
|
|
log.Printf("收到连接: %s -> %s %s\n", ctx.Req.RemoteAddr, ctx.Req.Method, ctx.Req.URL.Path)
|
|
}
|
|
|
|
// BeforeRequest 请求前事件
|
|
func (d *ReverseProxyDelegate) BeforeRequest(ctx *proxy.Context) {
|
|
log.Printf("处理请求: %s %s\n", ctx.Req.Method, ctx.Req.URL.Path)
|
|
}
|
|
|
|
// BeforeResponse 响应前事件
|
|
func (d *ReverseProxyDelegate) BeforeResponse(ctx *proxy.Context, resp *http.Response, err error) {
|
|
if err != nil {
|
|
log.Printf("响应错误: %v\n", err)
|
|
return
|
|
}
|
|
log.Printf("响应: %d %s\n", resp.StatusCode, resp.Status)
|
|
}
|
|
|
|
// ErrorLog 错误日志
|
|
func (d *ReverseProxyDelegate) ErrorLog(err error) {
|
|
log.Printf("错误: %v\n", err)
|
|
}
|
|
|
|
// HandleError 处理错误
|
|
func (d *ReverseProxyDelegate) HandleError(rw http.ResponseWriter, req *http.Request, err error) {
|
|
log.Printf("处理错误: %v\n", err)
|
|
http.Error(rw, "代理服务器错误: "+err.Error(), http.StatusBadGateway)
|
|
}
|