熔断器

三种状态

熔断器有三种状态,开启、关闭、半开,每种状态都有不同对应的操作,目前内部使用状态模式实现的。

  • 关闭状态 正常逻辑处理,当失败次数达到上限可以切换到开启状态
  • 开启状态 服务降级处理,一定时间延迟后尝试切换到半开状态
  • 半开状态 正常逻辑处理,当业务失败次数达到一定值,切换到开启,当业务成功次数达到一定值,切换到关闭。

注解

@Breaker

定义熔断器

  • name 熔断器名称,缺省默认是类名

定义熔断器

定义熔断器需要继承CircuitBreaker类,配置属性信息,配置信息可以通过@value@Config两个注解实现,注解详解请看配置章节。

  1. /**
  2. * the breaker of user
  3. *
  4. * @Breaker("user")
  5. */
  6. class UserBreaker extends CircuitBreaker
  7. {
  8. /**
  9. * The number of successive failures
  10. * If the arrival, the state switch to open
  11. *
  12. * @Value(name="${config.breaker.user.failCount}", env="${USER_BREAKER_FAIL_COUNT}")
  13. * @var int
  14. */
  15. protected $switchToFailCount = 3;
  16. /**
  17. * The number of successive successes
  18. * If the arrival, the state switch to close
  19. *
  20. * @Value(name="${config.breaker.user.successCount}", env="${USER_BREAKER_SUCCESS_COUNT}")
  21. * @var int
  22. */
  23. protected $switchToSuccessCount = 3;
  24. /**
  25. * Switch close to open delay time
  26. * The unit is milliseconds
  27. *
  28. * @Value(name="${config.breaker.user.delayTime}", env="${USER_BREAKER_DELAY_TIME}")
  29. * @var int
  30. */
  31. protected $delaySwitchTimer = 500;
  32. }

RPC使用

RPC中默认是根据@Reference注解指定的服务名称,加载名称相同的熔断器,进行逻辑处理

任意使用

可以再任意逻辑中使用熔断器

  1. \breaker('name')->call($handler, $params, $fallback);
  • $handler 可调用的callback
  • $params 调用传递的参数
  • $fallback 参考服务降级章节的普通服务降级