/// <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 ServiceBlackPlicy.Add(serviceName, failedChannel.Target); failedChannel.ShutdownAsync(); // if not exist invoker, call init method if (callInvokers.Count <= 0) { SetCallInvokers(serviceName, false); } } }
/// <summary> /// 初始化callinvoker /// </summary> /// <param name="serviceName"></param> /// <param name="filterBlack">过滤黑名单 default true</param> /// <returns></returns> private List <ServerCallInvoker> SetCallInvokers(string serviceName, bool filterBlack = true) { if (!_discoveries.TryGetValue(serviceName, out IEndpointDiscovery discovery)) { return(null); } _invokers.TryGetValue(serviceName, out List <ServerCallInvoker> callInvokers); callInvokers = callInvokers ?? new List <ServerCallInvoker>(); var targets = discovery.FindServiceEndpoints(filterBlack); if ((targets?.Count ?? 0) <= 0) { // 如果consul 取不到 暂时直接使用本地缓存的连接(注册中心数据清空的情况--异常) _invokers.TryGetValue(serviceName, out callInvokers); return(callInvokers); } var channelOptions = new List <ChannelOption>() { new ChannelOption(ChannelOptions.MaxReceiveMessageLength, int.MaxValue), new ChannelOption(ChannelOptions.MaxSendMessageLength, int.MaxValue), }; foreach (var target in targets) { if (!_channels.TryGetValue(target, out Channel channel)) { channel = new Channel(target, ChannelCredentials.Insecure, channelOptions); _channels.AddOrUpdate(target, channel, (key, value) => channel); } if (callInvokers.Any(x => ReferenceEquals(x.Channel, channel))) { continue; } var callInvoker = new ServerCallInvoker(channel); callInvokers.Add(callInvoker); } // 移除已经销毁的callInvokers var destroyInvokers = callInvokers.Where(oo => !targets.Contains(oo.Channel.Target)).ToList(); foreach (var invoker in destroyInvokers) { _channels.TryRemove(invoker.Channel.Target, out Channel channel); callInvokers.Remove(invoker); } _invokers.AddOrUpdate(serviceName, callInvokers, (key, value) => callInvokers); return(callInvokers); }
/// <summary> /// SetCallInvokers /// </summary> /// <param name="serviceName"></param> /// <param name="filterBlack">过滤黑名单 default true</param> /// <returns></returns> private List <ServerCallInvoker> GetSetCallInvokers(string serviceName, bool filterBlack = true) { if (!_discoveries.TryGetValue(serviceName, out IEndpointDiscovery discovery)) { return(null); } _invokers.TryGetValue(serviceName, out List <ServerCallInvoker> callInvokers); callInvokers = callInvokers ?? new List <ServerCallInvoker>(); var targets = discovery.FindServiceEndpoints(filterBlack); foreach (var target in targets) { if (!_channels.TryGetValue(target, out Channel channel)) { channel = new Channel(target, ChannelCredentials.Insecure, Constants.DefaultChannelOptions); _channels.AddOrUpdate(target, channel, (key, value) => channel); } if (callInvokers.Any(x => ReferenceEquals(x.Channel, channel))) { continue; } var callInvoker = new ServerCallInvoker(channel); callInvokers.Add(callInvoker); } // 移除已经销毁的callInvokers var destroyInvokers = callInvokers.Where(oo => !targets.Contains(oo.Channel.Target)).ToList(); foreach (var invoker in destroyInvokers) { _channels.TryRemove(invoker.Channel.Target, out Channel channel); callInvokers.Remove(invoker); } _invokers.AddOrUpdate(serviceName, callInvokers, (key, value) => callInvokers); return(callInvokers); }