.gitignore

This commit is contained in:
2026-01-31 18:37:54 +08:00
parent f06730e5bb
commit 9aa9b92326
6 changed files with 1113 additions and 3 deletions

74
main.go Normal file
View File

@@ -0,0 +1,74 @@
package main
import (
"context"
"fmt"
netHttp "net/http"
"net/http/httputil"
"net/url"
"strings"
"gitee.com/red-future---jilin-g/common/consul"
"gitee.com/red-future---jilin-g/common/http"
"gitee.com/red-future---jilin-g/common/middleware"
_ "gitee.com/red-future---jilin-g/common/swagger"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
func StartServerProxy() {
// 初始化Sentinel熔断器
err := middleware.InitCircuitBreaker()
if err != nil {
g.Log().Errorf(context.Background(), "熔断器初始化失败: %v", err)
panic("熔断器初始化失败")
}
// 绑定中间件CORS -> IP限流 -> 用户限流 -> 熔断降级 -> 服务限流 -> 全局限流
http.Httpserver.BindMiddlewareDefault(
ghttp.MiddlewareCORS,
middleware.IPLimiter, // IP限流(防DDoS)
middleware.UserLimiter, // 用户限流(防止单用户滥用)
middleware.CircuitBreakerMiddleware, // ⭐ 熔断降级(保护后端服务)
middleware.ServiceLimiter, // 服务限流(保护微服务)
middleware.GlobalLimiter, // Redis全局限流(分布式支持)
) //使用默认http返回结构
// 熔断器健康检查接口
http.Httpserver.BindHandler("/circuit-breaker/health", middleware.CircuitBreakerHealthCheckHandler)
// 熔断器手动重置接口(仅限管理后台调用)
http.Httpserver.BindHandler("/circuit-breaker/reset", middleware.CircuitBreakerResetHandler)
// 熔断器配置重载接口
http.Httpserver.BindHandler("/circuit-breaker/reload", middleware.CircuitBreakerReloadHandler)
http.Httpserver.BindHandler("/*", func(r *ghttp.Request) {
g.Log().Debugf(r.GetCtx(), "url:%s", r.RequestURI)
serverName := strings.Split(r.RequestURI, "/")[1]
instanceAddr, err := consul.GetInstanceAddr(r.GetCtx(), serverName)
if err != nil {
g.Log().Errorf(r.GetCtx(), "serverName:%s不可用", serverName)
r.Response.Status = 503
r.Response.WriteJsonExit(map[string]interface{}{
"success": false,
"code": 503,
"message": fmt.Sprintf("服务 '%s' 暂时不可用", serverName),
})
return
}
r.Request.URL.Path = strings.Replace(r.Request.URL.Path, fmt.Sprintf("%s/", serverName), "", 1)
r.MakeBodyRepeatableRead(false)
u, _ := url.Parse(fmt.Sprintf("%s://%s", "http", instanceAddr))
proxy := httputil.NewSingleHostReverseProxy(u)
proxy.ErrorHandler = func(writer netHttp.ResponseWriter, request *netHttp.Request, e error) {
writer.WriteHeader(netHttp.StatusBadGateway)
}
proxy.ServeHTTP(r.Response.Writer, r.Request)
})
}
func main() {
StartServerProxy()
http.Httpserver.Run()
// select {}
}