TCP/TLS/UDP第一次连接源站失败后,自动尝试下一个源站

This commit is contained in:
刘祥超
2022-08-03 16:09:47 +08:00
parent 9ad1c3a3c8
commit b8c5a78f2e
2 changed files with 44 additions and 4 deletions

View File

@@ -231,8 +231,17 @@ func (this *TCPListener) connectOrigin(serverId int64, requestHost string, rever
var retries = 3
var addr string
var failedOriginIds []int64
for i := 0; i < retries; i++ {
var origin = reverseProxy.NextOrigin(requestCall)
var origin *serverconfigs.OriginConfig
if len(failedOriginIds) > 0 {
origin = reverseProxy.AnyOrigin(requestCall, failedOriginIds)
}
if origin == nil {
origin = reverseProxy.NextOrigin(requestCall)
}
if origin == nil {
continue
}
@@ -246,6 +255,8 @@ func (this *TCPListener) connectOrigin(serverId int64, requestHost string, rever
conn, addr, err = OriginConnect(origin, this.port, remoteAddr, requestHost)
if err != nil {
failedOriginIds = append(failedOriginIds, origin.Id)
remotelogs.ServerError(serverId, "TCP_LISTENER", "unable to connect origin server: "+addr+": "+err.Error(), "", nil)
SharedOriginStateManager.Fail(origin, requestHost, reverseProxy, func() {
@@ -263,7 +274,10 @@ func (this *TCPListener) connectOrigin(serverId int64, requestHost string, rever
return
}
}
err = errors.New("server '" + types.String(serverId) + "': no available origin server can be used")
if err == nil {
err = errors.New("server '" + types.String(serverId) + "': no available origin server can be used")
}
return
}

View File

@@ -139,16 +139,39 @@ func (this *UDPListener) connectOrigin(serverId int64, reverseProxy *serverconfi
var retries = 3
var addr string
var failedOriginIds []int64
for i := 0; i < retries; i++ {
var origin = reverseProxy.NextOrigin(nil)
var origin *serverconfigs.OriginConfig
if len(failedOriginIds) > 0 {
origin = reverseProxy.AnyOrigin(nil, failedOriginIds)
}
if origin == nil {
origin = reverseProxy.NextOrigin(nil)
}
if origin == nil {
continue
}
conn, addr, err = OriginConnect(origin, this.port, remoteAddr.String(), "")
if err != nil {
failedOriginIds = append(failedOriginIds, origin.Id)
remotelogs.ServerError(serverId, "UDP_LISTENER", "unable to connect origin server: "+addr+": "+err.Error(), "", nil)
SharedOriginStateManager.Fail(origin, "", reverseProxy, func() {
reverseProxy.ResetScheduling()
})
continue
} else {
if !origin.IsOk {
SharedOriginStateManager.Success(origin, func() {
reverseProxy.ResetScheduling()
})
}
// PROXY Protocol
if reverseProxy != nil &&
reverseProxy.ProxyProtocol != nil &&
@@ -175,7 +198,10 @@ func (this *UDPListener) connectOrigin(serverId int64, reverseProxy *serverconfi
return
}
}
err = errors.New("server '" + types.String(serverId) + "': no available origin server can be used")
if err == nil {
err = errors.New("server '" + types.String(serverId) + "': no available origin server can be used")
}
return
}