Go语言 thrift 入门指南--thrift 编译及示例运行

2,581 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情

有了上一篇的准备知识,接下来开始进入实战环节。

下载 thrift 源码

 git clone https://github.com/apache/thrift.git $GOPATH/github.com/apache/

如图,go语言的示例程序及 thrift IDL文件

新建一个测试项目--thrift_test,本文采用 go mod 的形式。把源码文件中的 tutorial下面的 shared.thrift 和 tutorial.thrift 拷贝到项目里,执行命令,生成go代码:

thrift -r --gen go tutorial.thrift

执行成功后,会看到如下所生成的文件:

  • remote 客户端示例代码
  • const 常量所在文件

重点部分,我们看下tutorial.go中的内容:

由于 tutorial.thrift文件里include了shared,所以生成的tutorial.go引用了shared那个thrift文件生成的shared包。此时需要修改下 shared 包的引入路径,改为项目中对应的路径。

  1. thrift生成的代码定义了一个服务名称命名的接口,接口包含之前 IDL 文件所描述的那几个方法 ping、add 等。
type Calculator interface {
  shared.SharedService
  //Ahh, now onto the cool part, defining a service. Services just need a name
  //and can optionally inherit from another service using the extends keyword.

  // A method definition looks like C code. It has a return type, arguments,
  // and optionally a list of exceptions that it may throw. Note that argument
  // lists and exception lists are specified using the exact same syntax as
  // field lists in struct or exception definitions.
  Ping(ctx context.Context) (_err error)
  // Parameters:
  //  - Num1
  //  - Num2
  Add(ctx context.Context, num1 int32, num2 int32) (_r int32, _err error)
  // Parameters:
  //  - Logid
  //  - W
  Calculate(ctx context.Context, logid int32, w *Work) (_r int32, _err error)
  // This method has a oneway modifier. That means the client only makes
  // a request and does not listen for any response at all. Oneway methods
  // must be void.
  Zip(ctx context.Context) (_err error)
}
  1. 客户端

由于客户端代码没有任何逻辑,只需要把请求参数传递给服务端就可以了,所以客户端的代码thrift直接给我们生成好了。

一个客户端结构体:

实现了接口中的所有方法:

Call方法作用是把参数封装好然后发给服务端。

  1. 服务端

服务端也要实现上面那些接口,不过服务端的处理逻辑不是固定的,所以这块的代码 thrift 没有办法自动生成,需要我们自己去定义结构体实现这个接口,去写每个方法的实现逻辑,后续实现的逻辑位于下面示例代码中的 handler.go 中。

  1. 示例代码

我们将示例代码(client.go、server.go、main.go、handler.go)拷贝到测试项目中,注意示例代码中的包引用路径需要修改正确:

  • client.go 封装了客户端的方法
  • server.go 封装了服务端的方法,这两个方法都是在
  • handler.go 服务端所实现的服务接口(pind、add 等)
  • main.go 运行客户端或服务器,具体运行客户端还是服务器是靠这个选项来区分的
    • server 为 true 运行的是服务端,false,运行的是客户端

  1. 运行

注意,将实例代码中引用包的路径都修改完完后,go mod tidy下,引用包没有报错的话,我们就可以运行程序看看效果啦。

先运行服务端,命令行输入下面命令,一次全部启动:

go run main.go server.go client.go handler.go

然后修改 mian.go 中的 server 改成 false,再运行,就是客户端了,还是执行如上命令来启动客户端:

go run main.go server.go client.go handler.go

运行结果如下图所示:

如此,我们便顺利测试完 thrift 示例程序。

Thrift 架构

Thrift技术栈分层从下向上分别为:传输层(Transport Layer)、协议层(Protocol Layer)、处理层(Processor Layer)和服务层(Server Layer)。最底层是IO层,如通过socket进行网络通信。

Thrift支持的传输及服务模型

  • 支持的传输格式:

  • 支持的数据传输方式:

  • 支持的服务模型: