关注接口实现总结|青训营笔记
这是我参与「第五届青训营 」伴学笔记创作活动的第 11天
hertz+kitex实现用户关注服务
因为队友实现了用户信息服务,所以对于关注操作来说,我只需要实现关注关系就可以了
1.设计数据结构模型
关注操作,是一位用户对另一位用户的操作(包不包括自己本身可以自行决定),所以,两个字段,操作者id和被关注者id,同时不能重复关注操作,二者作为联合主键,同时两个字段应该都是外键,因为无论是操作者id还是被关注者id都应是用户表里的用户。数据结构代码如下:
type Follower struct {
// UserId 关注了 FollowID
UserId int64 `gorm:"primaryKey" json:"userId"`
FollowId int64 `gorm:"primaryKey" json:"followerId"`
}
type User struct {
Followers []Follower `gorm:"foreignKey:user_id;foreignKey:follow_id"`
}
2.编写操作函数
User表数据结构自行根据需求设计,数据结构设计完成后应编写操作方法,关注操作对于数据库来说就是添加一段关系记录,所以在关系表中插入二者的id就可以了,注意的是顺序不要弄反,然后同时给用户表中关注操作者的关注人数+1,被关注者的粉丝人数+1,如果出现错误,应撤销所有操作,所以这里可以用到事务操作,Gorm自带的Transaction就可以,也可以选择当插入操作没有出现错误时,进行人数加的操作,取消关注同理
err := GormClient.Transaction(func(tx *gorm.DB) error {
//tx.Create()
// 1. 新增
follow := model.Follower{
UserId: userId,
FollowId: followId,
}
err := tx.Create(&follow).Error
if err != nil {
return err
} else {
// followID 的 follower + 1
if err := tx.Model(&model.User{}).Where("uuid = ?", followId).
Update("follower_count", gorm.Expr("follower_count + 1")).Error; err != nil {
return err
}
// userId 的 follow + 1
if err := tx.Model(&model.User{}).Where("uuid = ?", userId).
Update("follow_count", gorm.Expr("follow_count + 1")).Error; err != nil {
return err
}
return nil
}
})
return err
3.编写IDL
考虑需要的参数以及返回值,根据需求编写IDL,在这里,关注操作需要的参数只有两个,操作者id和被关注者id,返回值也是一般基础的返回值,一个状态码,一个返回状态描述,编写之后,执行kitex命令,生成代码。
4.编写服务函数
因为关注操作比较简单,所以在服务目录下,新建usercenter结构体名下的方法Follow(userId, followId int64) error
// Follow 关注用户
func (uc UserCenter) Follow(userId, followId int64) error {
return query.Follow(userId, followId)
}
然后在handler.go调用该函数
// Follow implements the UserCenterImpl interface.
func (s *UserCenterImpl) Follow(ctx context.Context, req *kitex_gen.FollowRequest) (resp *kitex_gen.BasicResponse, err error) {
err = service.UserCenter{}.Follow(req.UserId, req.FollowId)
if err != nil {
resp = &kitex_gen.BasicResponse{
StatusCode: 1,
StatusMsg: "follow failed err:" + err.Error(),
}
return
}
resp = &kitex_gen.BasicResponse{
StatusCode: 0,
StatusMsg: "success",
}
return
}
注意返回状态也要加上
5.RPC调用服务
在rpc目录下编写调用服务的函数,功能比较简单,所以直接传参调用就可以
func Follow(userId, followId int64) error {
req := kitex_gen.FollowRequest{
UserId: userId,
FollowId: followId,
}
_, err := userClient.Follow(context.Background(), &req)
return err
}
6.网关
在网关层编写操作rpc的函数,接受前端传过来的参数,然后根据请求进行对应的操作,解析参数,调用RPC层方法执行操作,注意返回状态码和状态描述
最后在路由层router.go文件注册地址,就ok了
新手小白,第一次写微服务,这些步骤也是自己在网上看视频和博客照葫芦画瓢做的,若有错误欢迎指正