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); } }
/// <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); }
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 })); }
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 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); }
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)); }
/// <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); }
/// <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); }
/// <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)); }
/// <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 })); }