static async Task Main(string[] args) { var sp = ConfigureServices(); CircuitBreakerLog.Init(sp.GetRequiredService <ILoggerFactory>()); var cb = sp.GetService <ICircuitBreaker>(); var input = new CircuitRequest { CircuitKey = "api-books", RequestId = Guid.NewGuid().ToString(), // Retry = 1, // Timeout = TimeSpan.FromMilliseconds(50) }; input.Context.SetAppName("web-bookworm"); input.Context.SetServiceName("api-search"); await Execute(cb, input); var ts = Stopwatch.StartNew(); for (var i = 0; i < 500; i++) { await Execute(cb, input); } ts.Stop(); Console.WriteLine($"Total:{ts.ElapsedMilliseconds}ms"); Console.ReadLine(); }
protected override async Task <HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var key = GetPropertyValue <string>(request, PropertyNames.CircuitKey); var requestId = GetPropertyValue <string>(request, PropertyNames.RequestId); var appName = GetPropertyValue <string>(request, PropertyNames.AppName); var serviceName = GetPropertyValue <string>(request, PropertyNames.ServiceName); if (string.IsNullOrWhiteSpace(key)) { key = request.RequestUri.Host; } var circuitRequest = new CircuitRequest { CircuitKey = key, RequestId = requestId, Retry = 0, Timeout = TimeSpan.Zero }; circuitRequest.Context.SetAppName(appName); circuitRequest.Context.SetServiceName(serviceName); var cr = await _circuitBreaker.ExecuteAsync <HttpResponseMessage>(circuitRequest, async (cx) => { var response = await base.SendAsync(request, cancellationToken); if (response.IsSuccessStatusCode) { return(response); } if (response.StatusCode == System.Net.HttpStatusCode.InternalServerError || response.StatusCode == System.Net.HttpStatusCode.GatewayTimeout || response.StatusCode == System.Net.HttpStatusCode.ServiceUnavailable || response.StatusCode == System.Net.HttpStatusCode.BadGateway) { response.Dispose(); throw new Exception($"Response failed with status code {response.StatusCode}"); } if (response.StatusCode == System.Net.HttpStatusCode.RequestTimeout) { response.Dispose(); throw new TimeoutException("Raising timeout to break circuit"); } return(response); }); return(cr.Value); //HttpRequestLog.Info($"HttpRequest starting | Url: {request.RequestUri} | Method: {request.Method}"); //var sw = Stopwatch.StartNew(); //var response = await base.SendAsync(request, cancellationToken); //sw.Stop(); //HttpRequestLog.Info($"HttpRequest completed | StatusCode: {response.StatusCode} | Url : {request.RequestUri} | Method: {request.Method} | TimeTaken: {sw.ElapsedMilliseconds}ms"); //return response; }