天天看点

hystrix-go服务降级和限流的实现

作者:石老师小跟班

前言

为啥会说到这个组件呢? 主要是最近再和某银行项目进行接口对接,做过银行项目的都懂吧,那接口的承载能力,是吧,有点让人无语!每次出问题,都要人工介入,想想都刺激~,于是在网上查找一个hystrix-go组件, 可以帮我们解决一些问题

1. Hystrix

Hystrix 是由 Netflex 开发的一款开源组件,提供了基础的熔断功能。 Hystrix 将降级的策略封装在 Command 中,提供了 run 和 fallback 两个方法,前者表示正常的逻辑,比如微服务之间的调用……,如果发生了故障,再执行 fallback方法返回结果,我们可以把它理解成保底操作。但是这个组件是为JAVA实现的,而hystrix-go组件是基于go 实现的 简单版本;

疑问: 这个组件是没有人维护了吗?都4,5年没有更新过了,有知道的小伙伴可以在底下留言告诉我哈!

2. Hystrix-go的基本使用

#安装Hystrix-go组件
 go get github.com/afex/hystrix-go/hystrix           

2.1 源码如下(这里不是业务代码,只是一个示例)

package main
 
 import (
     "errors"
     "fmt"
     "github.com/afex/hystrix-go/hystrix"
     "github.com/gin-gonic/gin"
     "net/http"
     "time"
 )
 
 // 创建一个中间件
 func TestMiddleware(ctx *gin.Context) {
     hystrix.Do("baidu", func() error {
         ctx.Next()
         //这里判断的是返回状态
         code := ctx.Writer.Status()
         if code != 200 {
             return errors.New("status err")
         }
         return nil
     }, func(err error) error {
         if err != nil {
             //写日志,发短信,发邮件等操作,这里主要做些异常处理,进行补偿操作
             ctx.JSON(500, gin.H{
                 "msg": "请求接口失败",
             })
         }
         return nil
     })
 
 }
 func init() {
     hystrix.ConfigureCommand("baidu", hystrix.CommandConfig{
         Timeout:                int(time.Second * 10), //执行command的超时时间
         MaxConcurrentRequests:  10,                    //执行command的最大并发量
         RequestVolumeThreshold: 100,                   //在统计窗口内的最大请求数量
         SleepWindow:            int(time.Second * 2),  //请求窗口
         ErrorPercentThreshold:  20,                    //错误百分比
 
     })
 }
 func main() {
     r := gin.Default()
     fmt.Println("abc")
     r.GET("/test", func(c *gin.Context) {
         //这里以baidu为例,正常的话,就是你请求的那业务接口
         _, err := http.Get("https://www.baidu.com")
         if err != nil {
             c.JSON(500, gin.H{
                 "mes": err,
             })
             return
         }
         c.JSON(200, gin.H{
             "msg": "this is ok",
         })
     }, TestMiddleware)
     r.Run(":8888")
 }
            

总结

没有啥知识点,这个组件使用起来还是比较简单的 ,根据自己的业务需求来实现就可以了,

在对接第三方时,一定要评估好对方接口的承载能力,要不天天需要人工处理,真的会谢!!!!

继续阅读