Пример #1
0
        /// <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));
        }
Пример #2
0
        /// <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));
        }
Пример #3
0
        ///获取服务
        /// <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));
        }
Пример #4
0
        /// <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));
        }