示例#1
0
        /// <summary>
        /// 选择一个地址。
        /// </summary>
        /// <param name="context">地址选择上下文。</param>
        /// <returns>地址模型。</returns>
        protected override Task <AddressModel> SelectAsync(AddressSelectContext context)
        {
            var address = context.Address.ToArray();
            var index   = context.HashCode % address.Length;

            return(Task.FromResult(address[index]));
        }
示例#2
0
        /// <summary>
        /// 选择一个地址。
        /// </summary>
        /// <param name="context">地址选择上下文。</param>
        /// <returns>地址模型。</returns>
        protected override Task <AddressModel> SelectAsync(AddressSelectContext context)
        {
            var key = context.ServiceRoute.ServiceDescriptor.Id;
            //根据服务id缓存服务地址。
            var address = _concurrent.AddOrUpdate(key, k => new AddressEntry(context.ServiceRoute.Address), (k, currentEntry) =>
            {
                var newAddress     = context.ServiceRoute.Address.ToArray();
                var currentAddress = currentEntry.Address;
                var unionAddress   = currentEntry.Address.Union(newAddress).ToArray();

                if (unionAddress.Length != currentAddress.Length)
                {
                    return(new AddressEntry(newAddress));
                }

                if (unionAddress.Any(addressModel => !newAddress.Contains(addressModel)))
                {
                    return(new AddressEntry(newAddress));
                }

                return(currentEntry);
            });

            return(Task.FromResult(address.GetAddress()));
        }
示例#3
0
        /// <summary>
        /// 选择一个地址。
        /// </summary>
        /// <param name="context">地址选择上下文。</param>
        /// <returns>地址模型。</returns>
        protected override async ValueTask <AddressModel> SelectAsync(AddressSelectContext context)
        {
            var key = GetCacheKey(context.Descriptor);

            // 根据服务id缓存服务地址。
            var addressEntry = _concurrent
                               .GetOrAdd(key, k => new Lazy <AddressEntry>(() => new AddressEntry(context.Address))).Value;
            AddressModel     addressModel;
            var              index = 0;
            var              len   = context.Address.Count();
            ValueTask <bool> vt;

            do
            {
                addressModel = addressEntry.GetAddress();
                if (len <= index)
                {
                    addressModel = null;
                    break;
                }

                index++;
                vt = _healthCheckService.IsHealth(addressModel);
            } while (!(vt.IsCompletedSuccessfully ? vt.Result : await vt));

            return(addressModel);
        }
        public async Task <string> SelectConnectionAsync(AddressSelectContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }
            if (context.Descriptor == null)
            {
                throw new ArgumentNullException(nameof(context.Descriptor));
            }
            if (context.Connections == null)
            {
                throw new ArgumentNullException(nameof(context.Connections));
            }

            //  var address = context.Address.ToArray();
            if (context.Connections.Count() == 0)
            {
                throw new ArgumentException("没有任何地址信息。", nameof(context.Connections));
            }
            if (context.Connections.Count() == 1)
            {
                return(context.Connections.First());
            }
            else
            {
                return(await SelectConnAsync(context));
            }
        }
示例#5
0
        /// <summary>
        /// 选择一个地址。
        /// </summary>
        /// <param name="context">地址选择上下文。</param>
        /// <returns>地址模型。</returns>
        async ValueTask <AddressModel> IAddressSelector.SelectAsync(AddressSelectContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }
            if (context.Descriptor == null)
            {
                throw new ArgumentNullException(nameof(context.Descriptor));
            }
            if (context.Address == null)
            {
                throw new ArgumentNullException(nameof(context.Address));
            }

            //  var address = context.Address.ToArray();
            if (context.Address.Count() == 0)
            {
                throw new ArgumentException("没有任何地址信息。", nameof(context.Address));
            }

            if (context.Address.Count() == 1)
            {
                return(context.Address.First());
            }
            else
            {
                var vt = SelectAsync(context);
                return(vt.IsCompletedSuccessfully ? vt.Result : await vt);
            }
        }
        /// <summary>
        /// 选择一个地址。
        /// </summary>
        /// <param name="context">地址选择上下文。</param>
        /// <returns>地址模型。</returns>
        async Task <AddressModel> IAddressSelector.SelectAsync(AddressSelectContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }
            if (context.Descriptor == null)
            {
                throw new ArgumentNullException(nameof(context.Descriptor));
            }
            if (context.Address == null)
            {
                throw new ArgumentNullException(nameof(context.Address));
            }

            //  var address = context.Address.ToArray();
            if (!context.Address.Any())
            {
                throw new ArgumentException("没有任何地址信息。", nameof(context.Address));
            }

            if (context.Address.Count() == 1)
            {
                return(context.Address.First());
            }
            else
            {
                return(await SelectAsync(context));
            }
        }
示例#7
0
        /// <summary>
        /// 选择一个地址。
        /// </summary>
        /// <param name="context">地址选择上下文。</param>
        /// <returns>地址模型。</returns>
        protected override async Task <AddressModel> SelectAsync(AddressSelectContext context)
        {
            var key          = GetCacheKey(context.Descriptor);
            var addressEntry = _concurrent.GetOrAdd(key, k =>
            {
                var len  = context.Address.Count();
                len      = len > 1 && len < 10 ? len * 10 : len;
                var hash = new ConsistentHash <AddressModel>(_hashAlgorithm, len);
                foreach (var address in context.Address)
                {
                    hash.Add(address, address.ToString());
                }
                return(hash);
            });
            AddressModel addressModel;
            var          IsHealth = false;

            do
            {
                addressModel = addressEntry.GetItemNode(context.Item);
                IsHealth     = await _healthCheckService.IsHealth(addressModel);

                if (!IsHealth)
                {
                    addressEntry.Remove(addressModel.ToString());
                    _unHealths.Add(new ValueTuple <string, AddressModel>(key, addressModel));
                    _healthCheckService.Changed += ItemNode_Changed;
                }
            } while (!IsHealth);
            return(addressModel);
        }
示例#8
0
        /// <summary>
        /// 选择一个地址。
        /// </summary>
        /// <param name="context">地址选择上下文。</param>
        /// <returns>地址模型。</returns>
        protected override Task<AddressModel> SelectAsync(AddressSelectContext context)
        {
            var address = context.Address.ToArray();
            var length = address.Length;

            var index = _generate(0, length);
            return Task.FromResult(address[index]);
        }
示例#9
0
        /// <summary>
        /// 选择一个地址。
        /// </summary>
        /// <param name="context">地址选择上下文。</param>
        /// <returns>地址模型。</returns>
        protected override Task<AddressModel> SelectAsync(AddressSelectContext context)
        {
            var key = GetCacheKey(context.Descriptor);
            //根据服务id缓存服务地址。
            var address = _concurrent.GetOrAdd(key, k => new Lazy<AddressEntry>(() => new AddressEntry(context.Address))).Value;

            return Task.FromResult(address.GetAddress());
        }
示例#10
0
        /// <summary>
        /// 选择一个地址。
        /// </summary>
        /// <param name="context">地址选择上下文。</param>
        /// <returns>地址模型。</returns>
        protected override Task <AddressModel> SelectAsync(AddressSelectContext context)
        {
            var key = GetCacheKey(context.Descriptor);
            //根据服务id缓存服务地址。
            var address = _concurrent.GetOrAdd(key, k => new Lazy <AddressEntry>(() => new AddressEntry(context.Address))).Value;

            return(Task.FromResult(address.GetAddress()));
        }
示例#11
0
        /// <summary>
        /// 选择一个地址。
        /// </summary>
        /// <param name="context">地址选择上下文。</param>
        /// <returns>地址模型。</returns>
        protected override Task <AddressModel> SelectAsync(AddressSelectContext context)
        {
            var address = context.ServiceRoute.Address.ToArray();
            var length  = address.Length;

            var index = _generate(0, length);

            return(Task.FromResult(address[index]));
        }
        /// <summary>
        /// 选择一个地址。
        /// </summary>
        /// <param name="context">地址选择上下文。</param>
        /// <returns>地址模型。</returns>
        protected override async Task <AddressModel> SelectAsync(AddressSelectContext context)
        {
            var address = context.Address.ToArray();
            var length  = address.Length;

            var index = _generate(0, length);

            return(address[index]);
        }
        protected override async Task <string> SelectConnAsync(AddressSelectContext context)
        {
            var conns  = context.Connections.ToArray();
            var length = conns.Length;

            var index = _generate(0, length);

            return(conns[index]);
        }
示例#14
0
        /// <summary>
        /// 选择一个地址。
        /// </summary>
        /// <param name="context">地址选择上下文。</param>
        /// <returns>地址模型。</returns>
        protected override async Task <AddressModel> SelectAsync(AddressSelectContext context)
        {
            var key = GetCacheKey(context.Descriptor);
            //根据服务id缓存服务地址。
            var          addressEntry = _concurrent.GetOrAdd(key, k => new Lazy <AddressEntry>(() => new AddressEntry(context.Address))).Value;
            AddressModel addressModel;

            addressModel = addressEntry.GetAddress();
            return(addressModel);
        }
        protected override ValueTask <AddressModel> SelectManyAsync(AddressSelectContext context)
        {
            var address = context.Address.ToArray();

            ValidateAddressChange(context.Name, address);

            var addressEntry = concurrent.GetOrAdd(context.Name,
                                                   k => new Lazy <AddressEntry>(() => new AddressEntry(address))).Value;

            var addressModel = addressEntry.GetAddress();

            return(new ValueTask <AddressModel>(addressModel));
        }
示例#16
0
        /// <summary>
        /// 选择一个地址。
        /// </summary>
        /// <param name="context">地址选择上下文。</param>
        /// <returns>地址模型。</returns>
        protected override async Task<AddressModel> SelectAsync(AddressSelectContext context)
        {
            var key = GetCacheKey(context.Descriptor);
            //根据服务id缓存服务地址。
            var addressEntry = _concurrent.GetOrAdd(key, k => new Lazy<AddressEntry>(() => new AddressEntry(context.Address))).Value;

            AddressModel addressModel;
            do
            {
                addressModel = addressEntry.GetAddress();
            } while (await _healthCheckService.IsHealth(addressModel) == false);
            return addressModel;
        }
        /// <summary>
        /// 选择一个地址。
        /// </summary>
        /// <param name="context">地址选择上下文。</param>
        /// <returns>地址模型。</returns>
        protected override async Task <AddressModel> SelectAsync(AddressSelectContext context)
        {
            var address = context.Address.ToList();
            var index   = context.HashCode % address.Count;

            while (await _healthCheckService.IsHealth(address[index]) == false)
            {
                address.RemoveAt(index);
                index = context.HashCode % address.Count;
            }

            return(address[index]);
        }
        protected override async Task <AddressModel> SelectAsync(AddressSelectContext context)
        {
            var key = GetCacheKey(context.Descriptor);
            //根据服务id缓存服务地址。
            var          addressEntry = _concurrent.GetOrAdd(key, k => new Lazy <AddressEntry>(() => new AddressEntry(context.Address))).Value;
            AddressModel addressModel;

            do
            {
                addressModel = addressEntry.GetAddress();
            } while (await _healthCheckService.IsHealth(addressModel) == false);
            return(addressModel);
        }
示例#19
0
        /// <summary>
        /// 选择一个地址。
        /// </summary>
        /// <param name="context">地址选择上下文。</param>
        /// <returns>地址模型。</returns>
        Task<AddressModel> IAddressSelector.SelectAsync(AddressSelectContext context)
        {
            if (context == null)
                throw new ArgumentNullException(nameof(context));
            if (context.Descriptor == null)
                throw new ArgumentNullException(nameof(context.Descriptor));
            if (context.Address == null)
                throw new ArgumentNullException(nameof(context.Address));

            var address = context.Address.ToArray();
            if (!address.Any())
                throw new ArgumentException("没有任何地址信息。", nameof(context.Address));

            return address.Length == 1 ? Task.FromResult(address[0]) : SelectAsync(context);
        }
        private AddressEntry GetAddreEntry(AddressSelectContext context)
        {
            var key = GetCacheKey(context.Descriptor);

            if (!_concurrent.TryGetValue(key, out Lazy <AddressEntry> lazyAddressEntry))
            {
                lazyAddressEntry = _concurrent.GetOrAdd(key, k => new Lazy <AddressEntry>(() => new AddressEntry(context.Address)));
            }
            var addressEntry = lazyAddressEntry.Value;

            if (addressEntry.GetAddressCount() != context.Address.Count())
            {
                _concurrent.TryUpdate(key, new Lazy <AddressEntry>(() => new AddressEntry(context.Address)), lazyAddressEntry);
            }
            return(addressEntry);
        }
示例#21
0
        /// <summary>
        /// 选择一个地址。
        /// </summary>
        /// <param name="context">地址选择上下文。</param>
        /// <returns>地址模型。</returns>
        protected override async Task <AddressModel> SelectAsync(AddressSelectContext context)
        {
            var key          = GetCacheKey(context.Descriptor);
            var addressEntry = _concurrent.GetOrAdd(key, k =>
            {
                var len = context.Address.Count();
                len     = len > 1 && len < 10 ? len * 10 : len;
                return(new ConsistentHash <AddressModel>(_hashAlgorithm, len));
            });
            AddressModel addressModel;

            do
            {
                addressModel = addressEntry.GetItemNode(context.Item);
            } while (await _healthCheckService.IsHealth(addressModel) == false);

            return(addressModel);
        }
示例#22
0
        protected override async Task <AddressModel> SelectAsync(AddressSelectContext context)
        {
            var          addressEntry = GetAddreEntry(context);
            AddressModel addressModel;
            var          index = 0;
            var          len   = context.Address.Count();

            do
            {
                addressModel = addressEntry.GetAddress();
                if (len <= index)
                {
                    addressModel = null;
                    break;
                }
                index++;
            } while (await _healthCheckService.IsHealth(addressModel) == false);
            return(addressModel);
        }
        protected override ValueTask <AddressModel> SelectManyAsync(AddressSelectContext context)
        {
            var address = context.Address.ToList();

            foreach (var addressModel in address)
            {
                var model  = addressModel as IpAddressModel;
                var weight = Convert.ToInt32(model?.Meta[SelectorType.RandomWeight.ToString()]);
                for (int i = 0; i < weight; i++)
                {
                    address.Add(model);
                }
            }

            var length = address.Count;

            var index = _generate(0, length);

            return(new ValueTask <AddressModel>(address[index]));
        }
示例#24
0
        /// <summary>
        /// 选择一个地址。
        /// </summary>
        /// <param name="context">地址选择上下文。</param>
        /// <returns>地址模型。</returns>
        protected override Task<AddressModel> SelectAsync(AddressSelectContext context)
        {
            var key = context.ServiceRoute.ServiceDescriptor.Id;
            //根据服务id缓存服务地址。
            var address = _concurrent.AddOrUpdate(key, k => new AddressEntry(context.ServiceRoute.Address), (k, currentEntry) =>
              {
                  var newAddress = context.ServiceRoute.Address.ToArray();
                  var currentAddress = currentEntry.Address;
                  var unionAddress = currentEntry.Address.Union(newAddress).ToArray();

                  if (unionAddress.Length != currentAddress.Length)
                      return new AddressEntry(newAddress);

                  if (unionAddress.Any(addressModel => !newAddress.Contains(addressModel)))
                  {
                      return new AddressEntry(newAddress);
                  }

                  return currentEntry;
              });

            return Task.FromResult(address.GetAddress());
        }
示例#25
0
        /// <summary>
        /// 选择一个地址。
        /// </summary>
        /// <param name="context">地址选择上下文。</param>
        /// <returns>地址模型。</returns>
        ValueTask <AddressModel> IAddressSelector.SelectAsync(AddressSelectContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }
            if (context.Descriptor == null)
            {
                throw new ArgumentNullException(nameof(context.Descriptor));
            }
            if (context.Address == null)
            {
                throw new ArgumentNullException(nameof(context.Address));
            }

            //  var address = context.Address.ToArray();
            if (context.Address.Count() == 0)
            {
                throw new ArgumentException("没有任何地址信息。", nameof(context.Address));
            }

            return(context.Address.Count() == 1 ? new ValueTask <AddressModel>(context.Address.First()) :   SelectAsync(context));
        }
示例#26
0
        /// <summary>
        /// 选择一个地址。
        /// </summary>
        /// <param name="context">地址选择上下文。</param>
        /// <returns>地址模型。</returns>
        Task <AddressModel> IAddressSelector.SelectAsync(AddressSelectContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }
            if (context.ServiceRoute == null)
            {
                throw new ArgumentNullException(nameof(context.ServiceRoute));
            }
            if (context.ServiceRoute.Address == null)
            {
                throw new ArgumentNullException(nameof(context.ServiceRoute.Address));
            }

            var address = context.ServiceRoute.Address.ToArray();

            if (!address.Any())
            {
                throw new ArgumentException("没有任何地址信息。", nameof(context.ServiceRoute.Address));
            }

            return(address.Length == 1 ? Task.FromResult(address[0]) : SelectAsync(context));
        }
示例#27
0
        /// <summary>
        /// 选择一个地址。
        /// </summary>
        /// <param name="context">地址选择上下文。</param>
        /// <returns>地址模型。</returns>
        ValueTask <AddressModel> IAddressSelector.SelectAsync(AddressSelectContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }
            if (context.Descriptor == null)
            {
                throw new ArgumentNullException(nameof(context.Descriptor));
            }
            if (context.Address == null)
            {
                throw new ArgumentNullException(nameof(context.Address));
            }

            var address = context.Address.ToArray();

            if (!address.Any())
            {
                throw new ArgumentException("没有任何地址信息。", nameof(context.Address));
            }

            return(address.Length == 1 ?  new ValueTask <AddressModel>(address[0]) : new ValueTask <AddressModel>(SelectAsync(context)));
        }
示例#28
0
 /// <summary>
 /// 选择一个地址。
 /// </summary>
 /// <param name="context">地址选择上下文。</param>
 /// <returns>地址模型。</returns>
 protected abstract ValueTask <AddressModel> SelectAsync(AddressSelectContext context);
示例#29
0
 /// <summary>
 /// 选择一个地址。
 /// </summary>
 /// <param name="context">地址选择上下文。</param>
 /// <returns>地址模型。</returns>
 protected abstract Task<AddressModel> SelectAsync(AddressSelectContext context);
 protected abstract Task <string> SelectConnAsync(AddressSelectContext context);