Example #1
0
        /// <summary>
        /// 服务请求
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="serviceScheme">服务名称:(http/https)</param>
        /// <param name="serviceName">服务名称</param>
        /// <param name="requirePath">服务路径</param>
        /// <returns></returns>
        public async Task <T> GetAsync <T>(string serviceScheme, string serviceName, string requirePath)
        {
            // 1. 获取服务
            var serviceList = await _serviceDiscovery.Discovery(serviceName);

            if (serviceList == null || serviceList.Count == 0)
            {
                throw new Exception($"没有找到 {serviceName} 的可用服务。");
            }

            // 2. 负载均衡服务
            var service = _loadBalance.Select(serviceList);

            // 3. 请求服务
            var httpClient = _httpClientFactory.CreateClient("ConsulHttpClient");
            //var response = await httpClient.GetAsync($"{service.Url}{requirePath}");//TODO:Ocelot结合Consul会出错,注意Scheme.
            var response = await httpClient.GetAsync($"{serviceScheme}://{service.Url}{requirePath}");

            // 3.1 响应结果,json转换为对象
            if (response.StatusCode == HttpStatusCode.OK)
            {
                var json = await response.Content.ReadAsStringAsync();

                var result = JsonConvert.DeserializeObject <T>(json);
                return(result);
            }
            else
            {
                throw new Exception($"{serviceName}服务调用异常");
            }
        }
        /// <summary>
        /// Get方法
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// param name="ServiceSchme">服务名称:(http/https)</param>
        /// <param name="ServiceName">服务名称</param>
        /// <param name="serviceLink">服务路径</param>
        /// <returns></returns>
        public async Task <T> GetAsync <T>(string Serviceshcme, string ServiceName, string serviceLink)
        {
            // 1、获取服务
            IList <ServiceUrl> serviceUrls = await serviceDiscovery.Discovery(ServiceName);

            // 2、负载均衡服务
            ServiceUrl serviceUrl = loadBalance.Select(serviceUrls);

            // 3、建立请求
            Console.WriteLine($"请求路径:{Serviceshcme} +'://'+{serviceUrl.Url} + {serviceLink}");
            HttpClient httpClient = httpClientFactory.CreateClient("mrico");
            // HttpResponseMessage response = await httpClient.GetAsync(serviceUrl.Url + serviceLink);
            HttpResponseMessage response = await httpClient.GetAsync(Serviceshcme + "://" + serviceUrl.Url + serviceLink);

            // 3.1json转换成对象
            if (response.StatusCode == HttpStatusCode.OK)
            {
                string json = await response.Content.ReadAsStringAsync();

                return(JsonConvert.DeserializeObject <T>(json));
            }
            else
            {
                // 3.2、进行自定义异常处理,这个地方进行了降级处理
                throw new Exception($"{ServiceName}服务调用错误:{response.Content.ReadAsStringAsync()}");
            }
        }
Example #3
0
        /// <summary>
        /// 重选,先从非selected的列表中选择,没有在从selected列表中选择.
        /// </summary>
        /// <param name="loadbalance"></param>
        /// <param name="invocation"></param>
        /// <param name="invokers"></param>
        /// <param name="selected"></param>
        /// <param name="availablecheck"></param>
        /// <returns></returns>
        private URL reselect(ILoadBalance loadbalance, IInvocation invocation, IList <URL> invokers, IList <URL> selected, bool availablecheck)
        {
            //预先分配一个,这个列表是一定会用到的.
            List <URL> reselectInvokers = new List <URL>(invokers.Count > 1 ? (invokers.Count - 1) : invokers.Count);

            //先从非select中选
            if (availablecheck)
            { //选isAvailable 的非select
                foreach (var invoker in invokers)
                {
                    if (selected == null || !selected.Contains(invoker))
                    {
                        reselectInvokers.Add(invoker);
                    }
                }
                if (reselectInvokers.Count > 0)
                {
                    return(loadbalance.Select(reselectInvokers, invocation));
                }
            }
            else
            { //选全部非select
                foreach (var invoker in invokers)
                {
                    if (selected == null || !selected.Contains(invoker))
                    {
                        reselectInvokers.Add(invoker);
                    }
                }
                if (reselectInvokers.Count > 0)
                {
                    return(loadbalance.Select(reselectInvokers, invocation));
                }
            }
            //最后从select中选可用的.
            {
                if (selected != null)
                {
                    foreach (var invoker in selected)
                    {
                        if (!reselectInvokers.Contains(invoker))
                        {
                            reselectInvokers.Add(invoker);
                        }
                    }
                }
                if (reselectInvokers.Count > 0)
                {
                    return(loadbalance.Select(reselectInvokers, invocation));
                }
            }
            return(null);
        }
        /// <summary>
        /// Get 方法
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="serviceSchme">服务名称(http/https)</param>
        /// <param name="serviceName">服务名称</param>
        /// <param name="serviceLink">服务路径</param>
        /// <returns></returns>
        public async Task <T> GetAsync <T>(string serviceSchme, string serviceName, string serviceLink
                                           , Func <T, T> filterFunc = null)
        {
            //获取服务
            IList <ServiceUrl> serviceUrls = await _serviceDiscovery.Discovery(serviceName);

            //负载均衡服务
            ServiceUrl serviceUrl = _loadBalance.Select(serviceUrls);
            //建立请求
            HttpClient          httpClient   = _httpClientFactory.CreateClient("fcdtwin");
            HttpResponseMessage httpResponse = await httpClient.GetAsync(serviceUrl.Url + serviceLink);

            //json转换成对象
            if (httpResponse.StatusCode == HttpStatusCode.OK)
            {
                string json = await httpResponse.Content.ReadAsStringAsync();

                T data = JsonConvert.DeserializeObject <T>(json);
                if (filterFunc != null)
                {
                    data = filterFunc.Invoke(data);
                }
                return(data);
            }
            else
            {
                throw new Exception($"{serviceName}服务调用错误");
            }
        }
        public IDbConnection CreateRead(string name)
        {
            DatabaseSetting database;

            if (!_databases.TryGetValue(name, out database))
            {
                throw new Exception("Create database connection fail, because database not exists which keyed [{0}]".FormatWith(name));
            }

            var connectionString = _loadBalance.Select(database.Reads);

            return(this.Connect(connectionString));
        }
Example #6
0
        protected virtual ServiceProxy <TService> Open()
        {
            var meta = _loadBalance.Select <ServiceMetadata>(_weightCalculator, _metadatas, _serviceIdentity);

            if (meta == null)
            {
                throw new ServiceMetadataNotFoundException(typeof(TService));
            }

            var binding = this.GetBinding(meta);
            var address = new EndpointAddress(meta.Address);

            return(new ServiceProxy <TService>(binding, address));
        }
Example #7
0
        private URL doselect(ILoadBalance loadbalance, IInvocation invocation, IList <URL> invokers, IList <URL> selected)
        {
            if (invokers == null || invokers.Count == 0)
            {
                return(null);
            }
            if (invokers.Count == 1)
            {
                return(invokers[0]);
            }
            // 如果只有两个invoker,退化成轮循
            if (invokers.Count == 2 && selected?.Count > 0)
            {
                return(selected[0] == invokers[0] ? invokers[1] : invokers[0]);
            }
            var invoker = loadbalance.Select(invokers, invocation);

            //如果 selected中包含(优先判断) 或者 不可用&&availablecheck=true 则重试.
            if ((selected != null && selected.Contains(invoker)) || availablecheck)
            {
                try
                {
                    var rinvoker = reselect(loadbalance, invocation, invokers, selected, availablecheck);
                    if (rinvoker != null)
                    {
                        invoker = rinvoker;
                    }
                    else
                    {
                        //看下第一次选的位置,如果不是最后,选+1位置.
                        int index = invokers.IndexOf(invoker);
                        try
                        {
                            //最后在避免碰撞
                            invoker = index < invokers.Count - 1 ? invokers[index + 1] : invoker;
                        }
                        catch (Exception e)
                        {
                            Logger().LogWarning(e, e.Message + " may because invokers list dynamic change, ignore.");
                        }
                    }
                }
                catch (Exception t)
                {
                    Logger().LogError(t, $"clustor relselect fail reason is :{t.Message} if can not slove ,you can set cluster.availablecheck=false in url");
                }
            }
            return(invoker);
        }
        public string GetMiddleUrl(string urlScheme, string serviceName)
        {
            //1.获取服务url
            IList <ServiceNode> serviceNodes = _serviceDiscovery.Discovery(serviceName);

            if (serviceNodes.Count == 0)
            {
                throw new FrameException($"{serviceName} 服务不存在");
            }

            //2.url负载均衡
            var serviceNode = _loadBalance.Select(serviceNodes);

            return(urlScheme + "://" + serviceNode.Url);
        }
Example #9
0
        public string GetMiddleUrl(string urlShcme, string serviceName)
        {
            // 1、获取服务url
            IList <ServiceNode> serviceUrls = serviceDiscovery.Discovery(serviceName);

            // 2、url负载均衡
            ServiceNode serviceUrl = loadBalance.Select(serviceUrls);

            // 3、创建url
            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.Append(urlShcme);
            stringBuilder.Append("://");
            stringBuilder.Append(serviceUrl.Url);
            return(stringBuilder.ToString());
        }
        public string GetMiddleUrl(string urlShcme, string serviceName)
        {
            // 1、获取服务url
            IList <ServiceNode> serviceUrls = serviceDiscovery.Discovery(serviceName);

            if (serviceUrls.Count == 0)
            {
                throw new FrameException($"{serviceName} 服务不存在");
            }

            // 2、url负载均衡
            ServiceNode serviceUrl = loadBalance.Select(serviceUrls);

            // 3、创建url
            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.Append(urlShcme);
            stringBuilder.Append("://");
            stringBuilder.Append(serviceUrl.Url);
            return(stringBuilder.ToString());
        }
Example #11
0
        /// <summary>
        /// Get方法
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// param name="ServiceSchme">服务名称:(http/https)</param>
        /// <param name="ServiceName">服务名称</param>
        /// <param name="serviceLink">服务路径</param>
        /// <returns></returns>
        public async Task <T> GetAsync <T>(string Serviceshcme, string ServiceName, string serviceLink)
        {
            // 1、获取服务
            IList <ServiceUrl> serviceUrls = await serviceDiscovery.Discovery(ServiceName);

            // 2、负载均衡服务
            ServiceUrl serviceUrl = loadBalance.Select(serviceUrls);

            // 3、建立请求
            HttpClient          httpClient = httpClientFactory.CreateClient("consul");
            HttpResponseMessage response   = await httpClient.GetAsync(serviceUrl.Url + serviceLink);

            // 3.1json转换成对象
            if (response.StatusCode == HttpStatusCode.OK)
            {
                string json = await response.Content.ReadAsStringAsync();

                return(JsonConvert.DeserializeObject <T>(json));
            }
            else
            {
                throw new Exception($"{ServiceName}服务调用错误");
            }
        }
        public async Task <IList <Team> > GetTeams()
        {
            // 1、获取服务
            IList <ServiceUrl> serviceUrls = await serviceDiscovery.Discovery(ServiceName);

            // 2、负载均衡服务
            ServiceUrl serviceUrl = loadBalance.Select(serviceUrls);

            // 3、建立请求
            HttpClient          httpClient = httpClientFactory.CreateClient();
            HttpResponseMessage response   = await httpClient.GetAsync(serviceUrl.Url + serviceLink);

            // 3.1json转换成对象
            IList <Team> teams = null;

            if (response.StatusCode == HttpStatusCode.OK)
            {
                string json = await response.Content.ReadAsStringAsync();

                teams = JsonConvert.DeserializeObject <List <Team> >(json);
            }

            return(teams);
        }
Example #13
0
        internal static T Select <T>(this ILoadBalance loadBalance, List <T> items)
        {
            var weightCalculator = new EmptyWeightCalculator <T>();

            return(loadBalance.Select(weightCalculator, items, "database-dispatch"));
        }