Esempio n. 1
0
        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);
        }
Esempio n. 2
0
 public async ValueTask Check()
 {
     foreach (var address in _config.Addresses)
     {
         if (!await _healthCheckService.IsHealth(address))
         {
             throw new RegisterConnectionException(string.Format("注册中心{0}连接异常,请联系管理园", address.ToString()));
         }
     }
 }
Esempio n. 3
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);
        }
Esempio n. 4
0
        /// <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 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);
        }
Esempio n. 6
0
        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
            }));
        }
        /// <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]);
        }
Esempio n. 9
0
        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
                }));
            }
        }
Esempio n. 10
0
        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);
Esempio n. 11
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);
        }
        private async Task <IEnumerable <AddressModel> > GetHealthAddress(ServiceRoute serviceRoute)
        {
            _logger.LogDebug($"根据服务id:{serviceRoute.ServiceDescriptor.Id},找到如下所有地址:{string.Join(",", serviceRoute.Address.Select(i => i.ToString()))}。");
            var address = new List <AddressModel>();

            foreach (var addressModel in serviceRoute.Address)
            {
                var isHealth = await _healthCheckService.IsHealth(addressModel);

                if (!isHealth)
                {
                    continue;
                }
                address.Add(addressModel);
            }
            if (!address.Any())
            {
                _logger.LogWarning($"根据服务id:{serviceRoute.ServiceDescriptor.Id},找不到可用的地址。");
                return(address);
            }
            _logger.LogInformation($"根据服务id:{serviceRoute.ServiceDescriptor.Id},找到以下可用地址:{string.Join(",", address.Select(i => i.ToString()))}。");
            return(address);
        }
        /// <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
            }));
        }
Esempio n. 14
0
        /// <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
            }));
        }