你真正的了解hystrix-go嘛

我是一只可爱的土拨鼠,专注于分享 Go 职场、招聘和求职,解 Gopher 之忧!欢迎关注我。

欢迎大家加入Go招聘交流群,来这里找志同道合的小伙伴!跟土拨鼠们一起交流学习。

Hystrix[1]是 Netflix 的一个非常棒的项目。

Hystrix 是一个延迟和容错库,旨在隔离对远程系统、服务和第三方库的访问点,防止级联故障,并在故障不可避免的复杂分布式系统中实现弹性。

我认为程序员定义的回退(fallbacks)和自适应健康监控的 Hystrix 模式适用于任何分布式系统。Goroutines和channels是很好的并发原语,但不能直接帮助我们的应用程序在故障期间保持可用。

hystrix-go[2] 旨在让 Go 程序员轻松构建具有与基于 Java 的 Hystrix 库类似的执行语义的应用程序。

有关 Hystrix 工作原理的更多信息,请参阅Java Hystrix wiki[3]

有关 API 文档,请参阅pkg.go.dev[4]

如何使用

import "github.com/afex/hystrix-go/hystrix"

将代码作为 Hystrix 命令执行

定义依赖于外部系统的应用程序逻辑,将函数传递给hystrix.Go. 当该系统正常健康时,会执行此方法。

hystrix.Go("my_command", func() error {
 // talk to other services
 return nil
}, nil)

定义回退行为

如果你希望在服务中断期间执行代码,可以将第二个函数传递给hystrix.Go. 理想情况下,这儿的逻辑可以使应用程序优雅地处理不可用的外部服务。

当代码返回一个错误时,或者当它基于各种健康检查[5]无法完成时,就会触发此事件。

hystrix.Go("my_command", func() error {
 // talk to other services
 return nil
}, func(err error) error {
 // do this when services are down
 return nil
})

等待输出

调用hystrix.Go就像启动一个 goroutine,你会收到一个可以select监控的error channel。

output := make(chan bool, 1)
errors := hystrix.Go("my_command", func() error {
 // talk to other services
 output <- true
 return nil
}, nil)

select {
case out := <-output:
 // success
case err := <-errors:
 // failure
}

同步 API

由于调用命令并立即等待它完成是种常见的模式,因此hystrix提供了一个同步API。hystrix.Do函数返回一个错误。

err := hystrix.Do("my_command", func() error {
 // talk to other services
 return nil
}, nil)

配置设置

在应用程序启动期间,你可以调用hystrix.ConfigureCommand()来调整每个命令的设置。

hystrix.ConfigureCommand("my_command", hystrix.CommandConfig{
 Timeout:               1000,
 MaxConcurrentRequests: 100,
 ErrorPercentThreshold: 25,
})

你也可以使用hystrix.Configure(),它接受一个map[string]CommandConfig的map。

如何启用仪表板指标

在你的 main.go 中,在端口上注册事件流 HTTP 处理程序并在 goroutine 中启动它。一旦你为Hystrix 仪表板[6]配置了涡轮机以开始流式传输事件,你的命令将自动开始出现。

在 main.go 中,在端口上注册事件流 HTTP 处理程序,并在 goroutine 中启动它。一旦为 Hystrix 仪表板配置了涡轮机(turbine)以启动流事件,命令将自动开始显示。

hystrixStreamHandler := hystrix.NewStreamHandler()
hystrixStreamHandler.Start()
go http.ListenAndServe(net.JoinHostPort("", "81"), hystrixStreamHandler)

将circuit指标发送到 Statsd

c, err := plugins.InitializeStatsdCollector(&plugins.StatsdCollectorConfig{
 StatsdAddr: "localhost:8125",
 Prefix:     "myapp.hystrix",
})
if err != nil {
 log.Fatalf("could not initialize statsd client: %v", err)
}

metricCollector.Registry.Register(c.NewStatsdCollector)

FAQ

如果我的运行函数发生了panic会怎么样?hystrix-go 会触发回退吗?

不,hystrix-go 不使用recover(),所以panic会像平常一样杀死进程。

如何构建和测试

  • 安装 vagrant 和 VirtualBox

  • 将hystrix-go 存储库clone下来

  • 在 hystrix-go 目录中,运行vagrant up,然后vagrant ssh

  • cd /go/src/github.com/afex/hystrix-go

  • go test ./...

相关的库

谈到熔断限流的话题,想必大家也想到了阿里开源的面向分布式、多语言异构化服务架构的流量治理组件 sentinel-go[7] ,关于sentinel-go中滑动窗口的设计,感兴趣的同学可以查看深度解析Sentinel Go 滑动窗口统计结构的设计

另外关于hstrix-go源码分析的章节,可以查看小土之前转发阿松的微服务架构下的熔断框架:hystrix-go

参考资料

[1]

Hystrix: https://github.com/Netflix/Hystrix

[2]

hystrix-go: https://github.com/afex/hystrix-go/

[3]

Java Hystrix wiki: https://github.com/Netflix/Hystrix/wiki

[4]

pkg.go.dev: https://pkg.go.dev/github.com/afex/hystrix-go/hystrix

[5]

各种健康检查: https://github.com/Netflix/Hystrix/wiki/How-it-Works

[6]

Hystrix 仪表板: https://github.com/Netflix/Hystrix/tree/master/hystrix-dashboard

[7]

sentinel-go: https://github.com/alibaba/sentinel-golang


资料下载

点击下方卡片关注公众号,发送特定关键字获取对应精品资料!

  • 回复「电子书」,获取入门、进阶 Go 语言必看书籍。

  • 回复「视频」,获取价值 5000 大洋的视频资料,内含实战项目(不外传)!

  • 回复「路线」,获取最新版 Go 知识图谱及学习、成长路线图。

  • 回复「面试题」,获取四哥精编的 Go 语言面试题,含解析。

  • 回复「后台」,获取后台开发必看 10 本书籍。

对了,看完文章,记得点击下方的卡片。关注我哦~ 👇👇👇

如果您的朋友也在学习 Go 语言,相信这篇文章对 TA 有帮助,欢迎转发分享给 TA,非常感谢!d5a5f0e8ec0b684e3cadeefa4688d533.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值