thrift基础以及在c#中的使用

###thrift是什么
Apache Thrift 是 Facebook 实现的一种高效的、支持多种编程语言的远程服务调用的框架.它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势.

下载

wget http://apache.fayea.com/thrift/0.9.2/thrift-0.9.2.tar.gz

tar -zxvf thrift-0.9.2.tar.gz

编译

1
2
3
4
5
./configure

make
make install

http://thrift.apache.org/docs/BuildingFromSource

基础类型

  • bool 布尔型
  • byte 比特
  • i16 16位整形
  • i32 32位整形
  • i64 64位整形
  • double 64位浮点数
  • binary 二进制
  • struct 结构体
  • list / set /map 容器
  • exception 异常
  • service 服务类

###协议
hrift 可以让用户选择客户端与服务端之间传输通信协议的类别,在传输协议上总体划分为文本 (text) 和二进制 (binary) 传输协议,为节约带宽,提高传输效率,一般情况下使用二进制类型的传输协议为多数,有时还会使用基于文本类型的协议,这需要根据项目 / 产品中的实际需求。常用协议有以下几种

  • TBinaryProtocol —— 二进制编码格式进行数据传输
  • TCompactProtocol —— 高效率的、密集的二进制编码格式进行数据传输
  • TJSONProtocol —— 使用 JSON 的数据编码协议进行数据传输
  • TSimpleJSONProtocol —— 只提供 JSON 只写的协议,适用于通过脚本语言解析

###传输层

  • TSocket —— 使用阻塞式 I/O 进行传输,是最常见的模式
  • TFramedTransport —— 使用非阻塞方式,按块的大小进行传输
  • TNonblockingTransport —— 使用非阻塞方式,用于构建异步客户端

###服务端类型

  • TSimpleServer —— 单线程服务器端使用标准的阻塞式 I/O
  • TThreadPoolServer —— 多线程服务器端使用标准的阻塞式 I/O
  • TNonblockingServer —— 多线程服务器端使用非阻塞式 I/O

生成

thrift -r –gen csharp tutorial.thrift

基础教程
http://thrift.apache.org/tutorial/

###.net示例

####创建.thrift清单文件

当thrift安装好后,创建一个test.thrift文件,内容如下

1
2
3
4
5
6
7
8
9
struct SharedStruct {
1: i32 key
2: string value
}

service SharedService {
SharedStruct getStruct(1: i32 key)
}

####生成文件

运行下面的命令生成.net的库,将得到两个文件SharedService.cs ShardStruct.cs.

1
2
thrift -r --gen csharp test.thrift

####服务端

创建一个测试的工程,并引入Thrift.dll.位置thrift-0.9.2/lib/csharp.并将生成的两个文件添加到工程中.

首先需要实现一个SharedService.Iface的接口,里面实现了一个getStruct的方法,用来给客户端返回数据.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class SharedServiceTest : SharedService.Iface
{

public SharedStruct getStruct(int key)
{
if (key < 10)
{
return new SharedStruct { Key = key, Value = "小于10" };
}
if (key >= 10 && key < 100)
{
return new SharedStruct { Key = key, Value = "10到100之间" };
}
if (key >= 100)
{
return new SharedStruct { Key = key, Value = "100及以上" };
}
return null;

}
}

服务端启动代码,监听9090的端口

1
2
3
4
5
6
7
8
9
10
 SharedServiceTest service = new SharedServiceTest();

SharedService.Processor processsor = new SharedService.Processor(service);

TServerTransport serverTransport = new TServerSocket(9090);

TServer server = new TSimpleServer(processsor, serverTransport);

server.Serve();

####客户端
创建一个客户端工程,同服务端一样引入dll和两个生成的文件.其中test为一个输入值.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TTransport transport = new TSocket("10.8.64.109", 9090);
TProtocol protocal = new TBinaryProtocol(transport);
SharedService.Client client = new SharedService.Client(protocal);

transport.Open();
try
{
SharedStruct ss = client.getStruct(test);
Console.WriteLine(ss.Key + "|" + ss.Value);
}
finally
{
transport.Close();
}

thrift基础以及在c#中的使用

https://beixiu.net/dev/the-thrift-and-csharp/

作者

张巍

发布于

2014-12-22

更新于

2014-12-22

许可协议

评论