package main import ( "context" "fmt" "github.com/afex/hystrix-go/hystrix" consul "github.com/asim/go-micro/plugins/registry/consul/v4" "github.com/go-micro/plugins/v4/wrapper/select/roundrobin" opentracing2 "github.com/go-micro/plugins/v4/wrapper/trace/opentracing" "github.com/opentracing/opentracing-go" "go-micro.dev/v4/client" "go-micro.dev/v4/web" "goproduct/common" "goproduct/proto" "log" "net" "net/http" "strconv" "github.com/gin-gonic/gin" "go-micro.dev/v4" "go-micro.dev/v4/registry" ) // 获取远程服务的客户端 func main() { router := gin.Default() //注册到consul consulReg := consul.NewRegistry(func(options *registry.Options) { options.Addrs = []string{"192.168.100.131:8500"} }) //初始化链路追踪的jaeper t, io, err := common.NewTracer("shop-cart-client", "192.168.100.131:6831") if err != nil { log.Println(err) } defer io.Close() opentracing.SetGlobalTracer(t) //熔断器 hystrixStreamHandler := hystrix.NewStreamHandler() hystrixStreamHandler.Start() go func() { err := http.ListenAndServe(net.JoinHostPort("192.168.100.1", "9096"), hystrixStreamHandler) if err != nil { log.Panic(err) } }() rpcServer := micro.NewService( //micro.Name("shop-product-client"), micro.Registry(consulReg), //服务发现 micro.WrapClient(opentracing2.NewClientWrapper(opentracing.GlobalTracer())), //加入熔断器 micro.WrapClient(NewClientHystrixWrapper()), //负载均衡 micro.WrapClient(roundrobin.NewClientWrapper()), ) client := proto.NewAddCartService("shop-cart", rpcServer.Client()) clientA := proto.NewShowProductDetailService("shop-product", rpcServer.Client()) clientB := proto.NewShowDetailSkuService("shop-product", rpcServer.Client()) //分页查询商品列表 router.GET("/increase", func(c *gin.Context) { // "number": 0, // "productId": 0, // "productSkuId": 0 number, _ := strconv.Atoi(c.Request.FormValue("number")) productId, _ := strconv.Atoi(c.Request.FormValue("productId")) productSkuId, _ := strconv.Atoi(c.Request.FormValue("productSkuId")) //拼接请求信息 req := &proto.AddCartReq{ Number: int32(number), ProductId: int32(productId), ProductSkuId: int32(productSkuId), } //商品详情 reqDetail := &proto.ProductDetailReq{ Id: int32(productId), } respDetail, err := clientA.ShowProductDetail(context.TODO(), reqDetail) if respDetail != nil { req.ProductName = respDetail.ProductDetail[0].Name req.ProductMainPicture = respDetail.ProductDetail[0].MainPicture } log.Println(" /ShowProductDetail resp :", respDetail) //SKU详情 reqDetail.Id = req.ProductSkuId respSkuDetail, err := clientB.ShowDetailSku(context.TODO(), reqDetail) log.Println(" /ShowDetailSku resp :", respSkuDetail) //添加购物车 远程调用服务 log.Println(" /AddCart req :", req) if respSkuDetail.ProductSku[0].Stock < req.Number { common.RespFail(c.Writer, &proto.AddCartResp{}, "库存不足,添加失败") return } resp, err := client.AddCart(context.TODO(), req) resp.ProductSkuSimple = respSkuDetail.ProductSku[0] resp.ProductSimple = respDetail.ProductDetail[0] log.Println(" /AddCart resp :", resp) //根据响应做输出 if err != nil { log.Println(err.Error()) common.RespFail(c.Writer, resp, "请求失败") return } ////writer data message row total field common.RespOK(c.Writer, resp, "请求成功") }) service := web.NewService( web.Address(":6668"), web.Name("shop-cart-client"), web.Registry(consulReg), web.Handler(router), ) //启动服务 service.Run() } type clientWrapper struct { client.Client } func (c clientWrapper) Call(ctx context.Context, req client.Request, resp interface{}, opts ...client.CallOption) error { return hystrix.Do(req.Service()+"."+req.Endpoint(), func() error { //正常执行 fmt.Println("call success ", req.Service()+"."+req.Endpoint()) return c.Client.Call(ctx, req, resp, opts...) }, func(err error) error { fmt.Println("call err :", err) return err }) } func NewClientHystrixWrapper() client.Wrapper { return func(i client.Client) client.Client { return &clientWrapper{i} } }