golang熔断器使用

133 阅读1分钟

粘贴点代码,方便来看

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
   }
}