乐趣区

关于后端:golang-微服务中的断路器-hystrix-小案例

上次咱们分享了 Hystrix 具体流程,作为断路器实现,咱们如何将 hystrix 用在咱们的我的项目代码中呢?

咱们能够简略的将 hystrix-go 下载下来

go get github.com/afex/hystrix-go/hystrix

代码会放到咱们的 GOPATH 中,的 pkg 上面,例如我的 window 门路是这样的

go\pkg\mod\github.com\afex\hystrix-go@v0.0.0-20180502004556-fa1af6a1f4f5\hystrix

代码目录是酱紫的:

咱们来看一下根本代码逻辑,屡一下:

初始化配置

hystrix.ConfigureCommand(CircuitBreakerName, hystrix.CommandConfig{
        Timeout:                1000, 
        MaxConcurrentRequests:  5,
        RequestVolumeThreshold: 3,
        SleepWindow:            2000,
        ErrorPercentThreshold:  20,
    })

能够看到 \go\pkg\mod\github.com\afex\hystrix-go@v0.0.0-20180502004556-fa1af6a1f4f5\hystrix\settings.go

中会有这个构造体定义的默认值

解释一下上述默认值代表的意思

  • Timeout

指的是,命令执行的超时工夫

近程调用逻辑执行超过该工夫将被 强制执行超时,就进行失败回滚中,默认是 1000 毫秒

  • MaxConcurrentRequests

最大并发申请数

示意每个 hystrix 命令最大执行的并发协程,用于进行流量管制和资源隔离

当同种的 hystrix 执行的并发数量超过了该值,申请将会间接进入到失败回滚逻辑中,并被标记为拒绝请求上报

  • RequestVolumeThreshold

最小申请阈值

只有滑动窗口工夫内的申请数量超过该值,断路器才会执行对应的判断逻辑

在低申请量的时候,断路器是不会产生效应的,即时这些申请全副失败,因为他只有没有超过这个值,就不会触发

  • SleepWindow

超时窗口工夫,指的是断路器关上 SleepWindow 时长后,进入半开状态

从新容许近程调用的产生,试探上游服务是否恢复正常

如果接下来的申请都是胜利的,那么断路器会敞开,否则就会从新关上

  • ErrorPercentThreshold

指的是,谬误比例阈值

当滑动窗口工夫内的谬误申请频率超过这个值的时候,断路器也会关上

小案例

咱们写一个小案例,来应用这个 hystrix

  • 配置 hystrix
  • new 一个 hystrix,NewStreamHandler
hystrixStreamHandler := hystrix.NewStreamHandler()
hystrixStreamHandler.Start()
  • 开一个 http 服务器,来专门来拜访 掘金主页
  • 应用 wrk 性能测试工具来 打一下 咱们的 服务器

    • wrk -c200 -t8 -d40 --latency http://127.0.0.1:9999/juejin

这个性能测试指令的意思是:

  • 开启 200 个连贯
  • 8 个线程
  • 测试 40 s

性能测试小工具的应用能够查看文章:性能测试小工具 wrk 能够怎么用

package main

import (
    "errors"
    "fmt"
    "github.com/afex/hystrix-go/hystrix"
    "github.com/gin-gonic/gin"
    "net/http"
)

// http  /juejin 具体执行的逻辑

func CircuitBreakerTest(ctx *gin.Context) {hystrix.Do("xiaomotong", func() error {ctx.Next()
        code := ctx.Writer.Status()
        if code != http.StatusOK {return errors.New(fmt.Sprintf("状态码是:%d", code))
        }
        return nil

    }, func(err error) error {
        if err != nil {fmt.Printf("断路器检测到谬误:%s\n", err.Error())
            // 返回熔断谬误
            ctx.JSON(http.StatusServiceUnavailable, gin.H{"msg": err.Error(),
            })
        }
        return nil
    })
}

// 整个包的初始化,初始化 hystrix
func init() {
    hystrix.ConfigureCommand("xiaomotong", hystrix.CommandConfig{
        Timeout:                1000,
        MaxConcurrentRequests:  5,
        RequestVolumeThreshold: 5,
        SleepWindow:            5000,
        ErrorPercentThreshold:  20,
    })
}

func main() {hystrixStreamHandler := hystrix.NewStreamHandler()

    hystrixStreamHandler.Start()

    go http.ListenAndServe(":9999", hystrixStreamHandler)
    r := gin.Default()
    gin.SetMode(gin.ReleaseMode)

    r.GET("/juejin", func(c *gin.Context) {_, err := http.Get("https://juejin.cn/")
        if err != nil {c.JSON(http.StatusInternalServerError, gin.H{"msg": err.Error()})
            return
        }

        c.JSON(http.StatusOK, gin.H{"msg": "success"})
    }, CircuitBreakerTest)

    r.Run(":9999")
}

应用 wrk 工具,打了之后,咱们能够看到服务器的打印成果如下:

呈现上述打印,阐明,曾经达到了最大并发申请数

持续往下看

看到如上谬误,阐明断路器曾经关上了,这个时候来的申请一律回绝,就不会再去拜访 掘金的网站了

期待 SleepWindow 超时窗口工夫后,会进入到半开状态,这个时候,若再有申请,并且全都胜利,那么断路器就会敞开掉

具体的源码剖析,咱们能够下篇娓娓道来

明天就到这里,学习所得,若有偏差,还请斧正

欢送点赞,关注,珍藏

敌人们,你的反对和激励,是我保持分享,提高质量的能源

好了,本次就到这里

技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。

我是 阿兵云原生,欢送点赞关注珍藏,下次见~

退出移动版