注: Dubbo版本是2.6.2java
圖1 AvailableClusterInvoker的類繼承圖ide
Available,顧名思義,就是可使用的服務提供者。spa
核心代碼在AvailableClusterInvoker的doInvoke(Invocation,List<Invoker<T>>,LoadBalance)中,源碼以下。code
@Override public Result doInvoke(Invocation invocation, List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException { for (Invoker<T> invoker : invokers) { if (invoker.isAvailable()) { return invoker.invoke(invocation); } } throw new RpcException("No provider available in " + invokers); }
實現比較簡單,循環服務提供者列表,找到第一個可以使用的,即invoker.isAvailable()的,然後調用服務。繼承
1. 若是不能修改服務提供者的avaiable屬性值,那麼會有什麼問題? 假設服務提供者有A、B、C、D,且都是可用的。由源碼可知,若是不能改變Invoker的available屬性值,那麼全部的請求都會落到A上,而B、C、D則沒有被調用,因此慎用。源碼