Ejemplo n.º 1
0
        private TResponse Call <TResponse>(Func <CallInvoker, TResponse> call)
        {
            int maxRetry = _maxRetry;

            while (true)
            {
                EndpointModel endpoint;
                var           callInvoker = _endpointStrategy.Get(_serviceName, out endpoint);
                if (callInvoker == null)
                {
                    throw new GrpcConsulException($"can't find servie: {_serviceName} from {(endpoint != null ? endpoint.ToString() : "")}");
                }
                try
                {
                    return(call(callInvoker));
                }
                catch (Exception ex)
                {
                    if (ex is RpcException && endpoint.IsDisconvry)
                    {
                        _endpointStrategy.AddBlack(endpoint.ToString());
                    } //加入黑名单,避免注册中心还存在,但是实际服务已经关闭时
                    if (0 > --maxRetry)
                    {
                        throw;
                    }
                } //直接异常抛出去
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="TResponse"></typeparam>
        /// <param name="call"></param>
        /// <param name="retryLeft"></param>
        /// <returns></returns>
        private TResponse Call <TResponse>(Func <CallInvoker, TResponse> call, int retryLeft)
        {
            while (true)
            {
                var callInvoker = default(ServerCallInvoker);
                try
                {
                    callInvoker = _strategy.Get(_serviceName);
                    if (callInvoker == null)
                    {
                        throw new ArgumentNullException($"{_serviceName}无可用节点");
                    }

                    var channel = callInvoker.Channel;
                    if (channel == null || channel.State == ChannelState.TransientFailure)
                    {
                        throw new RpcException(new Status(StatusCode.Unavailable, $"Channel Failure"));
                    }

                    var response = default(TResponse);
                    if (_tracer != null)
                    {
                        response = call(callInvoker.ClientIntercept(_tracer));
                    }
                    else
                    {
                        response = call(callInvoker);
                    }
                    return(response);
                }
                catch (RpcException ex)
                {
                    // 服务不可用,拉入黑名单
                    if (ex.Status.StatusCode == StatusCode.Unavailable)
                    {
                        _strategy.Revoke(_serviceName, callInvoker);
                    }

                    if (0 > --retryLeft)
                    {
                        throw new Exception($"status: {ex.StatusCode.ToString()}, node: {callInvoker?.Channel?.Target}, message: {ex.Message}", ex);
                    }
                }
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="TResponse"></typeparam>
        /// <param name="call"></param>
        /// <param name="retryLeft"></param>
        /// <returns></returns>
        private TResponse Call <TResponse>(Func <CallInvoker, TResponse> call, int retryLeft)
        {
            while (true)
            {
                var callInvoker = default(ServerCallInvoker);
                try
                {
                    callInvoker = _strategy.Get(_serviceName);
                    if (callInvoker == null)
                    {
                        throw new ArgumentNullException("无任何可用连接");
                    }

                    var channel = callInvoker.Channel;
                    if (channel == null || channel.State == ChannelState.TransientFailure)
                    {
                        throw new RpcException(new Status(StatusCode.Unavailable, "Channel Failure"));
                    }

                    var response = default(TResponse);
                    if (_tracer != null)
                    {
                        response = call(callInvoker.ClientIntercept(_tracer));
                    }
                    else
                    {
                        response = call(callInvoker);
                    }
                    return(response);
                }
                catch (RpcException ex)
                {
                    if (ex.Status.StatusCode == StatusCode.Unavailable)
                    {
                        _strategy.Revoke(_serviceName, callInvoker);
                    }

                    if (0 > --retryLeft)
                    {
                        throw;
                    }
                }
            }
        }
Ejemplo n.º 4
0
        private TResponse Call <TResponse>(string serviceName, Func <CallInvoker, TResponse> call, int retryLeft)
        {
            while (true)
            {
                var callInvoker = _endpointStrategy.Get(serviceName);
                try
                {
                    return(call(callInvoker));
                }
                catch (RpcException ex)
                {
                    // forget channel if unavailable
                    if (ex.Status.StatusCode == StatusCode.Unavailable)
                    {
                        _endpointStrategy.Revoke(serviceName, callInvoker);
                    }

                    if (0 > --retryLeft)
                    {
                        throw;
                    }
                }
            }
        }