源站读取错误时自动尝试下一个源站

This commit is contained in:
刘祥超
2022-08-03 20:33:31 +08:00
parent 526d72fd99
commit a19b738d73
2 changed files with 72 additions and 3 deletions

View File

@@ -218,7 +218,7 @@ func (this *ReverseProxyConfig) AddBackupOrigin(origin *OriginConfig) {
this.BackupOrigins = append(this.BackupOrigins, origin) this.BackupOrigins = append(this.BackupOrigins, origin)
} }
// NextOrigin 取得下一个可用的后端服务 // NextOrigin 取得下一个可用的源站
func (this *ReverseProxyConfig) NextOrigin(call *shared.RequestCall) *OriginConfig { func (this *ReverseProxyConfig) NextOrigin(call *shared.RequestCall) *OriginConfig {
// 这里不能使用RLock/RUnlock因为在NextOrigin()方法中可能会对调度对象动态调整 // 这里不能使用RLock/RUnlock因为在NextOrigin()方法中可能会对调度对象动态调整
this.schedulingLocker.Lock() this.schedulingLocker.Lock()
@@ -256,6 +256,43 @@ func (this *ReverseProxyConfig) NextOrigin(call *shared.RequestCall) *OriginConf
return nil 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 设置调度算法 // SetupScheduling 设置调度算法
func (this *ReverseProxyConfig) SetupScheduling(isBackup bool, checkOk bool, lock bool) { func (this *ReverseProxyConfig) SetupScheduling(isBackup bool, checkOk bool, lock bool) {
if lock { if lock {

View File

@@ -36,7 +36,7 @@ func (this *SchedulingGroup) Init() error {
return nil return nil
} }
// NextOrigin 取得下一个可用的后端服务 // NextOrigin 取得下一个可用源站
func (this *SchedulingGroup) NextOrigin(call *shared.RequestCall) *OriginConfig { func (this *SchedulingGroup) NextOrigin(call *shared.RequestCall) *OriginConfig {
if this.schedulingObject == nil { if this.schedulingObject == nil {
return 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() { defer func() {
@@ -85,6 +85,28 @@ func (this *SchedulingGroup) NextOrigin(call *shared.RequestCall) *OriginConfig
return candidate.(*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 设置调度算法 // SetupScheduling 设置调度算法
func (this *SchedulingGroup) SetupScheduling(isBackup bool, checkOk bool) { func (this *SchedulingGroup) SetupScheduling(isBackup bool, checkOk bool) {
// 如果只有一个源站,则快速返回,避免因为状态的改变而不停地转换 // 如果只有一个源站,则快速返回,避免因为状态的改变而不停地转换
@@ -129,3 +151,13 @@ func (this *SchedulingGroup) SetupScheduling(isBackup bool, checkOk bool) {
this.schedulingObject.Start() this.schedulingObject.Start()
} }
// 判断是否包含int64
func (this *SchedulingGroup) containsInt64(originIds []int64, originId int64) bool {
for _, id := range originIds {
if id == originId {
return true
}
}
return false
}