

現在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秒延遲,所以這里很明顯,會報錯,返回值如下
