diff --git a/cluster/cluster_impl/failover_cluster_invoker.go b/cluster/cluster_impl/failover_cluster_invoker.go
index 70db6d4c1cdf5150d607d6c5250dfb3da631e95a..3595a04c711eca37b72ceed6f84c55e4dc23bad0 100644
--- a/cluster/cluster_impl/failover_cluster_invoker.go
+++ b/cluster/cluster_impl/failover_cluster_invoker.go
@@ -72,6 +72,9 @@ func (invoker *failoverClusterInvoker) Invoke(invocation protocol.Invocation) pr
 	invoked := []protocol.Invoker{}
 	providers := []string{}
 	var result protocol.Result
+	if retries > len(invokers) {
+		retries = len(invokers)
+	}
 	for i := 0; i <= retries; i++ {
 		//Reselect before retry to avoid a change of candidate `invokers`.
 		//NOTE: if `invokers` changed, then `invoked` also lose accuracy.
@@ -87,6 +90,9 @@ func (invoker *failoverClusterInvoker) Invoke(invocation protocol.Invocation) pr
 			}
 		}
 		ivk := invoker.doSelect(loadbalance, invocation, invokers, invoked)
+		if ivk == nil {
+			continue
+		}
 		invoked = append(invoked, ivk)
 		//DO INVOKE
 		result = ivk.Invoke(invocation)