123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- package loadbalance
- import (
- "imuslab.com/zoraxy/mod/geodb"
- "imuslab.com/zoraxy/mod/info/logger"
- "imuslab.com/zoraxy/mod/uptime"
- )
- /*
- Load Balancer
- Handleing load balance request for upstream destinations
- */
- type BalancePolicy int
- const (
- BalancePolicy_RoundRobin BalancePolicy = 0 //Round robin, will ignore upstream if down
- BalancePolicy_Fallback BalancePolicy = 1 //Fallback only. Will only switch to next node if the first one failed
- BalancePolicy_Random BalancePolicy = 2 //Random, randomly pick one from the list that is online
- BalancePolicy_GeoRegion BalancePolicy = 3 //Use the one defined for this geo-location, when down, pick the next avaible node
- )
- type LoadBalanceRule struct {
- Upstreams []string //Reverse proxy upstream servers
- LoadBalancePolicy BalancePolicy //Policy in deciding which target IP to proxy
- UseRegionLock bool //If this is enabled with BalancePolicy_Geo, when the main site failed, it will not pick another node
- UseStickySession bool //Use sticky session, if you are serving EU countries, make sure to add the "Do you want cookie" warning
- parent *RouteManager
- }
- type Options struct {
- Geodb *geodb.Store //GeoIP resolver for checking incoming request origin country
- UptimeMonitor *uptime.Monitor //For checking if the target is online, this might be nil when the module starts
- }
- type RouteManager struct {
- Options Options
- Logger *logger.Logger
- }
- // Create a new load balance route manager
- func NewRouteManager(options *Options, logger *logger.Logger) *RouteManager {
- newManager := RouteManager{
- Options: *options,
- Logger: logger,
- }
- logger.PrintAndLog("INFO", "Load Balance Route Manager started", nil)
- return &newManager
- }
- func (b *LoadBalanceRule) GetProxyTargetIP() {
- //TODO: Implement get proxy target IP logic here
- }
- // Print debug message
- func (m *RouteManager) debugPrint(message string, err error) {
- m.Logger.PrintAndLog("LB", message, err)
- }
|