API网关Ocelot 使用Polly 处理局部退步难题

     
葡京娱乐总站平台 1 

using Ocelot.Logging;
using Polly;
using Polly.CircuitBreaker;
using Polly.Timeout;
using System;
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

namespace Ocelot.Requester
{
    public class CircuitBreakingDelegatingHandler : DelegatingHandler
    {
        private readonly IOcelotLogger _logger;
        private readonly int _exceptionsAllowedBeforeBreaking;
        private readonly TimeSpan _durationOfBreak;
        private readonly Policy _circuitBreakerPolicy;
        private readonly TimeoutPolicy _timeoutPolicy;

        public CircuitBreakingDelegatingHandler(int exceptionsAllowedBeforeBreaking, TimeSpan durationOfBreak,TimeSpan timeoutValue
            ,TimeoutStrategy timeoutStrategy, IOcelotLogger logger, HttpMessageHandler innerHandler)
            : base(innerHandler)
        {
            this._exceptionsAllowedBeforeBreaking = exceptionsAllowedBeforeBreaking;
            this._durationOfBreak = durationOfBreak;

            _circuitBreakerPolicy = Policy
                .Handle<HttpRequestException>()
                .Or<TimeoutRejectedException>()
                .Or<TimeoutException>()
                .CircuitBreakerAsync(
                    exceptionsAllowedBeforeBreaking: exceptionsAllowedBeforeBreaking,
                    durationOfBreak: durationOfBreak,
                    onBreak: (ex, breakDelay) =>
                    {
                        _logger.LogError(".Breaker logging: Breaking the circuit for " + breakDelay.TotalMilliseconds + "ms!", ex);
                    },
                    onReset: () => _logger.LogDebug(".Breaker logging: Call ok! Closed the circuit again."),
                    onHalfOpen: () => _logger.LogDebug(".Breaker logging: Half-open; next call is a trial.")
                    );
            _timeoutPolicy = Policy.TimeoutAsync(timeoutValue, timeoutStrategy);
            _logger = logger;
        }

        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            Task<HttpResponseMessage> responseTask = null;

            try
            {
                responseTask = Policy.WrapAsync(_circuitBreakerPolicy, _timeoutPolicy).ExecuteAsync<HttpResponseMessage>(() =>
                {
                    return  base.SendAsync(request,cancellationToken);
                });
                return responseTask;
            }
            catch (BrokenCircuitException ex)
            {
                _logger.LogError($"Reached to allowed number of exceptions. Circuit is open. AllowedExceptionCount: {_exceptionsAllowedBeforeBreaking}, DurationOfBreak: {_durationOfBreak}",ex);
                throw;
            }
            catch (HttpRequestException)
            {
                return responseTask;
            }
        }

        private static bool IsTransientFailure(HttpResponseMessage result)
        {
            return result.StatusCode >= HttpStatusCode.InternalServerError;
        }
    }
}

      能够见到,CPU的占用率一直相比平静,未有太大的起伏。

欢迎大家参预建设.NET
Core的微服务开发框架。从给项目Ocelot 点赞和fork代码先河,一起来建设,新春本人曾经给项目进献了二个天性的代码,服务意识和本文所讲的熔断器。

     
触摸屏测试小工具的下载地址:http://files.cnblogs.com/we-hjb/TSCApp.rar

在达成API
Gateway进度中,此外二个急需思量的题材正是局部退步。那一个标题发出在分布式系统中当多少个服务调用别的3个劳务超时大概不可用的场合。API
Gateway不该被堵嘴并处于Infiniti期等待下游服务的气象。可是,怎么着处理这种战败正视于特定的气象和切实服务。借使是成品音讯服务无响应,那么API
Gateway就活该给客户端再次来到贰个荒谬。

      看来触摸驱动确实还有越发优化的不能缺少,供给抓实手写灵敏度参数。

https://www.cnblogs.com/lwqlun/p/8119856.html葡京娱乐总站平台,  

     
葡京娱乐总站平台 2

Ocelot从完毕上来说就是一多重的中间件组合,在HTTP请求到达Ocelot,经过一多级的中间件的处理转载到下游的劳务,在那之中负责调用下游服务的中间件是HttpRequestBuilderMiddleware,通过调用HttpClient请求下游的HTTP服务,我们那边正是要给HttpClient
的调用加上熔断器效用,代码参看https://github.com/TomPallister/Ocelot/pull/27/files
,重要的1段代码如下:

葡京娱乐总站平台 3

Ocelot 是三个使用.NET
Core平台上的三个API
Gateway,近年来自小编在加入那个类其他费用,开发到位第一个就是利用Polly处理局地战败难题。各位同学只怕对波利这么些体系面生,先不难介绍下,Polly是.NET基金会下的多少个开源项目,波利记录这几个超过预设定的极限值的调用。它实现了
circuit break情势,使得能够将客户端从无响应服务的限度等待中截止。如若2个劳务的错误率超过预设值,Polly将中止服务,并且在一段时间内装有请求即刻失效,波利能够为呼吁失败定义1个fallback操作,例如读取缓存大概再次来到默许值,有时候我们须要调用其他API的时候出现一时半刻连接不通超时的情况,这那时候也得以透过Polly实行Retry,具体消息参考
http://www.thepollyproject.org/2016/10/25/polly-5-0-a-wider-resilience-framework/

     
图中的37/s象征的是手写输入的灵敏度参数。在按下触摸屏并快捷的滑动时,观望该参数的大大小小,该值越大表达手写输入的灵敏度越高,该值越小,表明手写输入的灵敏度越低,也便是说使用手写输入法时或许会现出笔迹不够圆滑的意况。37/s略微低了有的,依照老邓的说的,要很好的支撑手写输入最佳能(CANON)到60左右,至少也赢得50。用M8上测试了一晃,它能到86/s,如下图所示。

上边代码大家应用Policy.WrapAsync组合了熔断器和重试的七个政策来解决1些退步难点,思路一点也不细略,定义须要处理的非凡有怎么着,比如
Policy.Handle<HttpRequestException>()
.Or<TimeoutRejectedException>()
.Or<TimeoutException>(),当格外发生时候必要咋样处理,使用熔断器依然重试,下面这些代码当然也是相符调用第3方服务用了。

     
对于触摸屏驱动来说,除了手写灵敏度参数外,其余2个很重大的题材正是跳笔。测试跳笔的方法也很简短,轻按触摸屏,观望小红点是还是不是发散,是还是不是离开按下的地点。发散得越厉害或离开按下的岗位越远,就证实跳笔越严重。

     
触摸驱动的CPU占用率也是一个内需思考的因素。下图是在TCC89平台上测试手写灵敏度参数时的Performance
Monitor截图。

     
很早在此在此以前在《四线电阻式触摸屏驱动的优化》一文中,介绍了TCC8九平台触摸驱动的改建方式。实践注脚,使用此办法后,触摸屏大约再也从没现身跳笔的情景,达到了预想的目标。近年来YJUN在调节和测试应用时,发现三个标题,狐疑跟触摸屏驱动有关系——触摸驱动在一秒内上报给操作系统的罗列太少,导致界面突显在滑行时不太流利。为了定量测试该参数,写了叁个粗略的小工具TSCApp.exe,界面如下图所示。