Kitex Thrift 编码实现
[cloudwego-kitex官网](Kitex | CloudWeGo)
使用的IDE工具:VSCODE
一.项目背景说明
Kitex 是由字节跳动开源的高性能、强扩展性的 RPC 框架,它旨在提供高性能、易于使用的RPC服务开发体验。RPC(远程过程调用)是一种允许程序调用另一个地址空间(通常是共享网络的另一台机器)中程序的技术。它支持多种协议,包括但不限于 Thrift,能够满足不同场景下的远程服务调用需求。Thrift 是 Facebook 开发的跨语言服务开发框架,用于进行数据传输和定义服务接口。Kitex 通过集成 Thrift,可以轻松实现不同语言间的 RPC 调用。
二.语言说明
Kitex 框架主要使用 Go 语言开发,Go语言是一种静态类型、编译型的编程语言,以其并发支持、垃圾回收和快速编译而闻名。Go语言的简洁和高效使其成为构建高性能RPC框架的理想选择。
三.代码结构
Kitex 的自动编码相关代码主要分布在 codec
包中,其中包含了对 Thrift 协议的编码和解码实现。以下是一些关键文件和接口的概述:
codec.go
:定义了编解码器的接口和抽象。default_codec.go
:实现了默认的编解码器,支持 Thrift 和 Protobuf。util.go
:提供了一些辅助函数,用于编解码过程中的校验和处理。skip_decoder.go
:实现了一个用于跳过 Thrift 结构的解码器,用于特定的编解码场景。
四.原理分析
Kitex 使用 Thrift 作为其 RPC 通信协议之一。Thrift 通过 .thrift
文件定义服务接口和数据结构,然后生成对应语言的代码。在 Kitex 中,Thrift 代码生成的部分主要包括:
- 服务接口:根据 Thrift 文件生成的服务接口,用于定义 RPC 方法。
- 数据结构:Thrift 文件中定义的数据结构,如 structs, enums, exceptions 等,这些会被编译成 Go 结构体。
- 编解码器:根据 Thrift 定义的数据结构生成的编解码逻辑,用于在网络中传输数据。
五.codec.go
源码详细分析
codec.go
文件定义了编解码器的核心接口,在Kitex框架中,核心的编解码功能主要涉及将RPC请求和响应序列化与反序列化。
go
// Codec is the abstraction of the codec layer of Kitex.
// Codec接口是Kitex编解码层的抽象,它定义了编解码器需要实现的三个方法:
// Encode - 将消息编码为字节缓冲区。
// Decode - 将字节缓冲区解码为消息。
// Name - 返回编解码器的名称。
type Codec interface {
Encode(ctx context.Context, msg Message, out ByteBuffer) error
Decode(ctx context.Context, msg Message, in ByteBuffer) error
Name() string
}
// MetaEncoder is an abstraction of the encode layer that has meta and payload stage.
// MetaEncoder接口是编码层的抽象,它允许用户自定义编码逻辑,特别是元数据和负载阶段。
type MetaEncoder interface {
EncodeMetaAndPayload(ctx context.Context, msg Message, out ByteBuffer, me MetaEncoder) error
EncodePayload(ctx context.Context, msg Message, out ByteBuffer) error
}
// MetaDecoder is an abstraction of the decode layer that has meta and payload stage.
// MetaDecoder接口是解码层的抽象,它允许用户自定义解码逻辑,特别是元数据和负载阶段。
type MetaDecoder interface {
DecodeMeta(ctx context.Context, msg Message, in ByteBuffer) error
DecodePayload(ctx context.Context, msg Message, in ByteBuffer) error
}
(一)核心概念解释
- *Codec 接口:这是编解码器的基本接口,所有编解码器都必须实现这个接口。它包括编码(Encode)和解码(Decode)方法,用于执行数据的序列化和反序列化操作,以及一个返回编解码器名称(Name)的方法。
- MetaEncoder 接口:提供了更细粒度的编码控制,允许用户通过实现
EncodeMetaAndPayload
方法来自定义整个消息(包括元数据和负载)的编码逻辑,或者通过实现EncodePayload
方法来仅自定义负载的编码逻辑。 - MetaDecoder 接口:与 MetaEncoder 相对应,它提供了更细粒度的解码控制,允许用户自定义如何从字节缓冲区中解码出消息的元数据和负载。
(二)功能分析
- 灵活性:通过
Codec
、MetaEncoder
和MetaDecoder
接口,Kitex 允许开发者根据需要实现自定义的编解码逻辑,提供了高度的灵活性。 - 扩展性:接口的设计使得在不修改现有代码的基础上,可以轻松添加新的编解码器实现。
- 抽象性:这些接口抽象了编解码的具体操作,使得上层业务逻辑可以与具体的编解码实现解耦,便于维护和测试。
(三)应用场景
这些接口广泛应用于 RPC 框架中,尤其是在需要处理不同协议或数据格式的场景。例如,当使用 Thrift 作为 IDL(接口定义语言)时,这些接口可以被用来生成对应的编解码器,以支持 Thrift 协议的 RPC 调用。
实验部分
(一)实验环境:Win11-WSL2-Ubuntu22.04
用例描述:模拟一个简单的电商场景,包括商品服务、库存服务与 API 服务,商品服用调用库存服务查询库存,API 服务调用商品服务查询商品信息,对前端或用户暴露 HTTP 接口供查询商品信息。
(二)实验步骤:
-
安装环境:go、kitex、thriftgo。
bashgo install github.com/cloudwego/thriftgo@latest go install github.com/cloudwego/kitex/tool/cmd/kitex@latest
-
编辑 thrift 文件
-
调用 kitex 工具生成脚手架
arduinokitex -module example_shop idl/item.thrift kitex -module example_shop idl/stock.thrift
生成的item相关代码:
- 编写具体业务逻辑代码
- 启动服务
七.结论
Kitex 的 Thrift 编码实现遵循了 Thrift 的规范,并提供了灵活的接口以适应不同的编码需求。通过抽象的编解码接口,Kitex 能够支持多种数据传输格式,同时保持代码的可扩展性和可维护性。这种设计使得 Kitex 成为一个强大且灵活的 RPC 框架,适用于多种不同的应用场景。