掘金 后端 ( ) • 2024-06-23 21:45

作者:张哲(github: Zzhiter)

背景

Kitex 是字节跳动基础架构服务框架团队推出的 Go 微服务 RPC 框架,支持 Thrift、Kitex Protobuf、gRPC 等消息协议,具有高性能、强可扩展的特点。Kitex 于 2021 年 9 月正式开源后,已在多家外部企业成功落地,为他们带来了真实的成本、性能和稳定性收益。

然而,对于开发者来说,有一个痛点是,为了验证 Server 端代码,发起 RPC 测试请求的流程比较繁琐。

痛点

给 Kitex 服务发送 RPC 测试请求的过程通常包括:

  1. 生成客户端代码:根据 IDL 文件生成 Kitex Client 相关代码。
  2. 构造测试请求:构建请求、调用方法、处理响应。
  3. 配置多种选项:设置传输协议、元信息、异常处理等。

这一过程不仅耗时,且在频繁测试时,每次都需修改和编译代码,效率较低。一个能简化这些步骤、快速发送 RPC 请求的工具,将大幅提升开发效率。

kitexcall 介绍

详情可以参考:https://github.com/kitex-contrib/kitexcall

为了简化开发者的工作,社区推出了 kitexcall 这个命令行工具,基于 Kitex 提供的 JSON 泛化调用,极大地简化了 Kitex 客户端的编写过程。开发者只需通过简单的命令行操作,就可以轻松发起 Kitex 请求,而不再需要编写繁琐的代码。

kitexcall 目前已发布 v0.1.1 版本,具备以下功能特点:

  • 支持 Thrift/Protobuf:可以处理 Thrift 和 Protobuf 格式的 IDL。
  • 支持多种传输协议:包括 Buffered、TTHeader、Framed、TTHeaderFramed,未来还将支持 gRPC。
  • 灵活的客户端选项:支持指定常用的客户端选项,如 client.WithHostPorts
  • 多种数据输入方式:请求数据可以从命令行参数或本地文件读取。
  • 元信息传递:支持单跳透传和持续透传的元信息,并接收服务器返回的反向透传元信息。
  • 业务异常处理:接收并处理业务自定义的异常错误码和信息。
  • 多种输出格式:默认输出人类友好的可读格式,未来将支持可解析的格式,便于与其他自动化工具集成。

下面,我们通过一个简单的例子,展示如何使用 kitexcall 发起一个 Kitex 请求。

使用示例

首先安装 kitexcall 命令行工具:

go install github.com/kitex-contrib/kitexcall@latest

以 github.com/cloudwego/kitex-examples 的 Echo 服务为例,将其 IDL 文件保存为 echo.thrift

namespace go api
struct Request {
    1: string message
}
struct Response {
    1: string message
}
service Echo {
    Response Echo(1: Request req)
}

为方便测试,你可以用如下步骤在本机启动这个 Echo 服务(默认监听 8888 端口):

$ git clone https://github.com/cloudwego/kitex-examples.git
$ cd kitex-examples/basic/server/
$ go run .
[Info] KITEX: server listen at addr=[::]:8888

使用 kitexcall 发起请求非常简单,只要在命令行中指定 IDL 文件、方法名称、请求报文(JSON 格式)和 Server 地址即可:

kitexcall -idl-path echo.thrift -m echo -d '{"message": "hello"}' -e 127.0.0.1:8888

然后就可以看到 kitexcall 输出服务端返回的响应报文:

[Status]: Success
{
    "message": "hello"
}

如果你希望从文件中读入请求数据,也可以先创建请求数据文件 input.json

{"message": "hello"}

并在 kitexcall 的参数中用 -f 参数指定文件名:

kitexcall -idl-path echo.thrift -m echo -f input.json -e 127.0.0.1:8888

原理简介

kitexcall 工具基于 Kitex 提供的 JSON 泛化调用实现。其原理简单介绍如下:

  1. Descriptor Provider: kitexcall 使用 Kitex 提供的 DescriptorProvider 接口来解析 Thrift 或 Protobuf 的 IDL 文件,获取服务定义。
  2. 泛化对象创建: 解析 IDL 文件后,kitexcall 创建泛化对象(如 JSONThriftGeneric 或 JSONPbGeneric),将 JSON 数据转换为内部请求格式,并将响应数据转换回 JSON 格式。
  3. 客户端初始化: kitexcall 使用泛化对象和客户端选项(如传输协议、元信息处理等)来创建泛化客户端。该客户端可以调用 IDL 文件中定义的任何服务方法。
  4. 请求构建与发送: kitexcall 从命令行输入或文件中读取 JSON 格式的请求数据,构建请求对象并发送请求,同时设置传输协议和元信息。
  5. 响应处理: 接收到响应后,kitexcall 将其格式化为 JSON 并输出。如果启用了元信息回传机制,还会输出从服务端返回的元信息。

未来展望

kitexcall 作为一个社区驱动的项目,致力于简化开发者使用 Kitex 进行 RPC 调用的过程。未来,我们计划在以下几个方面进行改进和扩展:

  1. 计划支持 gRPC(含基于 gRPC/HTTP2 的 Thrift Streaming)协议,以适应更多的使用场景。
  2. 支持通过服务发现获取 Kitex Server 地址。
  3. 在 Kitex Server 支持 Reflection 能力之后,kitexcall 将跟进,实现无需 IDL 文件,即可获取服务详情和进行服务调用,使用将会更加便捷。
  4. 支持可解析的输出格式(如 JSON),以便与其他自动化工具集成(例如 CI/CD、IDE 插件等场景)。

欢迎对 Kitex 和 kitexcall 感兴趣的开发者加入社区,共同贡献代码和创意。我们相信,在大家的共同努力下,kitexcall 将成为 Kitex 开发者手中的一把利器,让微服务开发变得更加高效和便捷。访问 github.com/kitex-contrib/kitexcall 了解更多信息,并加入我们吧!