多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
~~~ package main import ( "fmt" "github.com/sony/gobreaker" "os" "time" ) var num = 0 func main() { // 创建一个熔断器 breaker := gobreaker.NewCircuitBreaker(gobreaker.Settings{ Name: "example-circuit-breaker", Timeout: 1 * time.Second, ReadyToTrip: func(counts gobreaker.Counts) bool { // 自定义触发条件,例如:失败率达到50% failureRatio := float64(counts.TotalFailures) / float64(counts.Requests) return counts.Requests >= 10 && failureRatio >= 0.5 }, OnStateChange: func(name string, from gobreaker.State, to gobreaker.State) { // 熔断状态变化时的自定义处理 fmt.Printf("Circuit Breaker state changed from %v to %v\n", from, to) }, //打开状态 (Open):一旦触发了熔断条件,熔断器将进入打开状态,暂时拒绝所有请求。 //半开状态 (Half-Open):在指定的间隔时间(由 Interval 参数定义)后,熔断器将尝试切换到半开状态。在半开状态下,它允许一些请求通过,以测试服务是否已经恢复。 //关闭状态 (Closed):如果半开状态下的请求成功,熔断器将切换回关闭状态,允许所有请求通过。这表示服务已经恢复正常。 //再次打开状态 (Open):如果半开状态下的请求仍然失败,熔断器将再次进入打开状态,以防止继续向不稳定的服务发送请求。 Interval: 10 * time.Second, // 指定切换到半开状态的时间间隔 }) // 模拟服务调用函数 callService := func() (string, error) { fmt.Println(1) num++ fmt.Println(num) if num < 20 { // 在此处执行实际的服务调用逻辑,这里简单返回一个成功响应 return "Service response", os.ErrNotExist } else { // 在此处执行实际的服务调用逻辑,这里简单返回一个成功响应 return "Service response", nil } } for i := 0; i < 20000; i++ { result, err := breaker.Execute(func() (interface{}, error) { // 在 Execute 函数内执行服务调用 return callService() }) if err != nil { fmt.Printf("Request failed: %v\n", err) } else { response, ok := result.(string) if ok { fmt.Println("Request succeeded:", response) } } time.Sleep(time.Microsecond * 10000) } } ~~~