乐趣区

关于dubbo:聊聊dubbogo的availableCluster

本文次要钻研一下 dubbo-go 的 availableCluster

NewAvailableCluster

dubbo-go-v1.4.2/cluster/cluster_impl/available_cluster.go

type availableCluster struct{}

const available = "available"

func init() {extension.SetCluster(available, NewAvailableCluster)
}

// NewAvailableCluster ...
func NewAvailableCluster() cluster.Cluster {return &availableCluster{}
}
  • NewAvailableCluster 办法实例化 availableCluster

Join

dubbo-go-v1.4.2/cluster/cluster_impl/available_cluster.go

func (cluser *availableCluster) Join(directory cluster.Directory) protocol.Invoker {return NewAvailableClusterInvoker(directory)
}
  • Join 办法执行 NewAvailableClusterInvoker

NewAvailableClusterInvoker

dubbo-go-v1.4.2/cluster/cluster_impl/available_cluster_invoker.go

type availableClusterInvoker struct {baseClusterInvoker}

// NewAvailableClusterInvoker ...
func NewAvailableClusterInvoker(directory cluster.Directory) protocol.Invoker {
    return &availableClusterInvoker{baseClusterInvoker: newBaseClusterInvoker(directory),
    }
}
  • NewAvailableClusterInvoker 办法实例化 availableClusterInvoker

Invoke

dubbo-go-v1.4.2/cluster/cluster_impl/available_cluster_invoker.go

func (invoker *availableClusterInvoker) Invoke(ctx context.Context, invocation protocol.Invocation) protocol.Result {invokers := invoker.directory.List(invocation)
    err := invoker.checkInvokers(invokers, invocation)
    if err != nil {return &protocol.RPCResult{Err: err}
    }

    err = invoker.checkWhetherDestroyed()
    if err != nil {return &protocol.RPCResult{Err: err}
    }

    for _, ivk := range invokers {if ivk.IsAvailable() {return ivk.Invoke(ctx, invocation)
        }
    }
    return &protocol.RPCResult{Err: errors.New(fmt.Sprintf("no provider available in %v", invokers))}
}
  • Invoke 办法先通过 invoker.directory.List(invocation) 获取 invokers,之后遍历 invokers,对于 ivk.IsAvailable() 为 true 的执行 ivk.Invoke(ctx, invocation)

小结

availableCluster 的 Join 办法执行 NewAvailableClusterInvoker,而 availableClusterInvoker 的 Invoke 办法先通过 invoker.directory.List(invocation) 获取 invokers,之后遍历 invokers,对于 ivk.IsAvailable() 为 true 的执行 ivk.Invoke(ctx, invocation)

doc

  • available_cluster
退出移动版