public async Task <ServiceNodeInfo> GetNextNode(string serviceName, string serviceRoute, IReadOnlyList <object> serviceArgs,
                                                        IReadOnlyDictionary <string, string> serviceMeta)
        {
            var nodes = await ServiceDiscovery.GetServiceNodes(serviceName);

            if (!nodes.Any())
            {
                throw new NotFoundNodeException(serviceName);
            }
            if (nodes.Count == 1)
            {
                return(nodes.First());
            }
            lock (LockObject)
            {
                if (serviceMeta == null || !serviceMeta.TryGetValue("x-consistent-hash-key", out var key) || string.IsNullOrWhiteSpace(key))
                {
                    throw new ArgumentNullException(nameof(serviceMeta), "Service metadata [x-consistent-hash-key]  is null,Please call SetMeta method to pass in.");
                }

                var selectedNode = ServicesInfo.GetOrAdd(serviceName, k =>
                {
                    var consistentHash = new ConsistentHash <ServiceNodeInfo>();
                    foreach (var node in nodes)
                    {
                        consistentHash.AddNode(node, node.ServiceId);
                    }
                    ServicesInfo.TryAdd(serviceName, consistentHash);
                    return(consistentHash);
                }).GetNodeForKey(key);
                if (Logger.IsEnabled(LogLevel.Trace))
                {
                    Logger.LogTrace($"Load to node {selectedNode.ServiceId}.");
                }
                return(selectedNode);
            }
        }