Go项目(订单微服务)
创始人
2024-05-30 00:45:01
0

文章目录

  • 简介
  • handler
    • UT
  • web
  • 支付服务
    • Notify
  • 小结

简介

  • 这部分开始梳理订单微服务的关键点
  • 这里仿京东,订单结算在购物车进行,所以用户的操作是加入商品到购物车,进入购物车付款
  • 从页面分析需求
    • 点击添加到购物车,删除车中商品,更新商品数量和选中状态(其实就是购物车内的增删改),选中商品,创建订单,付款结算
      1
    • 订单列表及详情
      2
  • 表设计
    • 包含三张表,订单商品表需要注意一下
      // 订单商品表,可以查订单内商品,可以根据商品查订单
      type OrderGoods struct {BaseModelOrder int32 `gorm:"type:int;index"`Goods int32 `gorm:"type:int;index"`// 把商品的信息保存下来了,字段冗余,但能够减少服务之间的调用,高并发系统中的常见做法,而非遵循三范式// 还有一个作用是镜像,记录当时订单的商品价格,因为商品服务里的价格是变动的GoodsName  string `gorm:"type:varchar(100);index"`GoodsImage string `gorm:"type:varchar(200)"`GoodsPrice float32Nums       int32 `gorm:"type:int"`
      }
      
    • 建库建表
      _ = db.AutoMigrate(&model.ShoppingCart{}, &model.OrderInfo{}, &model.OrderGoods{})
      
  • 接口设计(定义proto)
    • 分为购物车和订单两部分
      service Order {//购物车rpc CartItemList(UserInfo) returns(CartItemListResponse); //获取用户的购物车信息rpc CreateCartItem(CartItemRequest) returns(ShopCartInfoResponse); //添加商品到购物车rpc UpdateCartItem(CartItemRequest) returns(google.protobuf.Empty); //修改购物车商品信息rpc DeleteCartItem(CartItemRequest) returns(google.protobuf.Empty); //删除购物车商品//订单rpc CreateOrder(OrderRequest) returns (OrderInfoResponse); //创建订单rpc OrderList(OrderFilterRequest) returns (OrderListResponse); // 订单列表rpc OrderDetail(OrderRequest) returns (OrderInfoDetailResponse); // 订单详情rpc UpdateOrderStatus(OrderStatus) returns (google.protobuf.Empty); // 修改订单状态
      }
      
    • 生成 stub 代码
  • 更改 nacos 的本地和远程配置,启动服务看能否注册成功

handler

  • srv 层重点就是数据库操作,基本分三步
    1. 准备返回值(proto.struct)
    2. 根据请求参数操作数据+判空/判满,注意数据类型
    3. 填充返回值各字段
  • 重点在新建订单 CreateOrder接口,有一些要注意的地方
  • 要调用商品微服务和库存微服务,srv 层互相调用
    • 这个模仿商品微服务调用库存微服务即可,需要新增配置,拷贝过来 goods 和 inventory 的 stub
  • 具体步骤
    1. 从购物车中获取到选中的商品
    2. 商品的价格要在这里再次查询 - 访问商品srv服务
    3. 库存的扣减 - 访问库存服务
    4. 往订单信息表/订单商品表里插入数据,批量插入 CreateInBatches
    5. 从购物车中删除已购买的记录
  • 注:这里要操作两个表:订单信息表,订单商品表
  • 还有一个主要的问题,数据库操作应该使用事务
    • 包含两方面,操作本地订单表时使用 MySQL 事务;库存扣除调用的是其他服务,应该用分布式事务(不是分布式锁)
    • TODO
  • 注意问题发生的场景,解决方案有哪些优缺点,这些都是积累经验哈

UT

  • 一定要做接口测试,这是后端基本素养,至于产品的自动化测试比较复杂,整个系统上线后会做
    • 每个公司自动化测试的架构不一样,有很多东西可学
  • 这里后端测试暂时没有用 go 内置的单元测试,效果一样哈(go 也没有内置断言,依赖第三方包),后续会有专门的章节写 UT
    var orderClient proto.OrderClient
    var conn *grpc.ClientConnfunc TestCreateCartItem(userId, nums, goodsId int32){rsp, err := orderClient.CreateCartItem(context.Background(), &proto.CartItemRequest{UserId: userId,Nums: nums,GoodsId: goodsId,})if err != nil {panic(err)}fmt.Println(rsp.Id)
    }func Init(){var err errorconn, err = grpc.Dial("127.0.0.1:50051", grpc.WithInsecure())if err != nil {panic(err)}orderClient = proto.NewOrderClient(conn)
    }func main() {Init()// 启动两个依赖的微服务:商品和库存//TestCreateCartItem(1,1,422)//TestCartItemList(1)//TestUpdateCartItem(1)//TestCreateOrder()//TestGetOrderDetail(20)TestOrderList()conn.Close()
    }
    

web

  • 快速开发订单服务 web 层
  • 查找替换为 order-web,修改 nacos 的配置,复制 stub 文件,修改接口,修改路由,启动测试
  • API 层要响应前端请求,调用 srv 的接口,接口还是根据前端界面分析
    • 订单相关:新建订单(form表单验证,传递用户信息),订单详情,订单列表
    • 支付相关:先看支付服务
    • 购物车相关:商品列表,加入商品(定义form表单传参)
  • 测试
    • yapi 新建订单服务的测试环境
  • 这块还需要结合支付服务,返回给用户支付的 url,先去梳理支付逻辑
    • 但是申请支付宝的支付服务需要网站域名,且要公司性质才可以,个人无法申请
    • 但总不能服务上线公司创建才能开发吧?于是它提供了沙箱环境,只需切换配置即可上线

支付服务

  • 理解支付宝沙箱环境,进入沙箱应用
    • 沙箱环境是独立的,每一个应用都会有一个商家账号和买家账号
  • 为了保障信息安全,这里需要配置两套公私钥,当然,也可以用证书,目的是一样的,客户端和服务器之间的互信
    1
  • 我们生成一对公私钥,公钥给支付宝;支付宝也有一对公私钥,需要把它的公钥拿过来
  • 增加配置
    type AlipayConfig struct {AppID        string `mapstructure:"app_id" json:"app_id"`PrivateKey   string `mapstructure:"private_key" json:"private_key"`AliPublicKey string `mapstructure:"ali_public_key" json:"ali_public_key"`NotifyURL    string `mapstructure:"notify_url" json:"notify_url"`ReturnURL    string `mapstructure:"return_url" json:"return_url"`
    }
    
  • 支付宝 AliPay SDK for Go,导包即用
    • 看一下 创建 Wap 支付 部分即可
  • 回到订单服务,集成生成支付URL的代码,并准备函数 Notify 让支付宝回调
    • 订单创建和订单详情都应该返回支付 URL,如果创建时未支付,后续可以在订单详情里继续支付
    • 订单列表只显示支付状态即可

Notify

  • 这里服务器需要验证支付宝的消息,使用支付宝的公钥Z
    • 这部分在 GetTradeNotification 的 VerifySign 中完成
  • 获取支付状态,更新订单表
  • 返回给支付宝状态,否则支付宝会进行最大努力通知

小结

  • 这部分快速实现了订单微服务的 srv 层和 API 层
  • 接下来快速开发用户操作微服务,前后端联调

相关内容

热门资讯

李光洁32天走7500公里吃8... 李光洁32天走7500公里吃8城,《拿一座城市下酒》这部纪录片怎么样?我觉得这部纪录片非常好,观看的...
每我世如你果只没界喜就欢的生一... 每我世如你果只没界喜就欢的生一爱有你过在想会。把这22个字组成一句话。我想过,如果在每一生只喜欢你,...
调查校园里的植物和动物说说有哪... 调查校园里的植物和动物说说有哪些动植物?可以分成几类?兰花,梅花可人丌··植物:乔木(杨树、柳树、银...
血脂高的原因? 血脂高的原因?血脂高的原因高血脂的诱因包括原发性和继发性两种:原发性高血脂症的病因:1、遗传因素。2...
为什么孩子总是重复看同一集动画... 为什么孩子总是重复看同一集动画片?是在传递这3个信号 小孩子爱看动画片是非常普遍的,动画片带给他们动...
终极三国里 49集刘备为什么这... 终极三国里 49集刘备为什么这么做?有没有官方回答?下集自己看吧 现在不会有官方回答的哟第一:可能真...
西式糕点制作大全的内容简介 西式糕点制作大全的内容简介《西式糕点制作大全》主要介绍了制作甜点的基本知识,例如各种制作工具,制作点...
逻辑思维又是什么?就是推理吗,... 逻辑思维又是什么?就是推理吗,怎么培养!?逻辑思维是一种严格分析思维。不一定是推理。推理是逻辑思维的...
囊萤夜读有一句俗语就是出自这个... 囊萤夜读有一句俗语就是出自这个故事你知道是什么吗?囊萤映雪 ( náng yíng yìng xuě...
什么是不伦恋情? 什么是不伦恋情?什么是不伦恋情.,?男跟女年龄相差很大?还是?男的比女的小?还是老夫少妻?是近亲谈恋...
有书名带晨星的嘛? 有书名带晨星的嘛?有书名带晨星的嘛?晨星传这本书。漫画书晨星物语
如果有些事情说不出口怎么办? 如果有些事情说不出口怎么办?烦恼皆是因为自己过分的执着 即使你在这样子下去 更不就不会有好的结果 为...
有哪些类似于《非自然死亡》题材... 有哪些类似于《非自然死亡》题材的日剧推荐?非自然死亡的题材电影确实不多,电视剧的话也不好找啊。不喜欢...
素书全集的内容简介 素书全集的内容简介 本书采用了《素书》的权威原著,参照《四库全书》并加上了宋代宰相张商英的注和清代王...
【世纪花园】小区对口的学校有重... 【世纪花园】小区对口的学校有重点小学和初中吗?世纪花园东区里有未来强者幼儿园,小区南边有个华兴小区,...
东南大学现有的专业中有哪些是属... 东南大学现有的专业中有哪些是属于老东南的1928年学校改名为国立中央大学,设理、工、医、农、文、法、...
一个男人一有钱就请朋友吃饭,没... 一个男人一有钱就请朋友吃饭,没钱就又说,买东西还赊账,商店里的老板都找上门来了?像陵念前这种男人的话...
坟上栽什么草好? 坟上栽什么草好?坟地种什么草好耐旱坟上栽野蕨草、扎根不深、浅根植物、可以固土、南方雨水多、不会造成坟...
关于国富潜力基金 关于国富潜力基金我9月24日上午买的国富基金,申购价格是9月24日开盘的价格吗?还是9月28日开盘的...
我是一个高中生。想学武术。在学... 我是一个高中生。想学武术。在学校没什么时间。是练散打还是跆拳道好。我是一个高中生。想学武术。在学校没...