zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Hystrix熔断器的使用_Golang

Golang Hystrix 使用
2023-09-14 09:12:20 时间

Hystrix熔断器的使用_Golang
下载hystrix-go

go get github.com/afex/hystrix-go
1
正常使用

// 超时代码
// 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
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
和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}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
在micro.NewService中注册该装饰器

myservice := micro.NewService{
micro.Name("test"),
micro.WrapClient(wrapper.NewProdsWrapper),
}
1
2
3
4
优化服务降级模块设置

// 通用降级方法
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)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
设置给熔断器参数
RequestVolumeThreshold:20 //当请求次数超过20次数后,进行错误百分比计算(有相应概率直接进入降级服务)

ErrorPercentThreshold:50 //错误百分比,默认为50%

SleepWindow: 5000 //多长时间之后再次检测是否开启服务
————————————————
版权声明:本文为CSDN博主「猫撵耗子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010471976/article/details/106158960/