kitex-微服务-grpc框架(字节跳动开源)
2026年1月15日 · 283 字 · 2 分钟
Kitex,字节跳动内部的 Go 微服务 RPC 框架 ,包括但不限于脚手架构建代码、日志、服务注册服务发现、中间件、负载均衡、限流、熔断、服务降级
Kitex
Kitex[kaɪt’eks] 字节跳动内部的 Go 微服务 RPC 框架,具有高性能、强可扩展的特点,在字节内部已广泛使用。如果对微服务性能有要求,又希望定制扩展融入自己的治理体系,Kitex 会是一个不错的选择。
kitex序列化工具
安装
go install github.com/cloudwego/kitex/tool/cmd/kitex@latest
在项目引入包
go get -u github.com/cloudwego/kitex
my_kitex/idl/math.proto
syntax="proto3";
package idl; // proto文件互相引用时需要指定package。不需要相互引用时,这一行可以不写
option go_package="math_service"; //生成go文件后对应的package名
message AddRequest {
int32 left = 1;
int32 right = 2;
}
message AddResponse {
int32 sum = 1;
}
message SubRequest {
int32 left = 1;
int32 right = 2;
}
message SubResponse {
int32 diff = 1;
}
service Math {
rpc Add(AddRequest) returns (AddResponse);
rpc Sub(SubRequest) returns (SubResponse);
}
kitex -module myKitex idl/math.proto
会生成一个kitex_gen目录,import语句里需要用到module名称
math.pb.go是官方的pb工具生成的,math.pb.fast.go是字节自家的fastpb工具生成的,math.pb.fast.go是对math.pb.go的补充
执行一下go mod tidy
PS:Kitex的序列化和反序列化工具比默认grpc序列化反序列化快了很多
服务脚手架代码
生成服务端代码
| 参数 | 作用 | 示例 |
|---|---|---|
| kitex | 工具名 | - |
| -module | Go 模块名 | myKitex |
| -service | 生成服务端代码(服务名称,任意字符串) | easyimpr.math |
| -use | 引用已有的 kitex_gen | myKitex/kitex_gen |
| IDL文件 | 接口定义文件 | ../idl/math.proto |
cd /my_kitex/server/
kitex -module myKitex -service easyimpr.math -use myKitex/kitex_gen ../idl/math.proto
接下来我们只需要就该server下面的handler.go实现具体的逻辑即可
// Add implements the MathImpl interface.
func (s *MathImpl) Add(ctx context.Context, req *math_service.AddRequest) (resp *math_service.AddResponse, err error) {
// TODO: Your code here...
resp = &math_service.AddResponse{
Sum: req.Left + req.Right,
}
return resp, nil
}
// Sub implements the MathImpl interface.
func (s *MathImpl) Sub(ctx context.Context, req *math_service.SubRequest) (resp *math_service.SubResponse, err error) {
// TODO: Your code here...
resp = &math_service.SubResponse{
Diff: req.Left - req.Right,
}
return resp, nil
}
kitex还是很贴心的,连编译和运行的脚本都写好了,由于我是mac,没怎么用过windows,不知道windows是否能正常运行(好像是用wsl?)
当然,我们不可能只用默认的8888端口号
我们修改main.go
addr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:5678")
svr := math_service.NewServer(new(MathImpl), server.WithServiceAddr(addr))
err := svr.Run()
if err != nil {
log.Println(err.Error())
}
完成客户端代码
cd ./my_kitex/client/
新建main.go
import (
"context"
"fmt"
"log"
"myKitex/kitex_gen/math_service"
"myKitex/kitex_gen/math_service/math"
"github.com/cloudwego/kitex/client"
)
func main() {
//这个函数是之前生成的脚手架代码中的函数,用于创建一个客户端,前面的是服务名称,后面的是地址
client, err := math.NewClient("easyimpr.math", client.WithHostPorts("127.0.0.1:5678"))
if err != nil {
log.Fatalf("failed to create client: %v", err)
}
//定义请求参数
request := math_service.SubRequest{Left: 9, Right: 1}
//调用方法
response, err := client.Sub(context.Background(), &request)
if err != nil {
log.Fatalf("failed to call sub: %v", err)
}
//打印结果
fmt.Println(response.Diff)
}