这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
Kitex
Kitex 是字节内部的Golang微服务RPC框架。支持多种协议,提供了高性能和高拓展性。
RPC
RPC(Remote Procedure Call),即远程过程调用。使用RPC可以通过网络和指定的协议,向远程服务器传输请求,完成请求后进行数据返回的一个过程。
使用这样的分布式微服务,可以提高整套系统的稳定性。
安装
go install github.com/cloudwego/kitex/tool/cmd/kitex@latest
go install github.com/cloudwego/thriftgo@latest
定义IDL
使用RPC,就得提前知道对方需要的接口是什么,需要的参数是什么,返回值是什么。这时候,就需要使用IDL来定义消息的结构
下面是一个使用protobuf定义的一个示例文件,将它保存成kitexProtoBuf.proto
syntax = "proto3";
option go_package = "kitex_gen";
service kitexProtoBuf {
rpc MyHandT1(Request) returns (Response){};
}
message Response{
string message = 1;
}
message Request{
string message = 1;
}
其中service是定义了这个服务的方法,其中Response和Request分别代表了这个请求的输出和输入。
代码生成
kitex -module kitex-demo -type protobuf -service kitexProtoBuf -I ./ kitexProtoBuf.proto
使用代码生成工具,可以快速生成一些调用代码。其中比较重要的有
- build.sh 构建脚本
- kitex_gen IDL内容相关的生成代码,主要是基础的C/S代码
- main.go 程序入口
- hanlder.go 用户在文件里定义IDLservice的实现方法
那么就可以很明显的看出来,我们主要需要修改的就是hanlder.go中的代码,实现我们的接口。
package main
import (
"context"
"kitex-demo/server/protobuf/kitex_gen"
)
// KitexProtoBufImpl implements the last service interface defined in the IDL.
type KitexProtoBufImpl struct{}
// MyHandT1 implements the KitexProtoBufImpl interface.
func (s *KitexProtoBufImpl) MyHandT1(ctx context.Context, req *kitex_gen.Request) (resp *kitex_gen.Response, err error) {
// TODO: Your code here...
return
}
在这里添加相应的业务处理代码即可。
Client发起请求
创建client
func main() {
client, err := kitexprotobuf.NewClient("kitexprotobuf", client.WithHostPorts("0.0.0.0:8888"))
if err != nil {
log.Fatal(err)
}
req := &kitex_gen.Request{
Message: "message1",
}
resp, err := client.MyHandT1(context.Background(), req)
if err != nil {
log.Fatal("err1", err.Error())
}
log.Println("MyHandT1 Func Response", resp)
}
这样就可以轻松地进行RPC调用,完成远程函数的调用,得到输出的结果。
除此之外,kitex还支持其他协议,比如Thrift,其实也都是大同小异,只需要修改IDL的定义语言,其他在代码编写的方面,只是换一个实现而已。