这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
首先,对上篇文章中对于Gorm框架中的一些特点进行一点补充。
Gorm中提供了事务的运用方法
事务:事务处理是由以一个单一的逻辑单位完成的一系列操作,它可以由一系列的SQL语句、SELECT、INSERT、UPDATE、 DELETE组成,如果在该单位包含的操作执行完毕后没有发生错误,那么它对数据库所作的改变就是永久的了。如果一旦有错误发生,它就不会对数据库作任何修改或改变。一个事务被视为一个不可分割的单元操作。
Gorm事务: 需要使用Begin方法建立,在这一命令之后的任何语句都将被认为是事务的一部分。命令Commit用来完成事务,并使事务对数据库所作的修改成为永久的。Rollback命令用来取消一个事务,并还原事务对数据库所作的修改。
Gorm Hook
Gorm框架提供了Hook的功能,可以在进行CURD操作之前或之后自动调用一些函数。
Gorm性能提升
- 对于写操作(创建、更新、删除),为了确保数据的完整性,Gorm会将他们封装在事务内运行。但这样就会使得性能降低,可以使用SkipDefaultTransaction关闭默认事务。
- 使用PrepareStmt进行缓存预编译可以提高后续调用的速度。
db, err := gorm.Open(musql.Open("username:password@tcp(localhost:9910)/database?charset=utf8"),
&gorm.Config{
SkipDefaultTransaction: true,//关闭默认事务
PrepareStmt: true}, // 缓存预编译语句
}
if err!=nil{
panic("failed to connect database")
}
Kitex
字节开源的rpc框架,主打强扩展性,协议上支持Thrift,Kitex Protobuf等。
使用Thrift协议
Server端
在kitex-demo这个根目录下创建server文件夹并开始server端的开发。
- 定义KitexThrift服务。新建kitexThrigt.thrift文件,输入以下内容。(IDL)
namespace go api
struct Request1 {
1: string message1
}
struct Request2 {
2: string message2
}
struct Response {
1: string message
}
service kitexThrift {
Response MyHandT1(1: Request1 req1)
Response myHandT2(1: Request2 req2)
}
service kitexThrift声明此方法,在此处定义了两个request和一个response,代表着输入和输出。
- 定义好后在本目录下执行命令:
kitex -module kitex-demo -service kitexThrift kitexThrift.thrift
- 运行完命令后会得到几个新的文件。我们需要完成的rpc方法在handler.go中。将需要完成的具体实现填入其中就行。
- 启动server:
go run main.go handler.go
Client 端
在kitex-demo根目录下,新建client文件夹。client需要调用server下生成的结构体和函数。具体直接构建main.go文件如下:
package main
import (
"context"
"log"
"github.com/cloudwego/kitex/client"
"kitex-demo/server/thrift/kitex_gen/api"
"kitex-demo/server/thrift/kitex_gen/api/kitexthrift"
)
func main() {
client, err := kitexthrift.NewClient("kitexthrift", client.WithHostPorts("0.0.0.0:8888"))
if err != nil {
log.Fatal(err)
}
req1 := &api.Request1{
Message1: "message1",
}
resp, err := client.MyHandT1(context.Background(), req1)
if err != nil {
log.Fatal("err1", err.Error())
}
log.Println("MyHandT1 Func Response", resp)
}
其中req1是根据之前IDL中定义的Request1结构体来得到的实例指针;resp是根据IDL中定义的server中的MyHandT1函数来得到。运行client端:go run main.go,可以得到以下输出:
MyHandT1 Func Response Response({Message:message})
这就是一个简单的通过thrift协议用Kitex框架构建服务端与客户端的例子。