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