Ejemplo 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);
        }
Ejemplo n.º 2
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);
        }
Ejemplo n.º 3
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
            }));
        }
Ejemplo n.º 5
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
                }));
            }
        }
        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);
        }
Ejemplo n.º 7
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);
Ejemplo n.º 8
0
        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&lt;System.ValueTuple&lt;ManualResetEvent, ZooKeeper&gt;&gt;.</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
            }));
        }
Ejemplo n.º 11
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
            }));
        }