go zero框架使用 | 青训营

227 阅读4分钟

作为一个初学者,我在项目开发的过程中尝试了使用 GoZero 框架来创建一个简单的 RPC 服务,为项目实现用户的注册和登录接口。这次的尝试带来了许多新的发现和经验,让框架的优势以及它是如何解决一些在开发过程中常遇到的问题。

步骤 1:安装 Go Zero 首先,确保你的系统已经安装了 Go 编程语言。然后,可以通过以下命令安装 Go Zero 工具:

go get -u github.com/tal-tech/go-zero/tools/goctl

步骤 2:创建项目 使用以下命令创建一个新的 Go Zero 项目,项目名称为 "SimpleTiktok":

goctl new app SimpleTiktok

步骤 3:生成 Model 和 SQL 文件 进入项目文件夹,并使用以下命令生成用户模型和相应的 SQL 文件:

cd SimpleTiktok
goctl model mysql ddl -c

这会在 "model/usermodel.sql" 文件中生成用户模型的 SQL 表结构。

步骤 4:编辑 Model 在 "internal/model" 文件夹下,编辑 "usermodel.go" 文件,定义用户模型结构和数据库操作:

package model

type User struct {
    Id       int64  `db:"id"`
    Username string `db:"username"`
    Password string `db:"password"`
}

func (m *UserModel) Insert(data *User) (sql.Result, error) {
    return m.ExecNoCache("INSERT INTO user (username, password) VALUES (?, ?)", data.Username, data.Password)
}

func (m *UserModel) FindByUsername(username string) (*User, error) {
    var user User
    err := m.QueryRow(&user, "SELECT * FROM user WHERE username=?", username)
    return &user, err
}

在这个项目中,实现登录和注册的思路非常清晰。首先,对于注册功能,用户需要提供用户名和密码,这些信息会通过 API 请求发送到后端。后端首先会检查用户名是否已经存在,如果不存在,就将用户名和密码存储到数据库中,完成用户的注册过程。其次,对于登录功能,用户同样需要提供用户名和密码,后端会根据提供的用户名从数据库中查询相应的用户信息。如果用户存在且密码匹配,后端会生成一个 JWT(JSON Web Token),其中包含用户的标识信息,并将这个 Token 返回给前端作为登录凭据。前端在后续的请求中携带这个 Token,后端可以通过验证 Token 的合法性来识别用户身份,从而实现了登录状态的维持和认证。整体来说,注册和登录go zero框架使用go zero框架使用go zero框架使用go zero框架使用gogo

的实现思路简单明了,通过合理的数据交互和加密手段,保障了用户信息的安全性和系统的可靠性。

步骤 5:定义接口请求和响应结构

在 "internal/types" 文件夹下,编辑 "types.go" 文件,定义接口的请求和响应结构:

package types

type RegisterRequest struct {
    Username string `json:"username"`
    Password string `json:"password"`
}

type RegisterResponse struct {
    // 注册接口的响应字段
}

type LoginRequest struct {
    Username string `json:"username"`
    Password string `json:"password"`
}

type LoginResponse struct {
    Token string `json:"token"`
}

一大亮点是 GoZero 提供了强大的代码生成工具,我只需要定义 API 接口,然后使用工具,就能轻松地生成服务代码、模型以及数据库操作等。对于一个初学者来说,这是一个巨大的福音,我不再需要手动编写大量重复性的代码,从而避免了很多潜在的错误。其次,在我实现用户注册和登录的功能时,GoZero 的服务上下文(Service Context)起到了关键作用。我可以在上下文中集成模型、数据库连接等,使得业务逻辑的编写更加便捷。GoZero 的错误处理模式也很简洁,我能更加清晰地理解和处理各种错误情况,提高了代码的可维护性。

步骤 6:实现注册和登录逻辑 在 "internal/svc" 文件夹下,编辑 "servicecontext.go" 文件,实现注册和登录逻辑:

package svc

import (
    "context"
    "SimpleTiktok/internal/model"
    "SimpleTiktok/internal/types"
    "github.com/tal-tech/go-zero/core/stores/sqlc"
)

type ServiceContext struct {
    UserModel model.UserModel
}

func NewServiceContext(sqlConn sqlc.SqlConn) *ServiceContext {
    return &ServiceContext{
        UserModel: model.NewUserModel(sqlConn),
    }
}

func (c *ServiceContext) Register(ctx context.Context, req types.RegisterRequest) error {
    user := model.User{
        Username: req.Username,
        Password: req.Password,
    }
    _, err := c.UserModel.Insert(&user)
    return err
}

func (c *ServiceContext) Login(ctx context.Context, req types.LoginRequest) (string, error) {
    user, err := c.UserModel.FindByUsername(req.Username)
    if err != nil {
        return "", err
    }
    
    if user.Password != req.Password {
        return "", ErrInvalidPassword
    }
    
    // 在这里实现 JWT 创建和返回
    // 生成 JWT Token 并返回
    token, err := generateJWTToken(user.Id)
    if err != nil {
        return "", err
    }
    
    return token, nil
}

步骤 7:实现 JWT 创建 在 "internal/svc" 文件夹下,创建一个名为 "jwt.go" 的文件,用于实现 JWT 创建和验证的逻辑:

package svc

import (
    "github.com/dgrijalva/jwt-go"
    "time"
)

var (
    jwtSecret = []byte("your-secret-key")
)

func generateJWTToken(userId int64) (string, error) {
    claims := jwt.MapClaims{
        "userId": userId,
        "exp":    time.Now().Add(time.Hour * 24).Unix(),
    }

    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    signedToken, err := token.SignedString(jwtSecret)
    if err != nil {
        return "", err
    }

    return signedToken, nil
}

这些步骤构成了项目中的一个简单的 RPC 服务,实现用户的注册和登录接口,并使用 JWT 创建用户登录凭据的核心部分。在我之前经验中,常常为了整理项目文件而感到困扰,但是在使用 GoZero 后,项目结构清晰有序,不同的模块得以分隔,能够更专注地开发业务逻辑,而不必过多关心项目的组织问题。

不过,虽然使用框架能够提高效率,深入了解底层原理和基础知识同样重要。