• Hystrix熔断器的使用_Golang


    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/

  • 相关阅读:
    struts.custom.i18n.resources 如何配置多个资源文件?
    axis : java.lang.NoSuchMethodError
    org/apache/commons/discovery/tools/DiscoverSingleton
    java.lang.NoClassDefFoundError: javax/wsdl/OperationType
    .propertie文件注释
    数据库的名称尽量要以英文开头,如果全部输数字的话可能会出错的
    单例模式
    java异常 之 异常的层次结构
    php抓取网页
    'hibernate.dialect' must be set when no Connection available
  • 原文地址:https://www.cnblogs.com/ExMan/p/15926582.html
Copyright © 2020-2023  润新知