我是一只可爱的土拨鼠,专注于分享 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]
如何使用
将代码作为 Hystrix 命令执行
定义依赖于外部系统的应用程序逻辑,将函数传递给hystrix.Go
. 当该系统正常健康时,会执行此方法。
定义回退行为
如果你希望在服务中断期间执行代码,可以将第二个函数传递给hystrix.Go
. 理想情况下,这儿的逻辑可以使应用程序优雅地处理不可用的外部服务。
当代码返回一个错误时,或者当它基于各种健康检查[5]无法完成时,就会触发此事件。
等待输出
调用hystrix.Go
就像启动一个 goroutine,你会收到一个可以select监控的error channel。
同步 API
由于调用命令并立即等待它完成是种常见的模式,因此hystrix提供了一个同步API。hystrix.Do
函数返回一个错误。
配置设置
在应用程序启动期间,你可以调用hystrix.ConfigureCommand()
来调整每个命令的设置。
你也可以使用hystrix.Configure()
,它接受一个map[string]CommandConfig
的map。
如何启用仪表板指标
在你的 main.go 中,在端口上注册事件流 HTTP 处理程序并在 goroutine 中启动它。一旦你为Hystrix 仪表板[6]配置了涡轮机以开始流式传输事件,你的命令将自动开始出现。
在 main.go 中,在端口上注册事件流 HTTP 处理程序,并在 goroutine 中启动它。一旦为 Hystrix 仪表板配置了涡轮机(turbine)以启动流事件,命令将自动开始显示。
将circuit指标发送到 Statsd
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