简介
- 用户留言、收藏、修改收货地址等,统一放在用户操作微服务
- 这里按照业务类型划分微服务
- 表设计,三张表
// 用户收藏 type UserFav struct { BaseModel // 联合索引 idx_user_goods,且唯一 User int32 `gorm:"type:int;index:idx_user_goods,unique"` Goods int32 `gorm:"type:int;index:idx_user_goods,unique"` }
- 建库生成表
- 设计 proto 文件,生成 stub,这里没放在一起,生成三个 stub
- 之前有多个 stub 是因为服务间调用
- 更改配置,启动服务并注册
- 更改 nacos 即可,config 不需要增加配置项
type ServerConfig struct{ Name string `mapstructure:"name" json:"name"` Host string `mapstructure:"host" json:"host"` Tags []string `mapstructure:"tags" json:"tags"` MysqlInfo MysqlConfig `mapstructure:"mysql" json:"mysql"` ConsulInfo ConsulConfig `mapstructure:"consul" json:"consul"` }
- 这里 grpc 需要注册三个 handler 到 server,再注册服务到 consul,这就是多个 stub 不一样的地方
- 更改 nacos 即可,config 不需要增加配置项
handler
- srv 层实现,handler/
- 贴一个接口实现吧,没什么新东西
func (*UserOpServer) GetFavList(ctx context.Context, req *proto.UserFavRequest) (*proto.UserFavListResponse, error) { var rsp proto.UserFavListResponse var userFavs []model.UserFav var userFavList []*proto.UserFavResponse //查询用户的收藏记录 //这里还定义了goodsId为参数,可以查询某件商品被哪些用户收藏了,此时不传userId即可 result := global.DB.Where(&model.UserFav{User: req.UserId, Goods: req.GoodsId}).Find(&userFavs) rsp.Total = int32(result.RowsAffected) for _, userFav := range userFavs { userFavList = append(userFavList, &proto.UserFavResponse{ UserId: userFav.User, GoodsId: userFav.Goods, }) } rsp.Data = userFavList return &rsp, nil }
web
- API 层实现,api/
- 要调用多个 srv 层,把 stub 拿过来
- 定义 form 表单,接收 POST 参数;更改 nacos 配置,启动,注册
- 没什么特殊的地方,有个 TODO
- 收藏商品时,应该先去判断这个商品是否存在
- 没啥好说的,看代码
小结
- 到此,各微服务基本开发完毕,接下来将 es 搜索集成到商品服务