序
本文次要钻研一下dubbo-go的registryAwareCluster
registryAwareCluster
dubbo-go-v1.4.2/cluster/cluster_impl/registry_aware_cluster.go
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)}
- registryAwareCluster的Join办法执行newRegistryAwareClusterInvoker(directory)
newRegistryAwareClusterInvoker
dubbo-go-v1.4.2/cluster/cluster_impl/registry_aware_cluster_invoker.go
type registryAwareClusterInvoker struct { baseClusterInvoker}func newRegistryAwareClusterInvoker(directory cluster.Directory) protocol.Invoker { return ®istryAwareClusterInvoker{ baseClusterInvoker: newBaseClusterInvoker(directory), }}
- newRegistryAwareClusterInvoker办法创立registryAwareClusterInvoker
Invoke
dubbo-go-v1.4.2/cluster/cluster_impl/registry_aware_cluster_invoker.go
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}
- Invoke办法先通过invoker.directory.List(invocation)获取invokers,而后遍历invokers判断是否有来自local registry的invoker, 如果有则执行invoker.Invoke(ctx, invocation);否则再次遍历invokers,找到第一个available的执行invoker.Invoke(ctx, invocation)
小结
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)
doc
- registry_aware_cluster