hystrix结合micro中间件
- 目的:使用micro的中间件,实现服务的降级和熔断,将代码剥离,api里只发送rpc请求,不去处理降级和熔断
- 使用的是micro的中间,发起rpc请求时进行一些操作,而不是gin的中间件
- 在wrapper下创建hystrix/hystrix.go 里面实现降级和熔断
- 创建app/api/v1/goodsWra.go 进行中间件的结合
- 创建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
}
网友评论