/// <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])); }
/// <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())); }
/// <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)); } }
/// <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)); } }
/// <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); }
/// <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]); }
/// <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()); }
/// <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())); }
/// <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]); }
/// <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)); }
/// <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); }
/// <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); }
/// <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); }
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])); }
/// <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()); }
/// <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)); }
/// <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)); }
/// <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))); }
/// <summary> /// 选择一个地址。 /// </summary> /// <param name="context">地址选择上下文。</param> /// <returns>地址模型。</returns> protected abstract ValueTask <AddressModel> SelectAsync(AddressSelectContext context);
/// <summary> /// 选择一个地址。 /// </summary> /// <param name="context">地址选择上下文。</param> /// <returns>地址模型。</returns> protected abstract Task<AddressModel> SelectAsync(AddressSelectContext context);
protected abstract Task <string> SelectConnAsync(AddressSelectContext context);