我见过几个消息来源声明Thrift是一个二进制通信协议(例如维基百科文章的第一行)。
但是,Thrift可以通过http进行调用,我认为这是一个基于文本的协议而不是二进制协议。
也许消息来源只是说Thrift有二进制协议选项可用,但也有像http这样的选项?
我意识到我可能误解了“协议”在Thrift环境中的含义。例如,使用用于JSON数据编码的TJsonProtocol选项,可以通过http以及二进制协议发送数据吗?
如果我滥用任何条款,我都会道歉,我认为这可能会导致我的困惑。我很遗憾不是OSI模型的专家。
答案 0 :(得分:3)
首先,维基百科不是权威资源,所以不要赌你的任何东西。
不,Thrift不是二进制通信协议。节俭根本不是一种协议。
Thrift is a framework提供了通过各种协议和传输进行序列化和通信的功能,其中包括HTTP和二进制文件,但绝不仅限于此。
事实上,关于Thrift库的整个想法是提供丰富的选项,从中可以尽可能自由地构建特定的解决方案。你想通过HTTP JSON?喏,给你。你想要二进制,但需要比二进制更紧凑的东西?当然,请使用TCompactProtocol
或GZIP。你想添加TLS吗?没问题,只需将其添加到您的堆栈。命名管道? SASL?消息?你说它的名字。
如果这还不够(或者如果某个特定项目尚未针对您选择的语言实现),则可以始终编写自己的传输或协议实现。这并不难,the /contrib
folder已经举了一些例子。
我意识到我可能误解了“协议”在Thrift环境中的含义。
确实,协议是一个超载的术语。在Thrift上下文中,协议是从TProtocol
派生的一些实现。
void WriteMessageBegin(TMessage message);
void WriteMessageEnd();
void WriteStructBegin(TStruct struc);
void WriteStructEnd();
void WriteFieldBegin(TField field);
void WriteFieldEnd();
void WriteFieldStop();
void WriteMapBegin(TMap map);
void WriteMapEnd();
void WriteListBegin(TList list);
void WriteListEnd();
void WriteSetBegin(TSet set);
void WriteSetEnd();
void WriteBool(bool b);
void WriteByte(sbyte b);
void WriteI16(short i16);
void WriteI32(int i32);
void WriteI64(long i64);
void WriteDouble(double d);
void WriteString(string s);
void WriteBinary(byte[] b);
TMessage ReadMessageBegin();
void ReadMessageEnd();
TStruct ReadStructBegin();
void ReadStructEnd();
TField ReadFieldBegin();
void ReadFieldEnd();
TMap ReadMapBegin();
void ReadMapEnd();
TList ReadListBegin();
void ReadListEnd();
TSet ReadSetBegin();
void ReadSetEnd();
bool ReadBool();
sbyte ReadByte();
short ReadI16();
int ReadI32();
long ReadI64();
double ReadDouble();
string ReadString();
byte[] ReadBinary();
Thrift协议提供了一种高级方式来写入和读取底层传输层。 Thrift协议负责在程序中使用的数据和进入本机传输的原始字节之间进行转换。例如,TJSONProtocol
负责将数据呈现到JSON字节和从JSON字节解析数据。
相反,位于协议层下方的Thrift TTransport
衍生物确定了数据的物理存储位置。这个方面完全被抽象掉了,协议层没有关于物理介质的线索(并且不应该)。反之亦然,传输层不知道流经它的数据意味着什么,它只看到字节。