Hystrix熔断器的使用_Golang
下载hystrix-go
go get github.com/afex/hystrix-go
正常使用
// 超时代码
// import github.com/afex/hystrix-go/hystrix
// 1.配置config
configA := hystrix.CommandConfig{
Timeout: 1000,
}
// 2.配置command
hystrix.ConfigureCommand("getProds", configA)
// 3.执行Do方法
var prodRes *models.ProdListResponse
err := hystrix.Do("getProds", func() error {
prodRes, err = prodService.GetProdList(context.Background(), &prodReq)
return err
}, func(e error) error {
// 降级 显示默认产品
prodRes, err = defaultProds()
return err
})
和go-micro集成使用
采用装饰器模式,使用go-mirco的wrapper编写
新建一个Wrapper的文件
//定义对象装饰器
//import github.com/micro/go-micro/client
type ProdsWrapper struct {
client.Client
}
// Call 调用方法
func (p *ProdsWrapper) Call(ctx context.Context, req client.Request, rsp interface{}, opts ...client.CallOption) error {
cmdName := req.Service() + "." + req.Endpoint()
configA := hystrix.CommandConfig{Timeout: 1000}
hystrix.ConfigureCommand(cmdName, configA)
return hystrix.Do(cmdName, func() error {
return p.Client.Call(ctx, req, rsp)
}, func(e error) error {
//服务降级
defaultProds(rsp)
return nil
})
return p.Client.Call(ctx, req, rsp)
}
// NewProdsWrapper 初始化一个商品装饰器
func NewProdsWrapper(c client.Client) client.Client {
return &ProdsWrapper{c}
}
在micro.NewService中注册该装饰器
myservice := micro.NewService{
micro.Name("test"),
micro.WrapClient(wrapper.NewProdsWrapper),
}
优化服务降级模块设置
// 通用降级方法
func defaultData(rsp interface{}) {
switch t := rsp.(type) {
case *models.ProdListResponse:
defaultProds(rsp)
case *models.ProdDetailResponse:
t.Data = newProd(10, "降级商品")
}
}
// Call 调用方法
func (p *ProdsWrapper) Call(ctx context.Context, req client.Request, rsp interface{}, opts ...client.CallOption) error {
cmdName := req.Service() + "." + req.Endpoint()
configA := hystrix.CommandConfig{Timeout: 1000}
hystrix.ConfigureCommand(cmdName, configA)
return hystrix.Do(cmdName, func() error {
return p.Client.Call(ctx, req, rsp)
}, func(e error) error {
//服务降级
defaultProds(rsp)
return nil
})
return p.Client.Call(ctx, req, rsp)
}
设置给熔断器参数
RequestVolumeThreshold:20 //当请求次数超过20次数后,进行错误百分比计算(有相应概率直接进入降级服务)
ErrorPercentThreshold:50 //错误百分比,默认为50%
SleepWindow: 5000 //多长时间之后再次检测是否开启服务