reverse proxy refactor and bug fixes

- fix prometheus metrics for load balanced routes
- route will now fail when health monitor fail to start
This commit is contained in:
yusing 2025-02-04 05:12:52 +08:00
parent 1e413ae215
commit c90e0db30d

View file

@ -3,7 +3,6 @@ package route
import ( import (
"net/http" "net/http"
"github.com/rs/zerolog"
"github.com/yusing/go-proxy/internal/api/v1/favicon" "github.com/yusing/go-proxy/internal/api/v1/favicon"
"github.com/yusing/go-proxy/internal/common" "github.com/yusing/go-proxy/internal/common"
"github.com/yusing/go-proxy/internal/docker" "github.com/yusing/go-proxy/internal/docker"
@ -30,13 +29,10 @@ type (
HealthMon health.HealthMonitor `json:"health,omitempty"` HealthMon health.HealthMonitor `json:"health,omitempty"`
loadBalancer *loadbalancer.LoadBalancer loadBalancer *loadbalancer.LoadBalancer
server loadbalancer.Server
handler http.Handler handler http.Handler
rp *reverseproxy.ReverseProxy rp *reverseproxy.ReverseProxy
task *task.Task task *task.Task
l zerolog.Logger
} }
) )
@ -67,10 +63,6 @@ func NewReverseProxyRoute(base *Route) (*ReveseProxyRoute, E.Error) {
r := &ReveseProxyRoute{ r := &ReveseProxyRoute{
Route: base, Route: base,
rp: rp, rp: rp,
l: logging.With().
Str("type", string(base.Scheme)).
Str("name", service).
Logger(),
} }
return r, nil return r, nil
} }
@ -125,7 +117,7 @@ func (r *ReveseProxyRoute) Start(parent task.Parent) E.Error {
default: default:
logging.Warn(). logging.Warn().
Str("route", r.TargetName()). Str("route", r.TargetName()).
Msg("`path_patterns` is deprecated. Use `rules` instead.") Msg("`path_patterns` for reverse proxy is deprecated. Use `rules` instead.")
mux := gphttp.NewServeMux() mux := gphttp.NewServeMux()
patErrs := E.NewBuilder("invalid path pattern(s)") patErrs := E.NewBuilder("invalid path pattern(s)")
for _, p := range pathPatterns { for _, p := range pathPatterns {
@ -145,10 +137,16 @@ func (r *ReveseProxyRoute) Start(parent task.Parent) E.Error {
if r.HealthMon != nil { if r.HealthMon != nil {
if err := r.HealthMon.Start(r.task); err != nil { if err := r.HealthMon.Start(r.task); err != nil {
E.LogWarn("health monitor error", err, &r.l) return err
} }
} }
if common.PrometheusEnabled {
metricsLogger := metricslogger.NewMetricsLogger(r.TargetName())
r.handler = metricsLogger.GetHandler(r.handler)
r.task.OnCancel("reset_metrics", metricsLogger.ResetMetrics)
}
if r.UseLoadBalance() { if r.UseLoadBalance() {
r.addToLoadBalancer(parent) r.addToLoadBalancer(parent)
} else { } else {
@ -158,12 +156,6 @@ func (r *ReveseProxyRoute) Start(parent task.Parent) E.Error {
}) })
} }
if common.PrometheusEnabled {
metricsLogger := metricslogger.NewMetricsLogger(r.TargetName())
r.handler = metricsLogger.GetHandler(r.handler)
r.task.OnCancel("reset_metrics", metricsLogger.ResetMetrics)
}
r.task.OnCancel("reset_favicon", func() { favicon.PruneRouteIconCache(r) }) r.task.OnCancel("reset_favicon", func() { favicon.PruneRouteIconCache(r) })
return nil return nil
} }
@ -200,9 +192,7 @@ func (r *ReveseProxyRoute) addToLoadBalancer(parent task.Parent) {
} }
} else { } else {
lb = loadbalancer.New(cfg) lb = loadbalancer.New(cfg)
if err := lb.Start(parent); err != nil { _ = lb.Start(parent) // always return nil
panic(err) // should always return nil
}
linked = &ReveseProxyRoute{ linked = &ReveseProxyRoute{
Route: &Route{ Route: &Route{
Alias: cfg.Link, Alias: cfg.Link,
@ -215,9 +205,10 @@ func (r *ReveseProxyRoute) addToLoadBalancer(parent task.Parent) {
routes.SetHTTPRoute(cfg.Link, linked) routes.SetHTTPRoute(cfg.Link, linked)
} }
r.loadBalancer = lb r.loadBalancer = lb
r.server = loadbalance.NewServer(r.task.Name(), r.rp.TargetURL, r.LoadBalance.Weight, r.handler, r.HealthMon)
lb.AddServer(r.server) server := loadbalance.NewServer(r.task.Name(), r.rp.TargetURL, r.LoadBalance.Weight, r.handler, r.HealthMon)
lb.AddServer(server)
r.task.OnCancel("lb_remove_server", func() { r.task.OnCancel("lb_remove_server", func() {
lb.RemoveServer(r.server) lb.RemoveServer(server)
}) })
} }