这是我参与「第三届青训营-后端场」笔记创作活动的第6篇笔记。
0.课前准备
代码地址: https://github.com/cloudwego/kitex-examples
kitex教程: https://www.cloudwego.io/zh/docs/kitex/getting-started/
为什么找不到kitex命令
按教程中export的方法只能对当前终端的环境生效。查看当前PATH的配置路径:echo $PATH。同理使用echo $GOPATH也只有使用export的终端有输出。
解决方法1(推荐):编辑 ~/.bashrc文件,在末尾追加export指令。新开启的终端直接生效,更改前开启的终端使用输入source .bashrc后生效。此方法能改变当前用户的PATH路径且永久生效。
解决方案2:编辑/etc/profile文件,在末尾追加export指令。重启系统后对所有用户永久生效。
安装Docker
ubuntu系统,可用curl -sSL https://get.daocloud.io/docker|sh自动安装。
之后使用sudo docker run hello-world检测是否运行成功。输出的最后两行为
For more examples and ideas,visit:
https://docs.docker.com/get-started/
错误:
W: GPG 错误:https://apt.kitware.com/ubuntu focal-rc InRelease: 由于没有公钥,无法验证下列签名: NO_PUBKEY 6AF7F09730B3F0A4
E: 仓库 “https://apt.kitware.com/ubuntu focal-rc InRelease” 没有数字签名。
解决方法:先获取公钥,再进行安装。
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6AF7F09730B3F0A4
安装postman
如果snap没有命令则执行sudo apt-get install snapd。这是ubuntu的软件商店。
执行sudo snap install postman即可。
点击左下角"显示应用程序",然后搜索postman即可打开。
安装git
sudo apt install git
1. 介绍
kitex
kitex通过编写接口生成服务代码。
生成后的文件如下:
kitex_gen包含生成的客户端、服务端代码。main.go为启动文件。handler.go为我们要编写的业务文件代码。script为启动脚本的模板。build.sh是构建要运行的产物。
thrift的v0.14.0较v0.13.0有较大变化,所以需要固定版本为v0.13.0。
gorm
gorm的first,take,last返回1条记录,若没有记录则返回ErrRecordNotFound。
使用struct更新时,默认只更新非零值字段。若想更新零值,应适用select或map。
etcd和opentracing
etcd主要用于服务发现和服务注册。
opentracing主要用于链路追踪和相关的可观测性。
项目介绍
在代码的./bizdemo目录下
服务模块介绍:
| 服务名称 | 模块介绍 | 技术框架 | 传输协议 | 注册中心 | 链路追踪 |
|---|---|---|---|---|---|
| demoapi | API服务 | Gorm,Kitex,Gin | http | etcd | opentracing |
| demouser | 用户数据管理 | Gorm,Kitex | protobuf或thrift | etcd | opentracing |
| demonote | 笔记数据管理 | Gorm,Kitex | thrift | etcd | opentracing |
项目服务调用关系:
api不会直接和mysql交互, 而是由demouser操作mysql用户数据,demonote操作mysql笔记数据。demouser和demonote会将服务信息(ip、端口号、服务名称等)注册到ETCD,api通过服务发现发现ETCD中的服务信息,于是可以通过ip和端口对用户数据后笔记数据发起请求。
模块功能介绍:
项目技术栈:
相关资料
| 框架文档地址 | github地址 | 拓展文档 | ||
|---|---|---|---|---|
| RPC框架Kitex | 框架文档 | github.com/cloudwego/k… | ||
| Kitex-etcd扩展 | github.com/kitex-contr… | github.com/kitex-contr… | www.cloudwego.io/zh/docs/kit… www.cloudwego.io/zh/docs/kit… | |
| Kitex-OpenTracing扩展 | www.cloudwego.io/zh/docs/kit… | github.com/kitex-contr… | - www.cloudwego.io/zh/docs/kit… | |
| ORM框架Gorm | 教程 | github.com/go-gorm/gor… | ||
| Gorm-Opentracing扩展 | github.com/go-gorm/ope… | gorm.cn/zh_CN/docs/… | ||
| HTTP框架Gin | 框架 | github.com/gin-gonic/g… | ||
| Gin-JWT扩展 | github.com/appleboy/gi… |
demonote接口
BaseResp是通用参数。
CreateNoteResponse CreateNote(1:CreateNoteRequest req)//创建
MGetNoteResponse MGetNote(1:MGetNoteRequest req)//批量通过笔记id,批量获取笔记数据
DeleteNoteResponse DeleteNote(1:DeleteNoteRequest req)//批量笔记
QueryNoteResponse QueryNote(1:QueryNoteRequest req)//查询笔记
UpdateNoteResponse UpdateNote(1:UpdateNoteRequest req)//更新笔记
demouser接口
rpc CreateUser (CreateUserRequest) returns (CreateUserResponse) {}//创建用户
rpc MGetUser (MGetUserRequest) returns (MGetUserResponse) {}//获取用户数据
rpc CheckUser (CheckUserRequest) returns (CheckUserResponse) {}//判断用户登录
kitex_gen目录
避免重复生成代码。
error
- 每个错误有一个编码。
- 逻辑错误和系统错误分开返回
Middleware扩展
- 中间件和套件都只允许在初始化的时候设置,不允许动态修改。
- 后设置覆盖先设置。
bound
完成请求级别或连接级别的限流。
3.编写代码
使用.proto文件生成代码需要额外参数,从./cmd中的Makefile可以看到。
note/dal/init.go文件数据库初始化
DB, err = form.Open(mysql.Open(constants.MySQLDefaultDSN),
&gorm.Config{
PrepareStmt: true,//缓存预编译的SQL,提高效率
SkipDefaultTransaction: true,//使用hook或gorm的关联创建数据时建议使用默认事务,
//最好使用false以保证数据一致性;其它场景可用true。
},
)
note/dal/note.go文件创建笔记函数
if err := DB.WithContext(ctx).Create(notes).Error; err != nil {
return err
}
return nil
//错误写法,Create会创建并返回一个新的实例,以下写法没有获得新实例的err
conn := DB
conn.WithContext(ctx).Create(notes)
if conn.Error != nil {
return err
}
return nil
使用
- 按readme中步骤运行服务器。
- 打开postman当作客户端。
- postman创建阶段,选择POST方法,后面URL写全,Body选择raw,后面有个下拉栏选JSON,下面文本填大括号中的内容。点击Send即可。
- readme中命令的--header需要填到postman的headers中(json相关的可以不用填,因为上一步设置过),以
:为分界线,前面填到key中,后面填到value中。