粘贴点代码,方便来看
package main
import (
"errors"
"github.com/afex/hystrix-go/hystrix"
"github.com/gin-gonic/gin"
"log"
"net/http"
"time"
)
func main() {
router := gin.Default()
router.GET("/time", TimeHandler)
router.Run(":1234")
}
func TimeHandler(c *gin.Context) {
hystrix.ConfigureCommand("time", hystrix.CommandConfig{
Timeout: 1000, //单位为毫秒,表示服务调用的最大响应时间,超过该时间的调用将被认为是超时错误
MaxConcurrentRequests: 10, //表示熔断器允许的最大并发请求数,超过该数量的请求将被拒绝
RequestVolumeThreshold: 10, //表示触发熔断器的最小请求数量,即在一个时间窗口内请求数量的最小值
ErrorPercentThreshold: 50, //表示错误百分比阈值,即当错误百分比超过该值时,熔断器会触发熔断机制
SleepWindow: 1000, //单位为毫秒,表示当熔断器进入Open状态后,会进入休眠时间窗口,该参数用于设置休眠时间窗口的时长。
// 在休眠时间窗口内,熔断器会拒绝所有的服务调用请求,并等待一段时间后再次检测服务是否恢复正常
})
//runFunc 内部可以处理外部的值
runFunc := func() error {
//time.Sleep(time.Second * 2) //err:hystrix: timeout
timestamp := time.Now().Unix()
if timestamp%2 == 0 {
c.JSON(http.StatusOK, gin.H{"msg": "right"})
return nil
}
return errors.New("")
}
fallback := func(err error) error {
c.JSON(http.StatusBadRequest, gin.H{
"msg": "time stamp wrong",
})
log.Println(err)
return errors.New("")
}
err := hystrix.Do("time", runFunc, fallback)
// 处理熔断器启动的情况
if err == hystrix.ErrCircuitOpen {
c.JSON(http.StatusServiceUnavailable, gin.H{"message": "service unavailable"})
return
}
}