示例#1
0
        /// <summary>
        /// 获取所有
        /// </summary>
        /// <param name="serviceName"></param>
        /// <returns></returns>
        public List <ServerCallInvoker> GetCallInvokers(string serviceName)
        {
            if (_invokers.TryGetValue(serviceName, out List <ServerCallInvoker> callInvokers) &&
                callInvokers.Count > 0)
            {
                return(callInvokers);
            }

            lock (_lock)
            {
                if (_invokers.TryGetValue(serviceName, out callInvokers) &&
                    callInvokers.Count > 0)
                {
                    return(callInvokers);
                }

                callInvokers = GetSetCallInvokers(serviceName);
                if ((callInvokers?.Count ?? 0) <= 0 && ServiceBlackPolicy.Exist(serviceName))
                {
                    callInvokers = GetSetCallInvokers(serviceName, false);
                }

                return(callInvokers);
            }
        }
        public List <string> FindServiceEndpoints(bool filterBlack = true)
        {
            if (_client == null)
            {
                throw new ArgumentNullException("consul client");
            }

            var targets = new List <string>();

            try
            {
                var r = _client.Health.Service(ServiceName, "", true).Result;
                if (r.StatusCode != HttpStatusCode.OK)
                {
                    throw new ApplicationException($"failed to query consul server");
                }

                targets = r.Response
                          .Select(x => $"{x.Service.Address}:{x.Service.Port}")
                          .Where(target => !ServiceBlackPolicy.In(ServiceName, target) || !filterBlack)
                          .ToList();
            }
            catch { }
            return(targets);
        }
        /// <summary>
        /// 屏蔽
        /// </summary>
        /// <param name="serviceName"></param>
        /// <param name="failedCallInvoker"></param>
        public void Revoke(string serviceName, ServerCallInvoker failedCallInvoker)
        {
            lock (_lock)
            {
                // invokers
                var failedChannel = failedCallInvoker.Channel;
                if (!_invokers.TryGetValue(serviceName, out List <ServerCallInvoker> callInvokers) ||
                    callInvokers.All(x => !ReferenceEquals(failedChannel, x.Channel)))
                {
                    return;
                }

                callInvokers.RemoveAt(callInvokers.FindIndex(x => ReferenceEquals(failedChannel, x.Channel)));
                _invokers.AddOrUpdate(serviceName, callInvokers, (key, value) => callInvokers);

                // channels
                if (_channels.TryGetValue(failedChannel.Target, out Channel channel) &&
                    ReferenceEquals(channel, failedChannel))
                {
                    _channels.TryRemove(failedChannel.Target, out failedChannel);
                }

                // add black
                ServiceBlackPolicy.Add(serviceName, failedChannel.Target);
                failedChannel.ShutdownAsync();

                // if not exist invoker, call init method
                if (callInvokers.Count <= 0)
                {
                    GetSetCallInvokers(serviceName, false);
                }
            }
        }
示例#4
0
        public List <Tuple <string, string> > FindServiceEndpoints(bool filterBlack = true)
        {
            if ((_ipEndPoints?.Count ?? 0) <= 0)
            {
                throw new ArgumentOutOfRangeException("endpoint not provide");
            }

            var targets = _ipEndPoints.Select(x => Tuple.Create("", $"{x.Item1}:{x.Item2}"))
                          .Where(target => !ServiceBlackPolicy.In(Options.ServiceName, target.Item2) || !filterBlack)
                          .ToList();

            return(targets);
        }