熔断降级是一种在系统出现故障或异常情况时,为了避免故障蔓延,对系统进行保护的机制。通常当某个服务或操作频繁失败时,会触发熔断,后续的请求会直接走降级逻辑,而不是继续尝试可能失败的操作。
熔断降级的基本概念
熔断:当系统检测到某个服务或操作的错误率超过一定阈值,或者在一定时间内出现过多的错误时,会触发熔断。熔断后,对该服务或操作的请求会直接被拦截,不再尝试调用实际的逻辑。
降级:在熔断触发后,会执行一个预先定义好的降级逻辑,返回一个默认值或者执行一些简单的处理,以避免长时间等待或者系统崩溃。
恢复:在熔断一段时间后(通常称为休眠窗口),系统会尝试恢复正常,重新允许部分请求调用实际的逻辑,根据调用结果来判断是否继续熔断。
实现熔断降级
选择熔断降级库
在 Go 语言中,有一些常用的熔断降级库,比如 hystrix-go
、go-kit/circuitbreaker
等,我用 hystrix-go
配置熔断参数
在使用 hystrix-go
时,需要配置一些熔断的参数,这些参数决定了熔断的触发条件和恢复机制。例如:
package main
import (
"github.com/afex/hystrix-go/hystrix"
)
func init() {
// 配置熔断命令
hystrix.ConfigureCommand("myCommand", hystrix.CommandConfig{
Timeout: 1000, // 超时时间,单位毫秒
MaxConcurrentRequests: 100, // 最大并发请求数
ErrorPercentThreshold: 25, // 错误率阈值,超过该阈值会触发熔断
SleepWindow: 5000, // 熔断后的休眠窗口时间,单位毫秒
})
}
Timeout
:表示请求的超时时间,如果一个请求的处理时间超过这个时间,就会被认为是超时,会触发熔断。MaxConcurrentRequests
:表示最大并发请求数,当并发请求数超过这个值时,新的请求可能会被拒绝。ErrorPercentThreshold
:表示错误率阈值,当错误率超过这个值时,会触发熔断。SleepWindow
:表示熔断后的休眠窗口时间,在熔断触发后,会进入休眠窗口,在这个时间段内,所有请求都会直接走熔断降级逻辑,休眠窗口结束后,会尝试恢复正常。
编写正常逻辑和降级逻辑
在使用 hystrix-go
时,需要编写正常逻辑和降级逻辑。正常逻辑是在系统正常情况下执行的逻辑,降级逻辑是在熔断触发后执行的逻辑。
package main
import (
"fmt"
"github.com/afex/hystrix-go/hystrix"
)
func main() {
err := hystrix.Do("myCommand", func() error {
// 正常逻辑
fmt.Println("执行正常逻辑")
// 模拟错误
return fmt.Errorf("发生错误")
}, func(err error) error {
// 降级逻辑
fmt.Println("执行降级逻辑")
return nil
})
if err != nil {
fmt.Println("操作失败:", err)
}
}
hystrix.Do 函数接受三个参数:
- 第一个参数是熔断命令的名称,需要和配置时的名称一致。
- 第二个参数是一个匿名函数,用于执行正常逻辑。
- 第三个参数是一个匿名函数,用于执行降级逻辑。当正常逻辑出现错误(包括超时、错误率超过阈值等情况)时,会执行这个降级函数。