这是我参与「第五届青训营 」伴学笔记创作活动的第 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该库,且不会出现类型匹配问题)
执行后生成如下代码:
我们接下来需要在handler.go中实现所定义接口的逻辑,在main中对一些需要启动时配置的项进行配置。
这里我还建了service文件夹,这里的代码用于对上篇文章生成的query代码进行进一步封装,然后提供给handler使用,这样的好处是使得数据层和api业务层松耦合,便于后续维护修改。
下一篇,我们会着重介绍handler中具体的函数的实现,并结合gorm的使用。