最近开始正式接触Thrift架构,很牛B的技术,它被apache收纳了,属于开源中的一员,呵呵。

概念:

Thrift源于大名鼎鼎的facebook之手,在2007年facebook提交Apache基金会将Thrift作为一个开源项目,对于当时 的facebook来说创造thrift是为了解决facebook系统中各系统间大数据量的传 输通信以及系统之间语言环境不同需要跨平台的特性。所以thrift可以支持多种程序语言,例如:  C++, C#, Cocoa, Erlang, Haskell, Java, Ocami, Perl, PHP, Python, Ruby, Smalltalk. 在多种不同的语言之间通信thrift可以作为二进制的高性能的通讯中间件,支持数据(对象)序列化和多种类型的RPC服务。Thrift适用于程序对程 序静态的数据交换,需要先确定好他的数据结构,他是完全静态化的,当数据结构发生变化时,必须重新编辑IDL文件,代码生成,再编译载入的流程,跟其他 IDL工具相比较可以视为是Thrift的弱项,Thrift适用于搭建大型数据交换及存储的通用工具,对于大型系统中的内部数据传输相对于JSON和 xml无论在性能、传输大小上有明显的优势。

下面看一下windows下的安装与使用。

Thrift目前最高0.9.1,地址:http://archive.apache.org/dist/thrift/

注意,我们要把exe和tar文件都下载下来,exe用来编译你的thrift中间语言,而tar解压后,我们可以看到csharp,php,java,js等多种开发语言的实例代码,对我们很有帮助的,下载最新版

下载之后,我们把exe文件可以放在C盘,建个Thrift目录,把它放入,然后可以配置一下环境变量,如图:

aaarticlea/png;base64,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" alt="" />

然后,我们就可以进行thrift中间语言的开发了,之所以说它是中间语言,是因为它不是最终我们要使用的,而需要将它进行编译之后,才生成我们的目标语言,就像C语言,它在编译时也是生成obj目标语言,然后再二次编译最终生成exe文件,它们的道理是一样的,

我们的thrift语言,通过thrift程序可以生成多种编程语言的源代码。

编码问题

使用VS建立一个thrift文件后,在进行编译时出现了问题,最后找到答案,原来是编码问题,最后使用记事本把编码被为ANSI就可以正常编译了。

aaarticlea/png;base64,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" alt="" />

Hello world程序代码:

namespace csharp HelloThriftspace

exception Xception {
: i32 errorCode,
: string message
} service HelloThrift{
void HelloWorld() throws (:Xception ex)
}

编译代码:

thrift --gen csharp hellothrift.thrift 

结果:namespace表示文件夹的所在地,方法,结构,枚举都是以文件形式存在的

aaarticlea/png;base64,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" alt="" />

生成的C#代码:

Xception.cs

namespace HelloThriftspace
{ #if !SILVERLIGHT
[Serializable]
#endif
public partial class Xception : TException, TBase
{
private int _errorCode;
private string _message; public int ErrorCode
{
get
{
return _errorCode;
}
set
{
__isset.errorCode = true;
this._errorCode = value;
}
} public string Message
{
get
{
return _message;
}
set
{
__isset.message = true;
this._message = value;
}
} public Isset __isset;
#if !SILVERLIGHT
[Serializable]
#endif
public struct Isset {
public bool errorCode;
public bool message;
} public Xception() {
} public void Read (TProtocol iprot)
{
TField field;
iprot.ReadStructBegin();
while (true)
{
field = iprot.ReadFieldBegin();
if (field.Type == TType.Stop) {
break;
}
switch (field.ID)
{
case :
if (field.Type == TType.I32) {
ErrorCode = iprot.ReadI32();
} else {
TProtocolUtil.Skip(iprot, field.Type);
}
break;
case :
if (field.Type == TType.String) {
Message = iprot.ReadString();
} else {
TProtocolUtil.Skip(iprot, field.Type);
}
break;
default:
TProtocolUtil.Skip(iprot, field.Type);
break;
}
iprot.ReadFieldEnd();
}
iprot.ReadStructEnd();
} public void Write(TProtocol oprot) {
TStruct struc = new TStruct("Xception");
oprot.WriteStructBegin(struc);
TField field = new TField();
if (__isset.errorCode) {
field.Name = "errorCode";
field.Type = TType.I32;
field.ID = ;
oprot.WriteFieldBegin(field);
oprot.WriteI32(ErrorCode);
oprot.WriteFieldEnd();
}
if (Message != null && __isset.message) {
field.Name = "message";
field.Type = TType.String;
field.ID = ;
oprot.WriteFieldBegin(field);
oprot.WriteString(Message);
oprot.WriteFieldEnd();
}
oprot.WriteFieldStop();
oprot.WriteStructEnd();
} public override string ToString() {
StringBuilder sb = new StringBuilder("Xception(");
sb.Append("ErrorCode: ");
sb.Append(ErrorCode);
sb.Append(",Message: ");
sb.Append(Message);
sb.Append(")");
return sb.ToString();
} } }

HelloThrift.cs

namespace HelloThriftspace
{
public partial class HelloThrift {
public interface Iface {
void HelloWorld();
#if SILVERLIGHT
IAsyncResult Begin_HelloWorld(AsyncCallback callback, object state);
void End_HelloWorld(IAsyncResult asyncResult);
#endif
} public class Client : IDisposable, Iface {
public Client(TProtocol prot) : this(prot, prot)
{
} public Client(TProtocol iprot, TProtocol oprot)
{
iprot_ = iprot;
oprot_ = oprot;
} protected TProtocol iprot_;
protected TProtocol oprot_;
protected int seqid_; public TProtocol InputProtocol
{
get { return iprot_; }
}
public TProtocol OutputProtocol
{
get { return oprot_; }
} #region " IDisposable Support "
private bool _IsDisposed; // IDisposable
public void Dispose()
{
Dispose(true);
} protected virtual void Dispose(bool disposing)
{
if (!_IsDisposed)
{
if (disposing)
{
if (iprot_ != null)
{
((IDisposable)iprot_).Dispose();
}
if (oprot_ != null)
{
((IDisposable)oprot_).Dispose();
}
}
}
_IsDisposed = true;
}
#endregion #if SILVERLIGHT
public IAsyncResult Begin_HelloWorld(AsyncCallback callback, object state)
{
return send_HelloWorld(callback, state);
} public void End_HelloWorld(IAsyncResult asyncResult)
{
oprot_.Transport.EndFlush(asyncResult);
recv_HelloWorld();
} #endif public void HelloWorld()
{
#if !SILVERLIGHT
send_HelloWorld();
recv_HelloWorld(); #else
var asyncResult = Begin_HelloWorld(null, null);
End_HelloWorld(asyncResult); #endif
}
#if SILVERLIGHT
public IAsyncResult send_HelloWorld(AsyncCallback callback, object state)
#else
public void send_HelloWorld()
#endif
{
oprot_.WriteMessageBegin(new TMessage("HelloWorld", TMessageType.Call, seqid_));
HelloWorld_args args = new HelloWorld_args();
args.Write(oprot_);
oprot_.WriteMessageEnd();
#if SILVERLIGHT
return oprot_.Transport.BeginFlush(callback, state);
#else
oprot_.Transport.Flush();
#endif
} public void recv_HelloWorld()
{
TMessage msg = iprot_.ReadMessageBegin();
if (msg.Type == TMessageType.Exception) {
TApplicationException x = TApplicationException.Read(iprot_);
iprot_.ReadMessageEnd();
throw x;
}
HelloWorld_result result = new HelloWorld_result();
result.Read(iprot_);
iprot_.ReadMessageEnd();
if (result.__isset.ex) {
throw result.Ex;
}
return;
} }
public class Processor : TProcessor {
public Processor(Iface iface)
{
iface_ = iface;
processMap_["HelloWorld"] = HelloWorld_Process;
} protected delegate void ProcessFunction(int seqid, TProtocol iprot, TProtocol oprot);
private Iface iface_;
protected Dictionary<string, ProcessFunction> processMap_ = new Dictionary<string, ProcessFunction>(); public bool Process(TProtocol iprot, TProtocol oprot)
{
try
{
TMessage msg = iprot.ReadMessageBegin();
ProcessFunction fn;
processMap_.TryGetValue(msg.Name, out fn);
if (fn == null) {
TProtocolUtil.Skip(iprot, TType.Struct);
iprot.ReadMessageEnd();
TApplicationException x = new TApplicationException (TApplicationException.ExceptionType.UnknownMethod, "Invalid method name: '" + msg.Name + "'");
oprot.WriteMessageBegin(new TMessage(msg.Name, TMessageType.Exception, msg.SeqID));
x.Write(oprot);
oprot.WriteMessageEnd();
oprot.Transport.Flush();
return true;
}
fn(msg.SeqID, iprot, oprot);
}
catch (IOException)
{
return false;
}
return true;
} public void HelloWorld_Process(int seqid, TProtocol iprot, TProtocol oprot)
{
HelloWorld_args args = new HelloWorld_args();
args.Read(iprot);
iprot.ReadMessageEnd();
HelloWorld_result result = new HelloWorld_result();
try {
iface_.HelloWorld();
} catch (Xception ex) {
result.Ex = ex;
}
oprot.WriteMessageBegin(new TMessage("HelloWorld", TMessageType.Reply, seqid));
result.Write(oprot);
oprot.WriteMessageEnd();
oprot.Transport.Flush();
} } #if !SILVERLIGHT
[Serializable]
#endif
public partial class HelloWorld_args : TBase
{ public HelloWorld_args() {
} public void Read (TProtocol iprot)
{
TField field;
iprot.ReadStructBegin();
while (true)
{
field = iprot.ReadFieldBegin();
if (field.Type == TType.Stop) {
break;
}
switch (field.ID)
{
default:
TProtocolUtil.Skip(iprot, field.Type);
break;
}
iprot.ReadFieldEnd();
}
iprot.ReadStructEnd();
} public void Write(TProtocol oprot) {
TStruct struc = new TStruct("HelloWorld_args");
oprot.WriteStructBegin(struc);
oprot.WriteFieldStop();
oprot.WriteStructEnd();
} public override string ToString() {
StringBuilder sb = new StringBuilder("HelloWorld_args(");
sb.Append(")");
return sb.ToString();
} } #if !SILVERLIGHT
[Serializable]
#endif
public partial class HelloWorld_result : TBase
{
private Xception _ex; public Xception Ex
{
get
{
return _ex;
}
set
{
__isset.ex = true;
this._ex = value;
}
} public Isset __isset;
#if !SILVERLIGHT
[Serializable]
#endif
public struct Isset {
public bool ex;
} public HelloWorld_result() {
} public void Read (TProtocol iprot)
{
TField field;
iprot.ReadStructBegin();
while (true)
{
field = iprot.ReadFieldBegin();
if (field.Type == TType.Stop) {
break;
}
switch (field.ID)
{
case :
if (field.Type == TType.Struct) {
Ex = new Xception();
Ex.Read(iprot);
} else {
TProtocolUtil.Skip(iprot, field.Type);
}
break;
default:
TProtocolUtil.Skip(iprot, field.Type);
break;
}
iprot.ReadFieldEnd();
}
iprot.ReadStructEnd();
} public void Write(TProtocol oprot) {
TStruct struc = new TStruct("HelloWorld_result");
oprot.WriteStructBegin(struc);
TField field = new TField(); if (this.__isset.ex) {
if (Ex != null) {
field.Name = "Ex";
field.Type = TType.Struct;
field.ID = ;
oprot.WriteFieldBegin(field);
Ex.Write(oprot);
oprot.WriteFieldEnd();
}
}
oprot.WriteFieldStop();
oprot.WriteStructEnd();
} public override string ToString() {
StringBuilder sb = new StringBuilder("HelloWorld_result(");
sb.Append("Ex: ");
sb.Append(Ex== null ? "<null>" : Ex.ToString());
sb.Append(")");
return sb.ToString();
} } }
}

感觉生成的代码还是比较麻烦的,希望thrift在以后的产品中,对这块解决的好一点,呵呵。

下一讲我们将进行客户端与服务器环境的搭建。