mirror of
https://github.com/yusing/godoxy.git
synced 2026-01-11 22:30:47 +01:00
- Refactor load balancer interface to separate server selection (ChooseServer) from request handling - Add cookie-based sticky session support with configurable max-age and secure cookie handling - Integrate idlewatcher requests with automatic sticky session assignment - Improve algorithm implementations: * Replace fnv with xxhash3 for better performance in IP hash and server keys * Add proper bounds checking and error handling in all algorithms * Separate concerns between server selection and request processing - Add Sticky and StickyMaxAge fields to LoadBalancerConfig - Create dedicated sticky.go for session management utilities
60 lines
1.5 KiB
Go
60 lines
1.5 KiB
Go
package types
|
|
|
|
import (
|
|
"net/http"
|
|
"time"
|
|
|
|
nettypes "github.com/yusing/godoxy/internal/net/types"
|
|
strutils "github.com/yusing/goutils/strings"
|
|
)
|
|
|
|
type (
|
|
LoadBalancerConfig struct {
|
|
Link string `json:"link"`
|
|
Mode LoadBalancerMode `json:"mode"`
|
|
Weight int `json:"weight"`
|
|
Sticky bool `json:"sticky"`
|
|
StickyMaxAge time.Duration `json:"sticky_max_age"`
|
|
Options map[string]any `json:"options,omitempty"`
|
|
} // @name LoadBalancerConfig
|
|
LoadBalancerMode string // @name LoadBalancerMode
|
|
LoadBalancerServer interface {
|
|
http.Handler
|
|
HealthMonitor
|
|
Name() string
|
|
Key() string
|
|
URL() *nettypes.URL
|
|
Weight() int
|
|
SetWeight(weight int)
|
|
TryWake() error
|
|
}
|
|
LoadBalancerServers []LoadBalancerServer
|
|
)
|
|
|
|
const (
|
|
LoadbalanceModeUnset LoadBalancerMode = ""
|
|
LoadbalanceModeRoundRobin LoadBalancerMode = "roundrobin"
|
|
LoadbalanceModeLeastConn LoadBalancerMode = "leastconn"
|
|
LoadbalanceModeIPHash LoadBalancerMode = "iphash"
|
|
)
|
|
|
|
const StickyMaxAgeDefault = 1 * time.Hour
|
|
|
|
func (mode *LoadBalancerMode) ValidateUpdate() bool {
|
|
switch strutils.ToLowerNoSnake(string(*mode)) {
|
|
case "":
|
|
return true
|
|
case string(LoadbalanceModeRoundRobin):
|
|
*mode = LoadbalanceModeRoundRobin
|
|
return true
|
|
case string(LoadbalanceModeLeastConn):
|
|
*mode = LoadbalanceModeLeastConn
|
|
return true
|
|
case string(LoadbalanceModeIPHash):
|
|
*mode = LoadbalanceModeIPHash
|
|
return true
|
|
}
|
|
*mode = LoadbalanceModeRoundRobin
|
|
return false
|
|
}
|