课程笔记 - Web开发三件套 - kitex | 青训营笔记

144 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天


kitex

Kitex是字节内部的一款针对 golang 微服务研发的 PRC 框架。既然是 RPC,底层就需要两大功能:

  1. Serialization 序列化
  2. Transport 传输

Kitex 框架及命令行工具,默认支持 thrift 和 proto3 两种 IDL,对应的 Kitex 支持 thrift 和 protobuf 两种序列化协议。 传输上 Kitex 使用扩展的 thrift 作为底层的传输协议(注:thrift 既是 IDL 格式,同时也是序列化协议和传输协议)。

IDL

是什么

IDL 是 Interface description language 的缩写,指接口描述语言,是规范的一部分,是跨平台开发的基础。常见的 IDL 协议有两种:thriftproto3

为什么要使用 IDL

如果我们要进行 RPC,就需要知道对方的接口是什么,需要传什么参数,同时也需要知道返回值是什么样的,就好比两个人之间交流,需要保证在说的是同一个语言、同一件事。 这时候,就需要通过 IDL 来约定双方的协议,就像在写代码的时候需要调用某个函数,我们需要知道函数签名一样。

以下为 thrift 格式的接口定义

// 命名空间,服务名称
namespace go api

struct Request {
    1: string message
}

struct Response {
    1: string message
}

// 声明此服务的接口
service Echo {
    // 声明此服务的方法
    Response echo(1: Request req)
}

操作

使用以下命令生成 kitex 相关代码

kitex -module bytedance-study -service Echo demo.thrift

其中

  • kitex_gen/ IDL 内容相关的生成代码,主要是基础的 C/S 代码
  • script/ 启动脚本文件夹
  • build.sh 构建脚本
  • demo.thrift 用户定义的 IDL 文件
  • handler.go rpc 服务实现接口,用户在该文件里实现 IDL service 定义的方法
  • main.go 程序入口

运行服务

  • 服务默认监听 8888 端口
  • 按规定格式发起请求 client/main.go
go run main.go handler.go

client

需要注意的是,kitex 生成的代码操作仅局限于服务端范畴,客户端调用部分需要用户自行实现。还是以上述定义的 demo.thrift 文件为例,其接口方法调用逻辑如下:

func main() {
   serviceName := "echo" // 服务发现使用
   c, err := echo.NewClient(serviceName, client.WithHostPorts("0.0.0.0:8888"))
   if err != nil {
      log.Fatal(err)
   }
   req := &api.Request{
      Message: "message",
   }
   resp, err := c.Echo(context.Background(), req, callopt.WithRPCTimeout(3*time.Second))
   if err != nil {
      log.Fatal(err)
   }
   log.Println(resp)
}