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)
}

未完待续