Go的RPC框架Kitex| 青训营笔记

279 阅读2分钟

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

1 概述

RPC(Remote Procedure Call Protocol)远程过程调用协议。一个通俗的描述是:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。比较正式的描述是:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

KiteX 是字节跳动开源的高性能 RPC 框架,具有高性能、强可扩展的特点,在字节内部已广泛使用。 该框架支持的协议类型:Thrift,Protobuf等。

2 Thrift介绍

Thrift 本身是一软件框架(远程过程调用框架),用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。通过IDL(接口定义语言 Interface Definition Language)可以生成服务端和客户端无缝跨语言通信。

2.2 为什么要使用 IDL

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

3 KiteX实践

3.1 环境搭建

  • Kitex尚不完善支持windows,开发环境是windows需要使用虚拟机或WSL2。

3.2 安装

  • 安装 kitex:go install github.com/cloudwego/kitex/tool/cmd/kitex@latest

  • 安装 thriftgo:go install github.com/cloudwego/thriftgo@latest

  • 安装成功后,执行 kitex --version 可以看到如下信息

    v0.4.4

3.3编写 IDL

首先我们需要编写一个 IDL,这里以 [thrift]IDL 为例。

首先创建一个名为 echo.thrift 的 thrift IDL 文件。

然后在里面定义我们的服务

namespace go api

struct Request {
 1: string message
}

struct Response {
  1: string message
}

service Echo {
    Response echo(1: Request req)
}

3.4 生成 echo 服务代码

有了 IDL 以后我们便可以通过 kitex 工具生成项目代码了,执行如下命令:

$ kitex -module example -service example echo.thrift

上述命令中,-module 表示生成的该项目的 go module 名,-service 表明我们要生成一个服务端项目,后面紧跟的 example 为该服务的名字。最后一个参数则为该服务的 IDL 文件。

生成后的项目结构如下:

.
|-- build.sh
|-- echo.thrift
|-- handler.go
|-- kitex_gen
|   `-- api
|       |-- echo
|       |   |-- client.go
|       |   |-- echo.go
|       |   |-- invoker.go
|       |   `-- server.go
|       |-- echo.go
|       `-- k-echo.go
|-- main.go
`-- script
    |-- bootstrap.sh
    `-- settings.py

3.5编写服务端代码

package main

import (
  "context"
  "example/kitex_gen/api"
)

// EchoImpl implements the last service interface defined in the IDL.
type EchoImpl struct{}

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

这里的 Echo 函数就对应了我们之前在 IDL 中定义的 echo 方法。

3.6 服务端的编译运行

kitex 工具已经帮我们生成好了编译和运行所需的脚本:

编译:

$ sh build.sh

执行上述命令后,会生成一个 output 目录,里面含有我们的编译产物。

运行:

$ sh output/bootstrap.sh 执行上述命令后,Echo 服务就开始运行啦