mirror of
https://github.com/yusing/godoxy.git
synced 2025-06-09 04:52:35 +02:00
fix loadbalancing when two container have the same alias
This commit is contained in:
parent
a8a209f0b0
commit
75d272be14
4 changed files with 14 additions and 11 deletions
|
@ -125,12 +125,12 @@ func (lb *LoadBalancer) AddServer(srv Server) {
|
||||||
lb.poolMu.Lock()
|
lb.poolMu.Lock()
|
||||||
defer lb.poolMu.Unlock()
|
defer lb.poolMu.Unlock()
|
||||||
|
|
||||||
if lb.pool.Has(srv.Name()) {
|
if lb.pool.Has(srv.Key()) {
|
||||||
old, _ := lb.pool.Load(srv.Name())
|
old, _ := lb.pool.Load(srv.Key())
|
||||||
lb.sumWeight -= old.Weight()
|
lb.sumWeight -= old.Weight()
|
||||||
lb.impl.OnRemoveServer(old)
|
lb.impl.OnRemoveServer(old)
|
||||||
}
|
}
|
||||||
lb.pool.Store(srv.Name(), srv)
|
lb.pool.Store(srv.Key(), srv)
|
||||||
lb.sumWeight += srv.Weight()
|
lb.sumWeight += srv.Weight()
|
||||||
|
|
||||||
lb.rebalance()
|
lb.rebalance()
|
||||||
|
@ -146,11 +146,11 @@ func (lb *LoadBalancer) RemoveServer(srv Server) {
|
||||||
lb.poolMu.Lock()
|
lb.poolMu.Lock()
|
||||||
defer lb.poolMu.Unlock()
|
defer lb.poolMu.Unlock()
|
||||||
|
|
||||||
if !lb.pool.Has(srv.Name()) {
|
if !lb.pool.Has(srv.Key()) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
lb.pool.Delete(srv.Name())
|
lb.pool.Delete(srv.Key())
|
||||||
|
|
||||||
lb.sumWeight -= srv.Weight()
|
lb.sumWeight -= srv.Weight()
|
||||||
lb.rebalance()
|
lb.rebalance()
|
||||||
|
@ -244,7 +244,7 @@ func (lb *LoadBalancer) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
|
||||||
func (lb *LoadBalancer) MarshalJSON() ([]byte, error) {
|
func (lb *LoadBalancer) MarshalJSON() ([]byte, error) {
|
||||||
extra := make(map[string]any)
|
extra := make(map[string]any)
|
||||||
lb.pool.RangeAll(func(k string, v Server) {
|
lb.pool.RangeAll(func(k string, v Server) {
|
||||||
extra[v.Name()] = v
|
extra[v.Key()] = v
|
||||||
})
|
})
|
||||||
|
|
||||||
return (&monitor.JSONRepresentation{
|
return (&monitor.JSONRepresentation{
|
||||||
|
|
|
@ -26,6 +26,7 @@ type (
|
||||||
http.Handler
|
http.Handler
|
||||||
health.HealthMonitor
|
health.HealthMonitor
|
||||||
Name() string
|
Name() string
|
||||||
|
Key() string
|
||||||
URL() *net.URL
|
URL() *net.URL
|
||||||
Weight() Weight
|
Weight() Weight
|
||||||
SetWeight(weight Weight)
|
SetWeight(weight Weight)
|
||||||
|
@ -63,6 +64,10 @@ func (srv *server) URL() *net.URL {
|
||||||
return srv.url
|
return srv.url
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (srv *server) Key() string {
|
||||||
|
return srv.url.Host
|
||||||
|
}
|
||||||
|
|
||||||
func (srv *server) Weight() Weight {
|
func (srv *server) Weight() Weight {
|
||||||
return srv.weight
|
return srv.weight
|
||||||
}
|
}
|
||||||
|
@ -78,9 +83,7 @@ func (srv *server) String() string {
|
||||||
func (srv *server) TryWake() error {
|
func (srv *server) TryWake() error {
|
||||||
waker, ok := srv.Handler.(idlewatcher.Waker)
|
waker, ok := srv.Handler.(idlewatcher.Waker)
|
||||||
if ok {
|
if ok {
|
||||||
if err := waker.Wake(); err != nil {
|
return waker.Wake()
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,7 +97,7 @@ func (r *ReveseProxyRoute) String() string {
|
||||||
|
|
||||||
// Start implements task.TaskStarter.
|
// Start implements task.TaskStarter.
|
||||||
func (r *ReveseProxyRoute) Start(parent task.Parent) gperr.Error {
|
func (r *ReveseProxyRoute) Start(parent task.Parent) gperr.Error {
|
||||||
if existing, ok := routes.GetHTTPRoute(r.TargetName()); ok {
|
if existing, ok := routes.GetHTTPRoute(r.TargetName()); ok && !r.UseLoadBalance() {
|
||||||
return gperr.Errorf("route already exists: from provider %s and %s", existing.ProviderName(), r.ProviderName())
|
return gperr.Errorf("route already exists: from provider %s and %s", existing.ProviderName(), r.ProviderName())
|
||||||
}
|
}
|
||||||
r.task = parent.Subtask("http."+r.TargetName(), false)
|
r.task = parent.Subtask("http."+r.TargetName(), false)
|
||||||
|
|
|
@ -100,7 +100,7 @@ func (r *Route) Validate() (err gperr.Error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if !r.UseHealthCheck() && (r.UseLoadBalance() || r.UseIdleWatcher()) {
|
if !r.UseHealthCheck() && (r.UseLoadBalance() || r.UseIdleWatcher()) {
|
||||||
errs.Adds("healthCheck.disable cannot be true when loadbalancer or idlewatcher is enabled")
|
errs.Adds("cannot disable healthcheck when loadbalancer or idle watcher is enabled")
|
||||||
}
|
}
|
||||||
|
|
||||||
if errs.HasError() {
|
if errs.HasError() {
|
||||||
|
|
Loading…
Add table
Reference in a new issue