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

本文涉及的产品
性能测试 PTS,5000VUM额度
简介: 上次我们分享了 Hystrix 具体流程,作为断路器实现,我们如何将 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

代码目录是酱紫的:

image.png

我们来看一下基本代码逻辑,屡一下:

初始化配置

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

image.png

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

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

image.png

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

  • Timeout

指的是,命令执行的超时时间

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

  • MaxConcurrentRequests

最大并发请求数

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

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

  • RequestVolumeThreshold

最小请求阈值

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

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

  • SleepWindow

超时窗口时间,指的是断路器打开  SleepWindow 时长后,进入半开状态

重新允许远程调用的发生,试探下游服务是否恢复正常

如果接下来的请求都是成功的,那么断路器会关闭,否则就会重新打开

  • ErrorPercentThreshold

指的是,错误比例阈值

当滑动窗口时间内的错误请求频率超过这个值的时候,断路器也会打开

小案例

我们写一个小案例,来使用这个hystrix

  • 配置 hystrix

image.png

  • new 一个 hystrix , NewStreamHandler

go

复制代码

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 工具,打了之后,我们可以看到服务器的打印效果如下:

image.png

出现上述打印,说明,已经达到了最大并发请求数

继续往下看

image.png

看到如上错误,说明断路器已经打开了,这个时候来的请求一律拒绝,就不会再去访问 掘金的网站了

等待 SleepWindow 超时窗口时间后,会进入到半开状态,这个时候,若再有请求,并且全都成功,那么断路器就会关闭掉

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

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

欢迎点赞,关注,收藏

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

image.png

好了,本次就到这里

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

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

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
相关文章
|
3月前
|
Go
Golang生成随机数案例实战
关于如何使用Go语言生成随机数的三个案例教程。
200 91
Golang生成随机数案例实战
|
27天前
|
运维 NoSQL Java
后端架构演进:微服务架构的优缺点与实战案例分析
【10月更文挑战第28天】本文探讨了微服务架构与单体架构的优缺点,并通过实战案例分析了微服务架构在实际应用中的表现。微服务架构具有高内聚、低耦合、独立部署等优势,但也面临分布式系统的复杂性和较高的运维成本。通过某电商平台的实际案例,展示了微服务架构在提升系统性能和团队协作效率方面的显著效果,同时也指出了其带来的挑战。
61 4
|
3月前
|
Go
Golang的time.NewTimer单次定时器使用案例
这篇文章介绍了Go语言中time包的多种定时器使用案例,包括单次定时器的创建、阻塞程序运行的Sleep函数、重置和停止定时器的方法,以及After和AfterFunc函数的使用。
57 5
Golang的time.NewTimer单次定时器使用案例
|
3月前
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
64 3
Golang语言之Prometheus的日志模块使用案例
|
3月前
|
Java 微服务 Spring
微服务(九)-Hystrix(断路器)
微服务(九)-Hystrix(断路器)
|
3月前
|
Go
Golang语言基本数据类型默认值及字符串之间互相转换案例
这篇文章讲解了Golang语言中基本数据类型的默认值、类型转换的概述以及整型、浮点型、字符串之间的相互转换案例,包括如何将基本数据类型转换为字符串类型和字符串类型转换为基本数据类型,以及字符串与字节切片之间的转换。
30 2
|
3月前
|
Go
Golang语言数据类型分类及进制转换案例
这篇文章详细介绍了Go语言中数据类型的分类、进制转换的概念和实例,以及数字字面量语法,还涉及了原码、反码和补码的相关知识。
22 0
Golang语言数据类型分类及进制转换案例
|
3月前
|
Go
Golang的time.NewTicker周期性定时器使用案例
这篇文章介绍了Golang中time包的NewTicker函数如何创建周期性定时器,并通过两个示例展示了如何使用定时器以及如何停止定时器。
75 1
|
4月前
|
存储 设计模式 前端开发
|
3月前
|
缓存 负载均衡 数据管理
深入探索微服务架构的核心要素与实践策略在当今软件开发领域,微服务架构以其独特的优势和灵活性,已成为众多企业和开发者的首选。本文将深入探讨微服务架构的核心要素,包括服务拆分、通信机制、数据管理等,并结合实际案例分析其在不同场景下的应用策略,旨在为读者提供一套全面、深入的微服务架构实践指南。**
**微服务架构作为软件开发领域的热门话题,正引领着一场技术革新。本文从微服务架构的核心要素出发,详细阐述了服务拆分的原则与方法、通信机制的选择与优化、数据管理的策略与挑战等内容。同时,结合具体案例,分析了微服务架构在不同场景下的应用策略,为读者提供了实用的指导和建议。