golang 微服务中的断路器 hystrix 小案例

简介: 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 性能测试工具来 打一下 我们的 服务器

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

  • 开启 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 超时窗口时间后,会进入到半开状态,这个时候,若再有请求,并且全都成功,那么断路器就会关闭掉

具体的源码分析,我们可以下篇娓娓道来

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

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

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

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
相关文章
|
2月前
|
监控 网络协议 Go
应用监控 eBPF 版:实现 Golang 微服务的无侵入应用监控
应用监控 eBPF 版:实现 Golang 微服务的无侵入应用监控
109652 118
|
6月前
|
Cloud Native Go 微服务
golang 微服务中的断路器 hystrix
golang 微服务中的断路器 hystrix
|
2月前
|
SpringCloudAlibaba Java 测试技术
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(六)Hystrix(豪猪哥)的使用
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(六)Hystrix(豪猪哥)的使用
43 1
|
5月前
|
监控 负载均衡 数据可视化
SpringCloud - Hystrix断路器-服务熔断与降级和HystrixDashboard
SpringCloud - Hystrix断路器-服务熔断与降级和HystrixDashboard
29 0
|
4天前
|
安全 Go
Golang深入浅出之-Go语言模板(text/template):动态生成HTML
【4月更文挑战第24天】Go语言标准库中的`text/template`包用于动态生成HTML和文本,但不熟悉其用法可能导致错误。本文探讨了三个常见问题:1) 忽视模板执行错误,应确保正确处理错误;2) 忽视模板安全,应使用`html/template`包防止XSS攻击;3) 模板结构不合理,应合理组织模板以提高可维护性。理解并运用这些最佳实践,能提升Go语言模板编程的效率和安全性,助力构建稳健的Web应用。
15 0
|
15小时前
|
安全 测试技术 Go
Golang深入浅出之-Go语言单元测试与基准测试:testing包详解
【4月更文挑战第27天】Go语言的`testing`包是单元测试和基准测试的核心,简化了测试流程并鼓励编写高质量测试代码。本文介绍了测试文件命名规范、常用断言方法,以及如何进行基准测试。同时,讨论了测试中常见的问题,如状态干扰、并发同步、依赖外部服务和测试覆盖率低,并提出了相应的避免策略,包括使用`t.Cleanup`、`t.Parallel()`、模拟对象和检查覆盖率。良好的测试实践能提升代码质量和项目稳定性。
6 1
|
15小时前
|
运维 监控 Go
Golang深入浅出之-Go语言中的日志记录:log与logrus库
【4月更文挑战第27天】本文比较了Go语言中标准库`log`与第三方库`logrus`的日志功能。`log`简单但不支持日志级别配置和多样化格式,而`logrus`提供更丰富的功能,如日志级别控制、自定义格式和钩子。文章指出了使用`logrus`时可能遇到的问题,如全局logger滥用、日志级别设置不当和过度依赖字段,并给出了避免错误的建议,强调理解日志级别、合理利用结构化日志、模块化日志管理和定期审查日志配置的重要性。通过这些实践,开发者能提高应用监控和故障排查能力。
8 1
|
15小时前
|
安全 Go
Golang深入浅出之-Go语言标准库中的文件读写:io/ioutil包
【4月更文挑战第27天】Go语言的`io/ioutil`包提供简单文件读写,适合小文件操作。本文聚焦`ReadFile`和`WriteFile`函数,讨论错误处理、文件权限、大文件处理和编码问题。避免错误的关键在于检查错误、设置合适权限、采用流式读写及处理编码。遵循这些最佳实践能提升代码稳定性。
5 0
|
1天前
|
安全 Unix Go
Golang深入浅出之-Go语言中的时间与日期处理:time包详解
【4月更文挑战第26天】Go语言的`time`包提供处理日期和时间的功能,包括`time.Time`类型、时间戳、格式化与解析。本文讨论了核心概念、常见问题(如时区处理、格式字符串混淆、超时控制和并发安全)及解决方法。推荐使用`time.LoadLocation`管理时区,熟悉时间格式规则,用`context`精确控制超时,并注意并发安全。文中通过代码示例展示了如何获取格式化时间、计算时间差以及创建定时任务。学习和应用这些知识可提高程序的健壮性和准确性。
15 2
|
1天前
|
XML JSON Go
Golang深入浅出之-XML处理在Go语言中的实现:encoding/xml包
【4月更文挑战第26天】Go语言的`encoding/xml`库提供XML处理,包括序列化和反序列化。本文讨论了XML处理的基础,如`xml.Marshal`和`xml.Unmarshal`函数,以及常见问题和易错点,如标签命名、结构体嵌套、omitempty标签和命名空间。建议遵循标签命名规则,正确处理嵌套和属性,谨慎使用omitempty,以及理解并有效利用命名空间。文中还给出了基础示例和处理XML属性的代码示例,帮助读者掌握XML处理技巧。
12 1
Golang深入浅出之-XML处理在Go语言中的实现:encoding/xml包