0.介绍
Kitex字节跳动内部的 Golang 微服务 RPC 框架,具有高性能、强可扩展的特点,在字节内部已广泛使用。如果对微服务性能有要求,又希望定制扩展融入自己的治理体系,Kitex 会是一个不错的选择。
框架特点
-
高性能
使用自研的高性能网络库 Netpoll,性能相较 go net 具有显著优势。
-
扩展性
提供了较多的扩展接口以及默认扩展实现,使用者也可以根据需要自行定制扩展,具体见下面的框架扩展。
-
多消息协议
RPC 消息协议默认支持 Thrift、Kitex Protobuf、gRPC。Thrift 支持 Buffered 和 Framed 二进制协议;Kitex Protobuf 是 Kitex 自定义的 Protobuf 消息协议,协议格式类似 Thrift;gRPC 是对 gRPC 消息协议的支持,可以与 gRPC 互通。除此之外,使用者也可以扩展自己的消息协议。
-
多传输协议
传输协议封装消息协议进行 RPC 互通,传输协议可以额外透传元信息,用于服务治理,Kitex 支持的传输协议有 TTHeader、HTTP2。TTHeader 可以和 Thrift、Kitex Protobuf 结合使用;HTTP2 目前主要是结合 gRPC 协议使用,后续也会支持 Thrift。
-
多种消息类型
支持 PingPong、Oneway、双向 Streaming。其中 Oneway 目前只对 Thrift 协议支持,双向 Streaming 只对 gRPC 支持,后续会考虑支持 Thrift 的双向 Streaming。
-
服务治理
支持服务注册/发现、负载均衡、熔断、限流、重试、监控、链路跟踪、日志、诊断等服务治理模块,大部分均已提供默认扩展,使用者可选择集成。
-
代码生成
Kitex 内置代码生成工具,可支持生成 Thrift、Protobuf 以及脚手架代码
1.环境准备
go1.19,goland
v0.5.2后续版本陆续加入了对windows系统的兼容。
如果想使用wsl完成配置,可参考他文。
2.目录结构
大部分文件自动生成,我们只需要编辑以下三个文件
3.安装步骤
(1)新建项目
注意:如果已经在wsl中配置,创建文件的位置和SDK都需要对应。
(2)在IDE中打开终端执行以下命令
-
安装 kitex:
go install github.com/cloudwego/kitex/tool/cmd/kitex@latest -
安装 thriftgo:
go install github.com/cloudwego/thriftgo@latest -
查询版本信息
kitex --versionthriftgo --version
(3)编写IDL,首先创建一个名为 echo.thrift 的 thrift IDL 文件
namespace go api
// 请求结构体
struct Request {
1: string message // 请求消息
}
// 响应结构体
struct Response {
1: string message // 响应消息
}
// Echo 服务
service Echo {
// echo 方法用于返回请求消息的响应消息
Response echo(1: Request req) // 请求参数
}
(4)生成 echo 服务代码
有了IDL 以后我们便可以通过 kitex 工具生成项目代码了,执行如下命令:
kitex -module 模块名 -service 服务名 echo.thrift
模块名可在go.mod文件的首行查看
上述命令中, -module 表示生成的该项目的 go module 名,-service 表明我们要生成一个服务端项目,后面紧跟的为该服务的名字。最后一个参数则为该服务的 IDL 文件。
(5)修改handler.go中的Echo方法
// Echo implements the EchoImpl interface.
func (s *EchoImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {
// TODO: Your code here...
return &api.Response{Message: req.Message}, nil
}
(6)在根目录下新建client.go
package main
import (
"context"
"github.com/cloudwego/kitex/client"
"github.com/cloudwego/kitex/client/callopt"
"模块名/kitex_gen/api" // 导入自动生成的 API 代码包
"模块名/kitex_gen/api/echo" // 导入自动生成的 Echo 服务代码包
"log"
"time"
)
func main() {
// 创建 Echo 客户端
c, err := echo.NewClient("服务名", client.WithHostPorts("0.0.0.0:8888"))
if err != nil {
log.Fatal(err)
}
// 创建请求对象
req := &api.Request{Message: "你好,我是kitex!"}
// 调用 Echo 服务的 echo 方法,并设置 RPC 超时时间为 3 秒
resp, err := c.Echo(context.Background(), req, callopt.WithRPCTimeout(3*time.Second))
if err != nil {
log.Fatal(err)
}
// 打印响应结果
log.Println(resp)
}
(6)刷新依赖
go mod tidy
(7)在终端启动服务端
go run main.go handler.go
(8)另外打开一个终端,启动客户端
go run client.go
(9)完成测试
3.错误处理
- 出现代码中部分的解析失败,请检查网络并执行
go mod tidy
- 编译出现某一特定包出错,可以执行
go get 包名地址