mirror of
https://github.com/TeaOSLab/EdgeCommon.git
synced 2025-11-17 23:50:24 +08:00
源站读取错误时自动尝试下一个源站
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user