Go-zero的项目开发
这是我参与【第五届青训营】伴学笔记创作活动的第19天
1.先确定好基本的框架和目录
- 选择采用Go-zero的微服务框架
- 采用集中管理的方式,把所有的服务放到一个大仓库中
- dou-yin为工程名,下面有apps和pkg两个目录,其中apps存放的是我们所有的微服务,比如user为用户相关的微服务,pkg目录为所有服务共同依赖的包的存放路径,比如所有的服务都需要依赖鉴权就可以放到pkg目录下。
具体的apps目录:
- message - 消息操作服务
- publish - 视频发布微服务
- feed- 视频流微服务
- comment - 用户评论微服务
- favorite - 用户点赞微服务
- relation - 用户关注微服务
- user - 用户管理微服务
2.用goctl来user进行项目的初始化
2.1 基本的目录:
1.rpc部分:
2.api部分:
- 先在user/下面创建一个api文件夹
- 创建一个user.api文件
type (
// 登录
LoginRequest {
Username string `json:"username"`
Password string `json:"password"`
}
LoginResponse {
User_id uint64 `json:"user_id"`
Token string `json:"token"`
}
// 注册
RegisterRequest {
Username string `json:"username"`
Password string `json:"password"`
}
RegisterResponse {
User_id uint64 `json:"user_id"`
Token string `json:"token"`
}
// 用户信息
UserInfoRequest {
Id uint64 `json:"id"`
Token string `json:"token"`
}
UserInfoResponse {
Status_code uint64 `json:"status_code"`
Status_msg string `json:"status_msg"`
Id string `json:"id"`
Name uint64 `json:"name"`
Follow_count uint64 `json:"follow_count"`
Follower_count uint64 `json:"follower_count"`
is_follow uint64 `json:"is_follow"`
}
)
service user {
@handler userLogin
post /douyin/user/login (LoginRequest) returns (LoginResponse)//登录
@handler userRegister
post /douyin/user/register (RegisterRequest) returns (RegisterResponse)//注册
@handler userInfo
get /api/user/userInfo (UserInfoRequest) returns (UserInfoResponse)
}
- 生成对应的服务
goctl api go -api user.api -dir .
3.model部分:
- 把mysql文件放到对应的model目录下面,然后运行就可以得到对应的model
goctl model mysql ddl -src douyin_user.sql -dir . -c
- 或者通过命令行
$goctl model mysql datasource -url="root:zhongge666@tcp(8.134.120.93:3306)/douyin_user" -table="*" -dir="./model" --style=goZero --cache=true
4.编写的顺序:
- 编写rpc服务中的
internal/logic/getuserlogic.go,进行业务逻辑的实现 - 在api服务中的
internal/config/config.go中添加所需调用的rpc的配置文件
type Config struct {
rest.RestConf
UserRpc zrpc.RpcClientConf
}
- 在api服务的
etc/order.yaml中加入配置
UserRpc:
Etcd:
Hosts:
- 127.0.0.1:2379
Key: user.rpc
- 在api服务的
internal/svc/servicecontext.go中完善服务依赖
type ServiceContext struct {
Config config.Config
UserRpc userclient.User //加入对应的rpc
}
func NewServiceContext(c config.Config) *ServiceContext {
return &ServiceContext{
Config: c,
UserRpc: userclient.NewUser(zrpc.MustNewClient(c.UserRpc)),
}
}
- 在api的
internal/logic/getorderlogic.go添加业务逻辑
type GetOrderLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewGetOrderLogic(ctx context.Context, svcCtx *svc.ServiceContext) GetOrderLogic {
return GetOrderLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *GetOrderLogic) GetOrder(req *types.OrderReq) (*types.OrderReply, error) {
user, err := l.svcCtx.UserRpc.GetUser(l.ctx, &user.IdRequest{
Id: "1",
})
if err != nil {
return nil, err
}
if user.Name != "test" {
return nil, errors.New("用户不存在")
}
return &types.OrderReply{
Id: req.Id,
Name: "test order",
}, nil
}