15.熔斷器使用(1):hystrix初步、捕獲超時報錯


現在rpc服務端設置3秒延遲模擬

package ServiceImpl

import (
    "context"
    "go-micro-grpc/Services"
    "strconv"
    "time"
)

type ProdService struct {
}

func (*ProdService) GetProdsList(ctx context.Context, in *Services.ProdsRequest, res *Services.ProdListResponse) error {
    time.Sleep(time.Second * 3) //設置3秒延遲
    ret := make([]*Services.ProdModel, 0)
    var i int32
    for i = 0; i < in.Size; i++ {
        ret = append(ret, newProd(100+i, "prodname"+strconv.Itoa(100+int(i))))
    }
    res.Data = ret
    return nil
}

func newProd(id int32, pname string) *Services.ProdModel {
    return &Services.ProdModel{ProdID: id, ProdName: pname}
}

使用hystrix熔斷器

package Weblib

import (
    "github.com/afex/hystrix-go/hystrix"
    "github.com/gin-gonic/gin"
    "go-micro/Services"
)

func GetProdsList(ctx *gin.Context) {
    var prodReq Services.ProdsRequest
    prodservice := ctx.Keys["prodservice"].(Services.ProdService) //類型斷言之前通過中間件封裝到ctx中的prodService
    err := ctx.Bind(&prodReq)
    if err != nil {
        ctx.JSON(500, gin.H{"status": err.Error()})
    } else {
        //熔斷代碼改造
        //第一步,配置config
        configA := hystrix.CommandConfig{
            Timeout: 1000, //允許延遲一秒
        }
        //第二部,配置command
        hystrix.ConfigureCommand("getprods", configA)
        //執行使用Do方法
        var prodRes *Services.ProdListResponse
        err := hystrix.Do("getprods", func() error {
            prodRes, err = prodservice.GetProdsList(ctx, &prodReq)
            return err
        }, nil) //第二個func是業務代碼執行函數,第三個nil是降級函數,不采用降級可以傳入nil

        if err != nil {
            ctx.JSON(500, gin.H{"status": err.Error()})
        }
        ctx.JSON(200, gin.H{"data": prodRes.Data})
    }
}

因為我們設置的熔斷器允許的延遲是一秒,而服務端我們設置了3秒延遲,所以這里很明顯,會報錯,返回值如下






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM