You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

193 lines
5.4 KiB

2 years ago
package main
import (
"context"
"fmt"
"github.com/afex/hystrix-go/hystrix"
2 years ago
consul "github.com/asim/go-micro/plugins/registry/consul/v4"
"github.com/go-micro/plugins/v4/wrapper/select/roundrobin"
2 years ago
opentracing2 "github.com/go-micro/plugins/v4/wrapper/trace/opentracing"
"github.com/opentracing/opentracing-go"
"go-micro.dev/v4/client"
2 years ago
"go-micro.dev/v4/web"
"goproduct/common"
"goproduct/proto"
"log"
"net"
"net/http"
2 years ago
"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)
}
}()
2 years ago
rpcServer := micro.NewService(
//micro.Name("shop-product-client"),
micro.Registry(consulReg), //服务发现
micro.WrapClient(opentracing2.NewClientWrapper(opentracing.GlobalTracer())),
//加入熔断器
micro.WrapClient(NewClientHystrixWrapper()),
//负载均衡
micro.WrapClient(roundrobin.NewClientWrapper()),
2 years ago
)
client := proto.NewAddCartService("shop-cart", rpcServer.Client())
2 years ago
ShowProductDetailClient := proto.NewShowProductDetailService("shop-product", rpcServer.Client())
ShowDetailSkuClient := proto.NewShowDetailSkuService("shop-product", rpcServer.Client())
GetUserTokenClient := proto.NewGetUserTokenService("shop-user", rpcServer.Client())
2 years ago
UpdateSkuClient := proto.NewUpdateSkuService("shop-product", rpcServer.Client())
2 years ago
//分页查询商品列表
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"))
uuid := c.Request.Header["Uuid"][0]
//intUuid, _ := strconv.Atoi(uuid)
// intput := "101010101110110"
cc := common.GetInput(uuid)
out := common.SQ(cc)
sum := 0
for o := range out {
sum += o
2 years ago
}
//fmt.Println(sum)
2 years ago
//Token校验
//拼接请求信息
tokenReq := &proto.TokenReq{
Uuid: uuid,
2 years ago
}
//响应
tokenResp, err := GetUserTokenClient.GetUserToken(context.TODO(), tokenReq)
//拼接请求信息
respErr := &proto.AddCartResp{}
2 years ago
if err != nil || tokenResp.IsLogin == false {
log.Println("GetUserToken err : ", err)
common.RespFail(c.Writer, respErr, "未登录!")
2 years ago
return
}
log.Println("GetUserToken success : ", tokenResp)
//拼接请求信息
req := &proto.AddCartReq{
Number: int32(number),
ProductId: int32(productId),
ProductSkuId: int32(productSkuId),
UserId: int32(sum),
}
resp, err := client.AddCart(context.TODO(), req)
2 years ago
//商品详情
reqDetail := &proto.ProductDetailReq{
Id: int32(productId),
}
2 years ago
respDetail, err := ShowProductDetailClient.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
2 years ago
respSkuDetail, err := ShowDetailSkuClient.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
}
2 years ago
sku := respSkuDetail.ProductSku[0]
sku.Stock -= req.Number
updateSkuReq := &proto.UpdateSkuReq{
ProductSku: sku,
}
respUpdate, err := UpdateSkuClient.UpdateSku(context.TODO(), updateSkuReq)
if err != nil {
log.Println(" /UpdateSkuClient resp :", err)
2 years ago
}
log.Println(" /UpdateSkuClient resp :", respUpdate.IsSuccess)
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
}
2 years ago
////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}
}
}