/// <summary> /// 获取服务 /// </summary> /// <param name="serviceName"></param> /// <param name="version"></param> /// <param name="ct"></param> /// <param name="passingOnly"></param> /// <returns></returns> public async Task <string> GetService(string serviceName, string version, System.Threading.CancellationToken ct, bool passingOnly = true) { var services = await this.GetServices(serviceName, version, ct, passingOnly); if (services.Response.Length <= 0) { return(string.Empty); } var serviceEntrys = services.Response; List <ServiceEntry> passingServices = new List <ServiceEntry>(); foreach (var item in serviceEntrys) { // 如果服务检查中有不健康的服务,就剔除掉(排除consul挂掉的情况) if (item.Checks.Where(m => m.Status.Status != "passing").Count() > 0) { continue; } passingServices.Add(item); } var lastIndex = await GetServiceRoundRobin(serviceName, version, ct); return(ClusterStrategy.GetServiceByRoundRobin(passingServices, lastIndex)); }
/// <summary> /// 获取服务 /// </summary> /// <param name="serviceName"></param> /// <param name="version"></param> /// <param name="ipHash"></param> /// <param name="ct"></param> /// <param name="passingOnly"></param> /// <returns></returns> public async Task <string> GetService(string serviceName, string version, int ipHash, System.Threading.CancellationToken ct, bool passingOnly = true) { var services = await this.GetServices(serviceName, version, ct, passingOnly); if (services.Response.Length <= 0) { return(string.Empty); } return(ClusterStrategy.GetServiceByIpHash(services.Response, ipHash)); }
///获取服务 /// <summary> /// 根据服务名称获取服务 /// </summary> /// <param name="serviceName"></param> /// <returns></returns> public async Task <string> GetService(string serviceName, System.Threading.CancellationToken ct) { var services = await this.GetServices(serviceName, ct); if (services.Length <= 0) { return(string.Empty); } return(ClusterStrategy.GetServiceByRandom(services)); }
/// <summary> /// 获取服务 /// </summary> /// <param name="serviceName"></param> /// <param name="version"></param> /// <param name="httpRequest"></param> /// <param name="ct"></param> /// <param name="passingOnly"></param> /// <returns></returns> public async Task <string> GetService(string serviceName, string version, System.Web.HttpRequestBase httpRequest, System.Threading.CancellationToken ct, bool passingOnly = true) { var services = await this.GetServices(serviceName, version, ct, passingOnly); if (services.Response.Length <= 0) { return(string.Empty); } var serviceEntrys = services.Response; List <ServiceEntry> passingServices = new List <ServiceEntry>(); // 客户ip string userIp = httpRequest.UserHostAddress; List <ServiceEntry> allTestServices = new List <ServiceEntry>(); List <ServiceEntry> offLineServices = new List <ServiceEntry>(); foreach (var item in serviceEntrys) { // 如果服务检查中有不健康的服务,就剔除掉(排除consul挂掉的情况) if (item.Checks.Where(m => m.Status.Status != "passing").Count() > 0) { continue; } passingServices.Add(item); // 查询出测试服务 if ((await ABTestingCache.Instance.GetServiceStatus(item.Service.Service, item.Service.Tags.FirstOrDefault(), item.Service.ID)) == "测试") { allTestServices.Add(item); } // 查询出测试服务 if ((await ABTestingCache.Instance.GetServiceStatus(item.Service.Service, item.Service.Tags.FirstOrDefault(), item.Service.ID)) == "下线") { offLineServices.Add(item); } } List <ServiceEntry> resultTestServices = new List <ServiceEntry>(); // 当且仅当部分服务是灰度服务的时候 if (allTestServices.Count < passingServices.Count) { foreach (var item in allTestServices) { var testips = await ABTestingCache.Instance.GetServiceTestIp(item.Service.Service, item.Service.Tags.FirstOrDefault(), item.Service.ID); foreach (var ip in testips) { if (!string.IsNullOrEmpty(ip)) { long start = IP2Long(ip.Split('-')[0]); long end = IP2Long(ip.Split('-')[1]); long ipAddress = IP2Long(userIp); bool inRange = (ipAddress >= start && ipAddress <= end); if (inRange) { resultTestServices.Add(item); } } } } } var lastIndex = await GetServiceRoundRobin(serviceName, version, ct); // 如果ip地址匹配灰度发布,优先返回灰度发布的地址 if (resultTestServices.Count > 0) { passingServices = resultTestServices; } else { //不匹配则优先返回稳定版本 foreach (var item in allTestServices) { passingServices.Remove(item); } } // 移除下线的服务 foreach (var item in offLineServices) { passingServices.Remove(item); } return(ClusterStrategy.GetServiceByRoundRobin(passingServices, lastIndex)); }