diff --git a/pkg/serverconfigs/reverse_proxy_config.go b/pkg/serverconfigs/reverse_proxy_config.go index 1478b98..0e43149 100644 --- a/pkg/serverconfigs/reverse_proxy_config.go +++ b/pkg/serverconfigs/reverse_proxy_config.go @@ -218,7 +218,7 @@ func (this *ReverseProxyConfig) AddBackupOrigin(origin *OriginConfig) { this.BackupOrigins = append(this.BackupOrigins, origin) } -// NextOrigin 取得下一个可用的后端服务 +// NextOrigin 取得下一个可用的源站 func (this *ReverseProxyConfig) NextOrigin(call *shared.RequestCall) *OriginConfig { // 这里不能使用RLock/RUnlock,因为在NextOrigin()方法中可能会对调度对象动态调整 this.schedulingLocker.Lock() @@ -256,6 +256,43 @@ func (this *ReverseProxyConfig) NextOrigin(call *shared.RequestCall) *OriginConf return nil } +// AnyOrigin 取下一个任意的源站 +func (this *ReverseProxyConfig) AnyOrigin(call *shared.RequestCall, excludingOriginIds []int64) *OriginConfig { + this.schedulingLocker.Lock() + defer this.schedulingLocker.Unlock() + + if len(this.schedulingGroupMap) == 0 { + return nil + } + + // 空域名 + if call == nil || len(call.Domain) == 0 { + group, ok := this.schedulingGroupMap[""] + if ok { + return group.AnyOrigin(excludingOriginIds) + } + return nil + } + + // 按域名匹配 + for domainPattern, group := range this.schedulingGroupMap { + if len(domainPattern) > 0 && configutils.MatchDomain(domainPattern, call.Domain) { + origin := group.AnyOrigin(excludingOriginIds) + if origin != nil { + return origin + } + } + } + + // 再次查找没有设置域名的分组 + group, ok := this.schedulingGroupMap[""] + if ok { + return group.AnyOrigin(excludingOriginIds) + } + + return nil +} + // SetupScheduling 设置调度算法 func (this *ReverseProxyConfig) SetupScheduling(isBackup bool, checkOk bool, lock bool) { if lock { diff --git a/pkg/serverconfigs/scheduling_group.go b/pkg/serverconfigs/scheduling_group.go index eec0262..a19de9c 100644 --- a/pkg/serverconfigs/scheduling_group.go +++ b/pkg/serverconfigs/scheduling_group.go @@ -36,7 +36,7 @@ func (this *SchedulingGroup) Init() error { return nil } -// NextOrigin 取得下一个可用的后端服务 +// NextOrigin 取得下一个可用源站 func (this *SchedulingGroup) NextOrigin(call *shared.RequestCall) *OriginConfig { if this.schedulingObject == nil { return nil @@ -48,7 +48,7 @@ func (this *SchedulingGroup) NextOrigin(call *shared.RequestCall) *OriginConfig } } - candidate := this.schedulingObject.Next(call) + var candidate = this.schedulingObject.Next(call) // 末了重置状态 defer func() { @@ -85,6 +85,28 @@ func (this *SchedulingGroup) NextOrigin(call *shared.RequestCall) *OriginConfig return candidate.(*OriginConfig) } +// AnyOrigin 取下一个任意源站 +func (this *SchedulingGroup) AnyOrigin(excludingOriginIds []int64) *OriginConfig { + for _, origin := range this.PrimaryOrigins { + if !origin.IsOn { + continue + } + if !this.containsInt64(excludingOriginIds, origin.Id) { + return origin + } + } + for _, origin := range this.BackupOrigins { + if !origin.IsOn { + continue + } + if !this.containsInt64(excludingOriginIds, origin.Id) { + return origin + } + } + + return nil +} + // SetupScheduling 设置调度算法 func (this *SchedulingGroup) SetupScheduling(isBackup bool, checkOk bool) { // 如果只有一个源站,则快速返回,避免因为状态的改变而不停地转换 @@ -129,3 +151,13 @@ func (this *SchedulingGroup) SetupScheduling(isBackup bool, checkOk bool) { this.schedulingObject.Start() } + +// 判断是否包含int64 +func (this *SchedulingGroup) containsInt64(originIds []int64, originId int64) bool { + for _, id := range originIds { + if id == originId { + return true + } + } + return false +}