diff --git a/cluster/cluster_impl/zone_aware_cluster_invoker.go b/cluster/cluster_impl/zone_aware_cluster_invoker.go
index 60683c32d11763d2aaa9328eeb2c5f8cf1837c65..dd4d319b4031e447ba42ef817dc2ba179d982569 100644
--- a/cluster/cluster_impl/zone_aware_cluster_invoker.go
+++ b/cluster/cluster_impl/zone_aware_cluster_invoker.go
@@ -56,8 +56,8 @@ func (invoker *zoneAwareClusterInvoker) Invoke(ctx context.Context, invocation p
 
 	// First, pick the invoker (XXXClusterInvoker) that comes from the local registry, distinguish by a 'preferred' key.
 	for _, invoker := range invokers {
-		if invoker.IsAvailable() &&
-			"true" == invoker.GetUrl().GetParam(constant.REGISTRY_KEY+"."+constant.PREFERRED_KEY, "false") {
+		key := constant.REGISTRY_KEY + "." + constant.PREFERRED_KEY
+		if invoker.IsAvailable() && matchParam("true", key, "false", invoker) {
 			return invoker.Invoke(ctx, invocation)
 		}
 	}
@@ -66,8 +66,8 @@ func (invoker *zoneAwareClusterInvoker) Invoke(ctx context.Context, invocation p
 	zone := invocation.AttachmentsByKey(constant.REGISTRY_ZONE, "")
 	if "" != zone {
 		for _, invoker := range invokers {
-			if invoker.IsAvailable() &&
-				zone == invoker.GetUrl().GetParam(constant.REGISTRY_KEY+"."+constant.ZONE_KEY, "") {
+			key := constant.REGISTRY_KEY + "." + constant.ZONE_KEY
+			if invoker.IsAvailable() && matchParam(zone, key, "", invoker) {
 				return invoker.Invoke(ctx, invocation)
 			}
 		}
@@ -100,3 +100,7 @@ func (invoker *zoneAwareClusterInvoker) Invoke(ctx context.Context, invocation p
 		Err: fmt.Errorf("no provider available in %v", invokers),
 	}
 }
+
+func matchParam(target, key, def string, invoker protocol.Invoker) bool {
+	return target == invoker.GetUrl().GetParam(key, def)
+}