美文网首页
golang 微服务开发(十)使用micro中间件实现服务熔断、

golang 微服务开发(十)使用micro中间件实现服务熔断、

作者: mafa1993 | 来源:发表于2022-05-13 17:34 被阅读0次

    hystrix结合micro中间件

    1. 目的:使用micro的中间件,实现服务的降级和熔断,将代码剥离,api里只发送rpc请求,不去处理降级和熔断
    2. 使用的是micro的中间,发起rpc请求时进行一些操作,而不是gin的中间件
    3. 在wrapper下创建hystrix/hystrix.go 里面实现降级和熔断
    4. 创建app/api/v1/goodsWra.go 进行中间件的结合
    5. 创建wg路由,请求goodswra中的方法
    package v1
    
    import (
        "fmt"
        "strconv"
    
        "client/rpc"
    
        "github.com/afex/hystrix-go/hystrix"
        "github.com/gin-gonic/gin"
    )
    
    func GetGoods(c *gin.Context) {
        goodsId, _ := strconv.Atoi(c.Query("goods_id")) // 将接收到的goods_id 转换为int
    
        // rpc 请求超过一秒就熔断
    
        // 定义hystrix配置,
        configHy := hystrix.CommandConfig{
            Timeout: 1000, // 超时时间  默认1000毫秒
        }
    
        // 对Chystrix的指令进行配置
        hystrix.ConfigureCommand("goodsHy", configHy)
    
        var goodsInfo interface{} // 在函数内部和外部都要使用,定义成全局的
        // 使用前面定义的命令,第二个参数为这个命令的具体做什么操作,第三个参数为服务降级操作
        err := hystrix.Do("goodsHy", func() error {
            // 在发起rpc请求之前,使用hystrix,定义服务熔断和降级
            goodsInfo, err := rpc.GetGoodsDetails(goodsId)
            fmt.Println("goodsInfo", goodsInfo)
            return err
        }, func(e error) error {
            // 降级方法,降级方法不建议使用复杂业务
            // 一般读文件缓存或者是读取缓存
            fmt.Println("降级")
            goodsInfo = demotion()
            return nil
        })
    
        // 这里可能是hystrix抛出异常,或者是rpc调用后返回的异常
        if err != nil {
            c.JSON(200, err.Error())
            panic(1)
        }
    
        c.JSON(200, goodsInfo)
    }
    
    package rpc
    
    import (
        proto "client/proto"
        "context"
        "fmt"
    
        hh "client/wrapper/hystrix"
        "client/wrapper/login"
    
        micro "github.com/micro/go-micro/v2"
        "github.com/micro/go-micro/v2/registry"
        consul "github.com/micro/go-plugins/registry/consul/v2"
    )
    
    var goodsCli proto.GoodsService
    
    
    // 所有rpc调用都需要基于这个区调用,先初始化
    func init() {
    
        microWra := micro.NewService(
            micro.Name("goods"), // 定义服务名
            micro.WrapClient(hh.NewClientWrapper()),
            micro.WrapClient(login.NewClientWrapper()), // 定义中间件
        )
    
        // 使用中间件重新生成rpc的客户端
        goodsCli = proto.NewGoodsService("goods", microWra.Client())
    
    }
    
    // rpc调用GetGoodDetails
    func GetGoodsDetails(goodsId int) (*proto.ResponseGoods, error) {
        fmt.Println("rpc  goodsid ", goodsId)
        res, err := goodsCli.GetGoodsDetails(context.Background(), &proto.RequestGoods{
            GoodsId: int32(goodsId),
        })
    
        return res, err
    }
    
    

    相关文章

      网友评论

          本文标题:golang 微服务开发(十)使用micro中间件实现服务熔断、

          本文链接:https://www.haomeiwen.com/subject/upkmurtx.html