微服务如何保证不会出现连锁反应?Go 实现的断路器了解下( 二 )

circuit.Circuittype Circuit struct {//circuitStatsCmdMetricCollectorRunMetricsCollection// 统计调用出现的各种情况FallbackMetricCollector FallbackMetricsCollection// 统计降级调用出现的各种情况CircuitMetricsCollector MetricsCollection// 统计Circuit状态切换的情况// This is used to help run `Go` calls in the backgroundgoroutineWrapper goroutineWrapper // 用于异步调用的封装namestring// 断路器唯一命名的标识notThreadSafeConfig Config // 非线程安全的断路器配置notThreadSafeConfigMu sync.MutexthreadSafeConfigatomicCircuitConfig // 线程安全的断路器配置// Tracks if the circuit has been shut open or closedisOpen faststats.AtomicBoolean // 断路器只有“打开”和“关闭”两种状态// Tracks how many commands are currently runningconcurrentCommands faststats.AtomicInt64// 统计有多少并发调用// Tracks how many fallbacks are currently runningconcurrentFallbacks faststats.AtomicInt64// 统计有多少降级的并发调用// ClosedToOpen controls when to open a closed circuitClosedToOpen ClosedToOpen// 控制断路器由“关闭”状态切换到“打开”状态// openToClosed controls when to close an open circuitOpenToClose OpenToClosed// 控制断路器由“打开”状态切换到“关闭”状态timeNow func() time.Time// 对time.Now的封装 , 值始终为config.General.TimeKeeper.Now , 从config.TimeKeeper的解释看是为了方便测试 , 当没在测试代码里有看到使用}circuit.ClosedToOpentype ClosedToOpen interface {RunMetrics// 统计调用出现的各种情况Metrics// 统计状态切换的情况// 当出现ErrFailure和ErrTimeout的失败调用时 , 会调用ShouldOpen , ShouldOpen会根据RunMetrics信息决定是否切换到“打开”状态ShouldOpen(now time.Time) bool// 即使断路器处于“关闭”状态 , 也希望能阻止调用Prevent(now time.Time) bool}【微服务如何保证不会出现连锁反应?Go 实现的断路器了解下】circuit/v3/closers/hystrix/opener.go 是 hystrix 的默认实现 , 实现了 circuit.ClosedToOpen 接口 。
type Opener struct {errorsCountfaststats.RollingCounter // 统计调用出现的ErrFailure和ErrTimeout的情况legitimateAttemptsCount faststats.RollingCounter // 统计调用出现的ErrFailure和ErrTimeout , 以及Success的情况errorPercentagefaststats.AtomicInt64 // 错误阈值requestVolumeThreshold faststats.AtomicInt64 // 如果在一段时间窗口内的调用次数小于该阈值 , 则不会将断路器切换到“打开”状态musync.Mutex // 修改config时的互斥锁config ConfigureOpener}// faststats.RollingCounter 是滑动窗口计数器 , 用于统计一段时间窗口内 , 对每个时间片上发生的事件进行计数circuit.OpenToClosedtype OpenToClosed interface {RunMetrics// 统计调用出现的各种情况Metrics// 统计状态切换的情况// 当调用成功时 , 会调用ShouldClose , ShouldClose会根据RunMetrics信息决定是否切换到“关闭”状态ShouldClose(now time.Time) bool// “半打开”状态的实现 , 用于在断路器处于“打开”状态时 , 允许部分调用执行Allow(now time.Time) bool}circuit/v3/closers/hystrix/closer.go 是 hystrix 的默认实现 , 实现了 circuit.OpenToClosed 接口 。
type Closer struct {// 当断路器处于“打开”状态时 , 定时放行部分调用 , 被OpenToClosed.Allow调用reopenCircuitCheck faststats.TimedCheckconcurrentSuccessfulAttempts faststats.AtomicInt64 // 当调用为Success时 , 加1 , 当调用为ErrFailure、ErrTimeout时 , 重置为0closeOnCurrentCountfaststats.AtomicInt64 // 切换到“关闭”状态的阈值 , 在OpenToClosed.ShouldClose中使用musync.Mutex // 修改config时的互斥锁config ConfigureCloser}


推荐阅读