Skip to content
Owen edited this page Apr 29, 2019 · 7 revisions

微服务里熔断是绝不可少的,而C#里最有名的就是Polly里,Uragano默认就采用了Polly。

启用熔断及全局策略配置

service.AddUragano(context.Configuration, builder =>
                    {
                        builder.AddServer();
                        builder.AddConsul();
                        builder.AddCircuitBreaker<CircuitBreakerEvent>();
                    });

其中CircuitBreakerEvent是自定义的熔断事件通知处理程序,是非必选的,实现ICircuitBreakerEvent接口即可。

配置

"Uragano": {
    "CircuitBreaker": {
      "Polly": {
        "timeout": 2000,
        "retry": 3,
        "ExceptionsAllowedBeforeBreaking": 10,
        "DurationOfBreak": 60000,
        "MaxParallelization": 0,
        "MaxQueuingActions": 0
      }
    }
  }
配置 说明
Timeout 执行超时时间(毫秒)
Retry 重试次数
ExceptionsAllowedBeforeBreaking 出现多少次异常就打开断路器
DurationOfBreak 断路器打开多久后尝试关闭(毫秒)
MaxParallelization 允许最大的并发数
MaxQueuingActions 允许排队任务的最大数量

局部策略

局部策略可以通过CircuitBreakerAttribute自定义属性注入,相比全局策略,局部策略多了两个配置

配置 说明
FallbackExecuteScript 降级时执行的csharp脚本
ScriptUsingNameSpaces 执行降级脚本需要引入的命名空间

如果没有设置降级脚本,当服务降级是就会返回服务方法返回值类型的默认值。

禁用熔断

如果有个别服务不需要用到熔断,你可以使用NonCircuitBreakerAttribute自定义属性禁用熔断

注意

  1. 熔断一般都是针对客户端的,所以我们的自定义属性必须加在服务接口上才会生效。
  2. 为了保证服务的高可用,每个服务都会运行多个实例,如果启用了重试机制,我们在调用一个服务时出现问题,Uragano会自动切换到下一个实例进行调用。为了达到这样的效果,Uragano就必须自己实现负载
  3. 熔断只针对远程调用熔断,对于缓存拦截,用户自定义拦截器是不起作用的。
Clone this wiki locally