使用kitex与gorm开发微服务-3 | 青训营笔记

385 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天

本篇我们介绍如何使用kitex和thirft生成api代码。

kitex提供基于thrift定义的idl文件生成接口代码的能力。

关于kitex的配置,可以参考 Kitex官网的文档 | CloudWeGo或者我之前一篇 Kitex与Hz上手配置 | 青训营笔记 - 掘金 (juejin.cn)

首先实现idl文件

这里我们定义了Get,Update,Login和Create方法。并对name自动使用vt进行字段校验。

要使用vt校验,需要首先安装validator插件:go install github.com/cloudwego/thrift-gen-validator@latest

这里我们对email通过正则校验的方式遇到了一些问题,vt.pattern正则匹配验证邮箱,生成代码出错 · Issue #811 · cloudwego/kitex (gith…

namespace go usermicro

struct UserInfo {
    1: required i64 id;
    2: required string name (vt.min_size = "6", vt.max_size = "30"); // 汉字长度为3,此处限制2~10个汉字
    3: optional string email; //(vt.pattern = "^[A-Za-z0-9-_\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$"); // https://www.jianshu.com/p/5966a2d9df75
                            // bug,正则验证邮箱无法通过
    4: required i64 follow_count;
    5: required i64 follower_count;
}

// login User
struct LoginUserReq {
    1: optional string name (vt.min_size = "6", vt.max_size = "30");
    2: optional string email;
    3: required string password;
}

struct LoginUserResp {
    1: required bool status;
    2: optional UserInfo user; // 如果成功返回用户信息
}

// get User
struct GetUserReq {
    1: optional i64 id; // 数据库只在id和name设置索引,尽量只用id和name查询
    2: optional string name (vt.min_size = "6", vt.max_size = "30");
    3: optional string email;
}

struct GetUserResp {
    1: required bool status;
    2: optional UserInfo user; // 如果成功返回用户信息
}

// CreateUser
struct CreateUserReq {
    1: required string name (vt.min_size = "6", vt.max_size = "30");
    2: required string password; // 微服务进行md5操作
    3: optional string email;
}

struct CreateUserResp {
    1: required bool status;
    2: optional UserInfo user; // 如果成功返回用户信息
}

// UpdateUser
struct UpdateUserReq {
    1: optional i64 id; // 用id去更新条目 索引
    2: optional string name (vt.min_size = "6", vt.max_size = "30"); // 用name更新条目 索引     
    3: optional string email;
    4: optional string password;
}

struct UpdateUserResp {
    1: required bool status;
    2: optional UserInfo user; // 如果成功返回用户信息
}

service UserService {
    GetUserResp GetUserMethod(1: GetUserReq request)
    LoginUserResp LoginUserMethod(1: LoginUserReq request)
    CreateUserResp CreateUserMethod(1: CreateUserReq request)
    UpdateUserResp UpdateUserMethod(1: UpdateUserReq request)
}

生成代码

kitex --thrift-plugin validator -module github.com/ClubWeGo/usermicro -service usermicro ./idl/user.thrift

我这里直接将module命名为了github的仓库,方便后续业务代码使用该微服务(业务代码可以直接go get该库,且不会出现类型匹配问题)

执行后生成如下代码:

image.png

我们接下来需要在handler.go中实现所定义接口的逻辑,在main中对一些需要启动时配置的项进行配置。

这里我还建了service文件夹,这里的代码用于对上篇文章生成的query代码进行进一步封装,然后提供给handler使用,这样的好处是使得数据层和api业务层松耦合,便于后续维护修改。

下一篇,我们会着重介绍handler中具体的函数的实现,并结合gorm的使用。