我只与 Thrift 的 C++ 版本密切合作,所以这个答案是基于此的——它可能也适用于其他语言,也可能不是。
不过根据我的经验,Thrift 是相当模块化的——为您提供一个完整的堆栈,可以处理 RPC、套接字通信、数据序列化以及基本上介于两者之间的任何东西。
您首先在 Thrift IDL 文件中指定数据结构和服务,其方式类似于在类中指定成员变量(用于数据结构)和成员函数(用于服务)(在 C++/Java/等中) .)。您使用 Thrift 编译器编译这些以生成特定于语言的源文件,然后您可以在应用程序中实现这些源文件。
如果您使用完整的堆栈,那么只需创建必要的对象(服务器、协议、传输等)并打开客户端和服务器之间的连接(服务器实现 IDL 指定的功能)。然后客户端可以调用服务器上的函数,就像服务器是一个本地对象一样,使用自定义的数据结构(或只是一些标准的 Thrift 数据类型)作为参数和返回值。
这些函数默认是阻塞的,也就是说,它们在返回之前需要服务器的回答。但是,您也可以将函数指定为oneway
(只要它们返回void
),在这种情况下,您只需发送函数调用,然后立即继续。
但是,所有这一切只有在您使用完整的 Thrift 堆栈时才会出现。您通过实例化各种对象(协议、传输、处理程序、服务器等)来创建您的客户端和服务器,虽然我自己从未尝试过,但我不明白为什么您不能创建一个例如传输的派生实现,然后使用它而不是 Thrifts 自己的传输。
如果您只想使用 Thrift 以跨平台的方式定义数据结构,您也可以这样做,然后使用 Thrift 序列化这些(忽略堆栈的其余部分和 RPC-stuff),然后将它们发送为二进制数据通过您自己的传输。