public async ValueTask <ServiceRoute> GetRouteByPathRegex(string path)
        {
            path = path.ToLower();
            _serviceRoute.TryGetValue(path, out ServiceRoute route);
            if (route == null)
            {
                var routes = await _serviceRouteManager.GetRoutesAsync();

                return(await GetRouteByPathRegexAsync(routes, path));
            }
            else
            {
                return(route);
            }
        }
示例#2
0
        /// <summary>
        /// 获取地址
        /// </summary>
        /// <returns></returns>
        public static async Task <IEnumerable <AddressModel> > GetAddressAsync(this IServiceRouteManager serviceRouteManager, string condition = null)
        {
            var routes = await serviceRouteManager.GetRoutesAsync();

            Dictionary <string, AddressModel> result = new Dictionary <string, AddressModel>();

            if (condition != null)
            {
                if (!condition.IsIP())
                {
                    routes = routes.Where(p => p.ServiceDescriptor.Id == condition);
                }
                else
                {
                    routes = routes.Where(p => p.Address.Any(m => m.ToString() == condition));
                    var addresses = routes.FirstOrDefault().Address;
                    return(addresses.Where(p => p.ToString() == condition));
                }
            }

            foreach (var route in routes)
            {
                var addresses = route.Address;
                foreach (var address in addresses)
                {
                    if (!result.ContainsKey(address.ToString()))
                    {
                        result.Add(address.ToString(), address);
                    }
                }
            }
            return(result.Values);
        }
示例#3
0
        public static async Task <IEnumerable <ServiceDescriptor> > GetServiceDescriptorAsync(this IServiceRouteManager serviceRouteManager, string address)
        {
            var routes = await serviceRouteManager.GetRoutesAsync();

            return(routes.Where(p => p.Address.Any(m => m.ToString() == address))
                   .Select(p => p.ServiceDescriptor));
        }
 public async Task<ServiceRoute> Locate(string serviceId)
 {
     _concurrent.TryGetValue(serviceId, out ServiceRoute route);
     if (route == null)
     {
         var routes = await _serviceRouteManager.GetRoutesAsync();
         route = routes.FirstOrDefault(i => i.ServiceDescriptor.Id == serviceId);
         if (route == null)
         {
             if (_logger.IsEnabled(LogLevel.Warning))
                 _logger.LogWarning($"根据服务id:{serviceId},找不到相关服务信息。");
         }
         else
             _concurrent.GetOrAdd(serviceId, route);
     }
     return route;
 }
        private AddressSelectContext GetSelectContext()
        {
            var route = _serviceRouteManager.GetRoutesAsync().Result.First();

            return(new AddressSelectContext
            {
                Address = route.Address,
                Descriptor = route.ServiceDescriptor
            });
        }
        /// <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
            }));
        }
示例#7
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
                }));
            }
        }
示例#8
0
        public static async Task <ICollection <ServiceRoute> > GetLocalServiceRoutes(this IServiceRouteManager serviceRouteManager, IEnumerable <ServiceEntry> serviceEntries)
        {
            var serviceRoutes = await serviceRouteManager.GetRoutesAsync();

            var localServiceRoutes = new List <ServiceRoute>();

            foreach (var entry in serviceEntries)
            {
                var serviceRoute = serviceRoutes.FirstOrDefault(p => p.ServiceDescriptor.Id == entry.Descriptor.Id);
                if (serviceRoute != null)
                {
                    localServiceRoutes.Add(serviceRoute);
                }
            }
            return(localServiceRoutes);
        }
示例#9
0
        public async ValueTask <EndPoint> Resolver(string cacheId, string item)
        {
            _concurrent.TryGetValue(cacheId, out ServiceRoute descriptor);
            if (descriptor == null)
            {
                var descriptors = await _serviceRouteManager.GetRoutesAsync();

                descriptor = descriptors.FirstOrDefault(i => i.ServiceRouteDescriptor.Id == cacheId);
                if (descriptor != null)
                {
                    _concurrent.GetOrAdd(cacheId, descriptor);
                }
                else
                {
                    if (descriptor == null)
                    {
                        if (_logger.IsEnabled(LogLevel.Warning))
                        {
                            _logger.LogWarning($"根据缓存id:{cacheId},找不到缓存信息。");
                        }
                        return(null);
                    }
                }
            }

            if (descriptor.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(",", descriptor.Address.Select(i => i.ToString()))}。");
            }
            var redisContext = _container.ResolveKeyed <RedisContext>(descriptor.ServiceRouteDescriptor.Id);
            ConsistentHash <RedisEndPoint> hash;

            redisContext.dicHash.TryGetValue("redis", out hash);
            return(hash != null?hash.GetItemNode(item) : default(RedisEndPoint));
        }
示例#10
0
        /// <summary>
        /// 获取地址
        /// </summary>
        /// <returns></returns>
        public static async Task <IEnumerable <AddressModel> > GetAddressAsync(this IServiceRouteManager serviceRouteManager)
        {
            var routes = await serviceRouteManager.GetRoutesAsync();

            Dictionary <string, AddressModel> result = new Dictionary <string, AddressModel>();

            foreach (var route in routes)
            {
                var addresses = route.Address;
                foreach (var address in addresses)
                {
                    if (!result.ContainsKey(address.ToString()))
                    {
                        result.Add(address.ToString(), address);
                    }
                }
            }
            return(result.Values);
        }
示例#11
0
        /// <summary>
        /// 解析服务地址。
        /// </summary>
        /// <param name="serviceId">服务Id。</param>
        /// <returns>服务地址模型。</returns>
        public async Task <AddressModel> Resolver(string serviceId)
        {
            if (_logger.IsEnabled(LogLevel.Debug))
            {
                _logger.Debug($"准备为服务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.Warning($"根据服务id:{serviceId},找不到相关服务信息。");
                }
                return(null);
            }

            var hasAddress = descriptor.Address?.Any();

            if (!hasAddress.HasValue || !hasAddress.Value)
            {
                if (_logger.IsEnabled(LogLevel.Warning))
                {
                    _logger.Warning($"根据服务id:{serviceId},找不到可用的地址。");
                }
                return(null);
            }

            if (_logger.IsEnabled(LogLevel.Information))
            {
                _logger.Information($"根据服务id:{serviceId},找到以下可用地址:{string.Join(",", descriptor.Address.Select(i => i.ToString()))}。");
            }

            return(await _addressSelector.SelectAsync(new AddressSelectContext
            {
                ServiceRoute = descriptor
            }));
        }
        /// <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);
                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 = descriptor.ServiceDescriptor,
                Address    = address,
                Item       = item
            });

            return(vt.IsCompletedSuccessfully ? vt.Result : await vt);
        }
示例#13
0
 /// <summary>
 /// 根据服务Id获取一个服务路由。
 /// </summary>
 /// <param name="serviceRouteManager">服务路由管理者。</param>
 /// <param name="serviceId">服务Id。</param>
 /// <returns>服务路由。</returns>
 public static async Task <ServiceRoute> GetAsync(this IServiceRouteManager serviceRouteManager, string serviceId)
 {
     return((await serviceRouteManager.GetRoutesAsync()).SingleOrDefault(i => i.ServiceDescriptor.Id == serviceId));
 }
示例#14
0
        /// <summary>
        /// 解析服务地址。
        /// </summary>
        /// <param name="serviceId">服务Id。</param>
        /// <returns>服务地址模型。</returns>
        public async ValueTask <AddressModel> Resolver(string serviceId, int hashCode)
        {
            if (_logger.IsEnabled(LogLevel.Debug))
            {
                _logger.LogDebug($"准备为服务id:{serviceId},解析可用地址。");
            }
            var addressSelector = _addressSelector;

            _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);
                }
                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()))}。");
            }

            if (hashCode != 0)
            {
                var command = await _commandProvider.GetCommand(serviceId);

                addressSelector = _container.GetInstances <IAddressSelector>(command.ShuntStrategy.ToString());
            }
            return(await addressSelector.SelectAsync(new AddressSelectContext
            {
                Descriptor = descriptor.ServiceDescriptor,
                Address = address,
                HashCode = hashCode
            }));
        }