之前说到过微服务容错处理,可以使用 断路器
使用断路器的原因是:
当下游的服务因为过载或故障,无法提供服务,我们需要及时的让上游服务知悉,且暂时 熔断 调用方和提供方的调用链,这是为了避免服务雪崩现象的发生
go 里面可以使用什么方式来做断路器 呢?
go 中有一个项目实现了 这个断路器的功能:
https://github.com/afex/hystrix-go
Hystrix 能够在服务提供者出现故障时,隔离调用者和提供者,防止服务级联失败
并且 Hystrix 还提供失败回滚的逻辑,是系统快速从异常中恢复
为啥要用 Hystrix 来作为断路器?
如下是 golang 微服务容错处理是如何做的? 提到的断路器的 三种状态:
结合起来看看 Hystrix 具体流程
上述流程我们可以这样来理解
图中我们可以看到 Metrics 控制器,
当我们的服务执行异常或者下游服务超时的时候, hystrix 命令就会向 Metrics 控制器 上报执行结果,并且 hystrix 命令对应的逻辑会进入到失败回滚逻辑
Metrics 控制器使用滑动窗口的方式统计一段时间内的调用次数,失败次数,超时次数 和 被拒绝的次数,下一篇的案例代码中,有体现如何配置
这个被拒绝的次怎么理解呢?指的是在向执行池子请求通行证的时候,池子已满,故被拒绝
如果这段时间内,执行错误的频率出超过了断路器错误率的阈值,那么断路器就会打开
在重试超时定时器到达之前的请求都会直接进入失败回滚逻辑,拒绝执行真正的远程调用
因此这就可以达到微服务容错的目的