青训营笔记

111 阅读2分钟

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部分:

  1. 先在user/下面创建一个api文件夹
  2. 创建一个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)
}
  1. 生成对应的服务
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
}