public async ValueTask <ConsulClient> GetClient() { ConsulClient result = null; var address = new List <AddressModel>(); foreach (var addressModel in _config.Addresses) { _healthCheckService.Monitor(addressModel); var task = _healthCheckService.IsHealth(addressModel); if (!(task.IsCompletedSuccessfully ? task.Result : await task)) { continue; } address.Add(addressModel); } var vt = _consulAddressSelector.SelectAsync(new AddressSelectContext { Descriptor = new ServiceDescriptor { Id = nameof(DefaultConsulClientProvider) }, Address = address }); var addr = vt.IsCompletedSuccessfully ? vt.Result : await vt; if (addr != null) { var ipAddress = addr as IpAddressModel; result = _consulClients.GetOrAdd(ipAddress, new ConsulClient(config => { config.Address = new Uri($"http://{ipAddress.Ip}:{ipAddress.Port}"); }, null, h => { h.UseProxy = false; h.Proxy = null; })); } return(result); }
/// <summary> /// 解析服务地址。 /// </summary> /// <param name="serviceId">服务Id。</param> /// <returns>服务地址模型。</returns> /// 1.从字典中拿到serviceroute对象 /// 2.从字典中拿到服务描述符集合 /// 3.获取或添加serviceroute /// 4.添加服务id到白名单 /// 5.根据服务描述符得到地址并判断地址是否是可用的(地址应该是多个) /// 6.添加到集合中 /// 7.拿到服务命今 /// 8.根据负载分流策略拿到一个选择器 /// 9.返回addressmodel public async ValueTask <AddressModel> Resolver(string serviceId, string item) { if (_logger.IsEnabled(LogLevel.Debug)) { _logger.LogDebug($"准备为服务id:{serviceId},解析可用地址。"); } var serviceRouteTask = _serviceRouteProvider.Locate(serviceId); var serviceRoute = serviceRouteTask.IsCompletedSuccessfully ? serviceRouteTask.Result : await serviceRouteTask; if (serviceRoute == null) { if (_logger.IsEnabled(LogLevel.Warning)) { _logger.LogWarning($"根据服务id:{serviceId},找不到相关服务信息。"); } return(null); } _serviceHeartbeatManager.AddWhitelist(serviceId); var address = new List <AddressModel>(); foreach (var addressModel in serviceRoute.Address) { _healthCheckService.Monitor(addressModel); var task = _healthCheckService.IsHealth(addressModel); if (!(task.IsCompletedSuccessfully ? task.Result : await task)) { continue; } address.Add(addressModel); } if (address.Count == 0) { if (_logger.IsEnabled(LogLevel.Warning)) { _logger.LogWarning($"根据服务id:{serviceId},找不到可用的地址。"); } return(null); } if (_logger.IsEnabled(LogLevel.Information)) { _logger.LogInformation($"根据服务id:{serviceId},找到以下可用地址:{string.Join(",", address.Select(i => i.ToString()))}。"); } var vtCommand = _commandProvider.GetCommand(serviceId); var command = vtCommand.IsCompletedSuccessfully ? vtCommand.Result : await vtCommand; var addressSelector = _addressSelectors[command.ShuntStrategy.ToString()]; var vt = addressSelector.SelectAsync(new AddressSelectContext { Descriptor = serviceRoute.ServiceDescriptor, Address = address, Item = item }); return(vt.IsCompletedSuccessfully ? vt.Result : await vt); }
public async ValueTask <ConsistentHashNode> Resolver(string cacheId, string item) { _concurrent.TryGetValue(cacheId, out ServiceCache descriptor); if (descriptor == null) { var descriptors = await _serviceCacheManager.GetCachesAsync(); descriptor = descriptors.FirstOrDefault(i => i.CacheDescriptor.Id == cacheId); if (descriptor != null) { _concurrent.GetOrAdd(cacheId, descriptor); } else { if (descriptor == null) { if (_logger.IsEnabled(LogLevel.Warning)) { _logger.LogWarning($"根据缓存id:{cacheId},找不到缓存信息。"); } return(null); } } } var address = new List <CacheEndpoint>(); foreach (var addressModel in descriptor.CacheEndpoint) { _healthCheckService.Monitor(addressModel, cacheId); if (!await _healthCheckService.IsHealth(addressModel, cacheId)) { continue; } address.Add(addressModel); } if (address.Count == 0) { if (_logger.IsEnabled(LogLevel.Warning)) { _logger.LogWarning($"根据缓存id:{cacheId},找不到可用的地址。"); } return(null); } if (_logger.IsEnabled(LogLevel.Information)) { _logger.LogInformation($"根据缓存id:{cacheId},找到以下可用地址:{string.Join(",", address.Select(i => i.ToString()))}。"); } var redisContext = CacheContainer.GetService <RedisContext>(descriptor.CacheDescriptor.Prefix); ConsistentHash <ConsistentHashNode> hash; redisContext.dicHash.TryGetValue(descriptor.CacheDescriptor.Type, out hash); return(hash != null?hash.GetItemNode(item) : default(ConsistentHashNode)); }
/// <summary> /// 解析服务地址 /// </summary> /// <param name="serviceId">服务Id</param> /// <returns>服务地址模型</returns> public async Task <AddressModel> Resolver(string serviceId) { if (_logger.IsEnabled(LogLevel.Debug)) { _logger.LogDebug($"准备为服务id:{serviceId},解析可用地址"); } var descriptors = await _serviceRouteManager.GetRoutesAsync(); var descriptor = descriptors.FirstOrDefault(i => i.ServiceDescriptor.Id == serviceId); if (descriptor == null) { if (_logger.IsEnabled(LogLevel.Warning)) { _logger.LogWarning($"根据服务id:{serviceId},找不到相关服务信息"); } return(null); } var address = new List <AddressModel>(); foreach (var addressModel in descriptor.Address) { await _healthCheckService.Monitor(addressModel); if (!await _healthCheckService.IsHealth(addressModel)) { continue; } address.Add(addressModel); } var hasAddress = address.Any(); if (!hasAddress) { if (_logger.IsEnabled(LogLevel.Warning)) { _logger.LogWarning($"根据服务id:{serviceId},找不到可用的地址"); } return(null); } if (_logger.IsEnabled(LogLevel.Information)) { _logger.LogInformation($"根据服务id:{serviceId},找到以下可用地址:{string.Join(",", address.Select(i => i.ToString()))}"); } return(await _addressSelector.SelectAsync(new AddressSelectContext { Descriptor = descriptor.ServiceDescriptor, Address = address })); }
public async Task <AddressModel> ResolverAsync(string serviceId) { if (_logger.IsEnabled(LogLevel.Debug)) { _logger.LogDebug($"正在准备为服务{serviceId}解析地址"); } var serviceRoutes = await _manager.GetRoutesAsync(); var serviceRoute = serviceRoutes.Where(s => s.ServiceDescriptor.Id == serviceId).FirstOrDefault(); if (serviceRoute == null) { if (_logger.IsEnabled(LogLevel.Warning)) { _logger.LogWarning($"服务{serviceId}没有找到对应的服务"); } return(null); } var address = new List <AddressModel>(); foreach (var am in serviceRoute.Address) { await _healthChecksService.Monitor(am); if (!await _healthChecksService.IsHealth(am)) { continue; } address.Add(am); } if (!address.Any()) { if (_logger.IsEnabled(LogLevel.Warning)) { _logger.LogWarning($"服务{serviceId}没有找到对应的服务"); } return(null); } else { return(await _selector.SelectAsync(new AddressSelectorContext() { Descriptor = serviceRoute.ServiceDescriptor, Address = address })); } }
public async Task <ConsulClient> GetClient() { ConsulClient result = null; var address = new List <AddressModel>(); foreach (var addressModel in _config.Addresses) { await _healthCheckService.Monitor(addressModel); var isHealth = await _healthCheckService.IsHealth(addressModel); if (!isHealth) { _logger.LogWarning($"服务注册中心地址{addressModel.ToString()}不健康。"); continue; } address.Add(addressModel); } if (!address.Any()) { if (_logger.IsEnabled(Level.Warning)) { _logger.LogWarning($"找不到可用的注册中心地址。"); } return(null); } var addr = await _consulAddressSelector.SelectAsync(new AddressSelectContext { Descriptor = new ServiceDescriptor { Id = nameof(DefaultConsulClientProvider) }, Address = address }); if (addr != null) { var ipAddress = addr as IpAddressModel; result = _consulClients.GetOrAdd(ipAddress, new ConsulClient(config => { config.Address = new Uri($"http://{ipAddress.Ip}:{ipAddress.Port}"); }, null, h => { h.UseProxy = false; h.Proxy = null; })); } return(result); }
public async Task <IZookeeperClient> GetZooKeeperClient() { var conns = new List <string>(); foreach (var conn in _config.Addresses) { await _healthCheckService.Monitor(conn); if (!await _healthCheckService.IsHealth(conn)) { continue; } conns.Add(conn); } if (!conns.Any()) { _logger.LogWarning($"找不到可用的注册中心地址。"); return(default);
public async ValueTask <(ManualResetEvent, ZooKeeper)> GetZooKeeper() { (ManualResetEvent, ZooKeeper)result = new ValueTuple <ManualResetEvent, ZooKeeper>(); var address = new List <AddressModel>(); foreach (var addressModel in _config.Addresses) { _healthCheckService.Monitor(addressModel); var task = _healthCheckService.IsHealth(addressModel); if (!(task.IsCompletedSuccessfully ? task.Result : await task)) { continue; } address.Add(addressModel); } if (address.Count == 0) { if (_logger.IsEnabled(Level.Warning)) { _logger.LogWarning($"找不到可用的注册中心地址。"); } return(default(ValueTuple <ManualResetEvent, ZooKeeper>)); } var vt = _zookeeperAddressSelector.SelectAsync(new AddressSelectContext { Descriptor = new ServiceDescriptor { Id = nameof(DefaultZookeeperClientProvider) }, Address = address }); var addr = vt.IsCompletedSuccessfully ? vt.Result : await vt; if (addr != null) { var ipAddress = addr as IpAddressModel; result = CreateZooKeeper(ipAddress); } return(result); }
/// <summary> /// Gets the zoo keeper. /// </summary> /// <returns>ValueTask<System.ValueTuple<ManualResetEvent, ZooKeeper>>.</returns> public async ValueTask <(ManualResetEvent, ZooKeeper)> GetZooKeeper() { var result = new ValueTuple <ManualResetEvent, ZooKeeper>(); var address = new List <AddressModel>(); foreach (var addressModel in _config.Addresses) { _healthCheckService.Monitor(addressModel); var task = _healthCheckService.IsHealth(addressModel); if (!(task.IsCompletedSuccessfully ? task.Result : await task)) { continue; } address.Add(addressModel); } if (address.Count == 0) { if (_logger.IsEnabled(Level.Warning)) { _logger.LogWarning("找不到可用的注册中心地址。"); } return(default);
/// <summary> /// 解析服务地址。 /// </summary> /// <param name="serviceId">服务Id。</param> /// <returns>服务地址模型。</returns> public async ValueTask <AddressModel> Resolver(string serviceId, string item) { if (_logger.IsEnabled(LogLevel.Debug)) { _logger.LogDebug($"准备为服务id:{serviceId},解析可用地址。"); } _concurrent.TryGetValue(serviceId, out ServiceRoute descriptor); if (descriptor == null) { var descriptors = await _serviceRouteManager.GetRoutesAsync(); descriptor = descriptors.FirstOrDefault(i => i.ServiceDescriptor.Id == serviceId); if (descriptor != null) { _concurrent.GetOrAdd(serviceId, descriptor); _serviceHeartbeatManager.AddWhitelist(serviceId); } else { if (descriptor == null) { if (_logger.IsEnabled(LogLevel.Warning)) { _logger.LogWarning($"根据服务id:{serviceId},找不到相关服务信息。"); } return(null); } } } var address = new List <AddressModel>(); foreach (var addressModel in descriptor.Address) { _healthCheckService.Monitor(addressModel); if (!await _healthCheckService.IsHealth(addressModel)) { continue; } address.Add(addressModel); } if (address.Count == 0) { if (_logger.IsEnabled(LogLevel.Warning)) { _logger.LogWarning($"根据服务id:{serviceId},找不到可用的地址。"); } return(null); } if (_logger.IsEnabled(LogLevel.Information)) { _logger.LogInformation($"根据服务id:{serviceId},找到以下可用地址:{string.Join(",", address.Select(i => i.ToString()))}。"); } var command = await _commandProvider.GetCommand(serviceId); var addressSelector = _addressSelectors[command.ShuntStrategy.ToString()]; return(await addressSelector.SelectAsync(new AddressSelectContext { Descriptor = descriptor.ServiceDescriptor, Address = address, Item = item })); }
/// <summary> /// 解析服务地址。 /// </summary> /// <param name="serviceId">服务Id。</param> /// <returns>服务地址模型。</returns> public async Task <AddressModel> Resolver(string serviceId, int hashCode) { if (_logger.IsEnabled(LogLevel.Debug)) { _logger.LogDebug($"准备为服务id:{serviceId},解析可用地址。"); } ServiceRoute descriptor; _concurrent.TryGetValue(serviceId, out descriptor); if (descriptor == null) { var descriptors = await _serviceRouteManager.GetRoutesAsync(); descriptor = descriptors.FirstOrDefault(i => i.ServiceDescriptor.Id == serviceId); if (descriptor != null) { _concurrent.GetOrAdd(serviceId, descriptor); } else { if (descriptor == null) { if (_logger.IsEnabled(LogLevel.Warning)) { _logger.LogWarning($"根据服务id:{serviceId},找不到相关服务信息。"); } return(null); } } } var address = new List <AddressModel>(); foreach (var addressModel in descriptor.Address) { await _healthCheckService.Monitor(addressModel); if (!await _healthCheckService.IsHealth(addressModel)) { continue; } address.Add(addressModel); } if (address.Count == 0) { if (_logger.IsEnabled(LogLevel.Warning)) { _logger.LogWarning($"根据服务id:{serviceId},找不到可用的地址。"); } return(null); } if (_logger.IsEnabled(LogLevel.Information)) { _logger.LogInformation($"根据服务id:{serviceId},找到以下可用地址:{string.Join(",", address.Select(i => i.ToString()))}。"); } return(await _addressSelector.SelectAsync(new AddressSelectContext { Descriptor = descriptor.ServiceDescriptor, Address = address, HashCode = hashCode })); }