本文主要研究一下dubbo-go的registryAwareClusterui
dubbo-go-v1.4.2/cluster/cluster_impl/registry_aware_cluster.gocode
type registryAwareCluster struct{} func init() { extension.SetCluster("registryAware", NewRegistryAwareCluster) } // NewRegistryAwareCluster ... func NewRegistryAwareCluster() cluster.Cluster { return ®istryAwareCluster{} } func (cluster *registryAwareCluster) Join(directory cluster.Directory) protocol.Invoker { return newRegistryAwareClusterInvoker(directory) }
dubbo-go-v1.4.2/cluster/cluster_impl/registry_aware_cluster_invoker.goit
type registryAwareClusterInvoker struct { baseClusterInvoker } func newRegistryAwareClusterInvoker(directory cluster.Directory) protocol.Invoker { return ®istryAwareClusterInvoker{ baseClusterInvoker: newBaseClusterInvoker(directory), } }
dubbo-go-v1.4.2/cluster/cluster_impl/registry_aware_cluster_invoker.goio
func (invoker *registryAwareClusterInvoker) Invoke(ctx context.Context, invocation protocol.Invocation) protocol.Result { invokers := invoker.directory.List(invocation) //First, pick the invoker (XXXClusterInvoker) that comes from the local registry, distinguish by a 'default' key. for _, invoker := range invokers { if invoker.IsAvailable() && invoker.GetUrl().GetParam(constant.REGISTRY_DEFAULT_KEY, "false") == "true" { return invoker.Invoke(ctx, invocation) } } //If none of the invokers has a local signal, pick the first one available. for _, invoker := range invokers { if invoker.IsAvailable() { return invoker.Invoke(ctx, invocation) } } return nil }
registryAwareCluster的Join方法執行newRegistryAwareClusterInvoker(directory);registryAwareClusterInvoker的Invoke方法先經過invoker.directory.List(invocation)獲取invokers,而後遍歷invokers判斷是否有來自local registry的invoker, 若是有則執行invoker.Invoke(ctx, invocation),沒有local的則遍歷invokers,找到第一個available的執行invoker.Invoke(ctx, invocation)gui