持续创作,加速成长!这是我参与「掘金日新计划 · 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 包的引入路径,改为项目中对应的路径。
- 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)
}
- 客户端
由于客户端代码没有任何逻辑,只需要把请求参数传递给服务端就可以了,所以客户端的代码thrift直接给我们生成好了。
一个客户端结构体:
实现了接口中的所有方法:
Call方法作用是把参数封装好然后发给服务端。
- 服务端
服务端也要实现上面那些接口,不过服务端的处理逻辑不是固定的,所以这块的代码 thrift 没有办法自动生成,需要我们自己去定义结构体实现这个接口,去写每个方法的实现逻辑,后续实现的逻辑位于下面示例代码中的 handler.go 中。
- 示例代码
我们将示例代码(client.go、server.go、main.go、handler.go)拷贝到测试项目中,注意示例代码中的包引用路径需要修改正确:
- client.go 封装了客户端的方法
- server.go 封装了服务端的方法,这两个方法都是在
- handler.go 服务端所实现的服务接口(pind、add 等)
- main.go 运行客户端或服务器,具体运行客户端还是服务器是靠这个选项来区分的
- server 为 true 运行的是服务端,false,运行的是客户端
- 运行
注意,将实例代码中引用包的路径都修改完完后,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支持的传输及服务模型
-
支持的传输格式:
-
支持的数据传输方式:
- 支持的服务模型: