apache/dubbo · error · RpcException

No provider available in {invokers}

Error message

No provider available in {invokers}

What it means

Thrown by ZoneAwareClusterInvoker as the final fallback when no invoker can serve the request at all: no registry is marked preferred, none matches the requested zone, the load-balanced invoker is unavailable, and the loop over all invokers finds none available. It is the multi-registry equivalent of 'no provider available' and embeds the full invoker list.

Source

Thrown at dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/registry/ZoneAwareClusterInvoker.java:123

            }
        }

        // load balance among all registries, with registry weight count in.
        Invoker<T> balancedInvoker = select(loadbalance, invocation, invokers, null);
        if (balancedInvoker != null && balancedInvoker.isAvailable()) {
            return balancedInvoker.invoke(invocation);
        }

        // If none of the invokers has a preferred signal or is picked by the loadbalancer, pick the first one
        // available.
        for (Invoker<T> invoker : invokers) {
            ClusterInvoker<T> clusterInvoker = (ClusterInvoker<T>) invoker;
            if (clusterInvoker.isAvailable()) {
                return clusterInvoker.invoke(invocation);
            }
        }

        throw new RpcException("No provider available in " + invokers);
    }
}

View on GitHub (pinned to 3a3043227f)

Solutions

  1. Confirm providers for the service are registered and available in at least one registry; check the admin console / registry listing.
  2. Verify consumer subscription covers the right group/version/interface so the directory actually populates invokers.
  3. Inspect router/filter config (condition/host/tag routers) that may be filtering every provider out before availability is checked.
  4. Restore registry connectivity and wait for the directory to refresh providers, then retry.

Example fix

// before: no providers visible in any registry
try { service.call(x); } catch (RpcException e) { /* unaware */ }

// after: detect the no-provider condition and surface remediation
try {
    return service.call(x);
} catch (RpcException e) {
    if (e.isNoInvokerAvailableAfterFilter()) {
        alert("No providers in any registry for " + service);
    }
    throw e;
}
Defensive patterns

Strategy: validation

Validate before calling

// Check directory has any available invoker before calling
if (directory == null || directory.list(invocation).stream().noneMatch(Invoker::isAvailable)) {
    throw new IllegalStateException("no provider available across registries; abort before RPC");
}

Try / catch

try {
    return service.call(req);
} catch (RpcException e) {
    if (e.isNoInvokerAvailableAfterFilter()) {
        alert("all registries report zero available providers for " + service);
    }
    throw e;
}

Prevention

When it happens

Trigger: All subscribed registries report zero available providers for the service; or every ClusterInvoker.isAvailable() returns false (providers deregistered or marked unhealthy) right as the call is dispatched; typically reached when zone routing is off or no zone was requested.

Common situations: Provider outage across every registry during a call; registry connectivity loss leaving stale empty invoker lists; subscribe-time filter excluding all providers; service not yet registered in any registry at consumer startup (race); network partition between consumer and all registries.

Related errors


AI-assisted analysis of apache/dubbo@3a3043227f (2026-08-14). Data as JSON: /api/errors/7af143b0ae011b6d. Report an issue: GitHub.