Go框架三件套之Kitex|青训营笔记

261 阅读3分钟

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

首先,对上篇文章中对于Gorm框架中的一些特点进行一点补充。

Gorm中提供了事务的运用方法

事务:事务处理是由以一个单一的逻辑单位完成的一系列操作,它可以由一系列的SQL语句、SELECT、INSERT、UPDATE、 DELETE组成,如果在该单位包含的操作执行完毕后没有发生错误,那么它对数据库所作的改变就是永久的了。如果一旦有错误发生,它就不会对数据库作任何修改或改变。一个事务被视为一个不可分割的单元操作。

Gorm事务: 需要使用Begin方法建立,在这一命令之后的任何语句都将被认为是事务的一部分。命令Commit用来完成事务,并使事务对数据库所作的修改成为永久的。Rollback命令用来取消一个事务,并还原事务对数据库所作的修改。

image.png

Gorm Hook

Gorm框架提供了Hook的功能,可以在进行CURD操作之前或之后自动调用一些函数。

Gorm性能提升

  1. 对于写操作(创建、更新、删除),为了确保数据的完整性,Gorm会将他们封装在事务内运行。但这样就会使得性能降低,可以使用SkipDefaultTransaction关闭默认事务。
  2. 使用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端的开发。

  1. 定义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,代表着输入和输出。

  1. 定义好后在本目录下执行命令:
kitex -module kitex-demo -service kitexThrift kitexThrift.thrift
  1. 运行完命令后会得到几个新的文件。我们需要完成的rpc方法在handler.go中。将需要完成的具体实现填入其中就行。
  2. 启动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框架构建服务端与客户端的例子。