thrift c,thrift编译
节俭用日记_CUDev-ChinaUnix博客
节俭的小贴士
标签:
客户
港口
脸谱网
运输
草案
分类:编程
Thrift是一个跨语言的服务部署框架,最初由脸书在2007年开发,2008年进入Apache开源项目。Thrift通过一种中间语言(IDL)定义RPC的接口和数据类型,然后通过一个编译器生成不同语言(目前支持C、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C #、Cocoa、Smalltalk和OCaml)的代码,生成的代码负责RPC协议层和传输层的实现。Thrift实际上实现了C/S模式,通过代码生成工具将接口定义文件生成为服务器端和客户端代码(可以是不同语言),从而实现服务器端和客户端的跨语言支持。用户在第三个描述文件中声明自己的服务,这些服务经过编译后会生成相应语言的代码文件,然后用户就可以实现服务了(客户端调用服务,服务器调用服务)。其中protocol(协议层,定义数据传输格式,如二进制或XML)和transport(传输层,定义数据传输方式,如TCP/IP传输、内存共享或文件共享)作为运行时库。基本概念
节俭中的几个概念:
服务器服务模型
处理器数据处理接口
处理器数据处理对象
协议数据传输协议
传输数据传输模式处理程序是一个抽象接口,需要在编译后的代码中自行实现。处理器调用Handler中的代码,并自动编译,所以不用担心。(1)支持的传输格式
tbinaryprotocol二进制格式。
tcompactprotocol压缩格式
TJSON协议JSON格式
TSImpleJSON协议——提供JSON只写协议,生成的文件可以很容易的用脚本语言解析。
tdebugprotocol使用易于理解和阅读的文本格式来方便调试。
(2)支持的数据传输方法
TFileTransport:一个文件(日志)传输类,允许客户端向服务器传输文件,并允许服务器将接收到的数据写入文件。
THttpTransport:数据传输采用Http传输协议。
TSocket: TCP Socket用于数据传输。
TZlibTransport:压缩并传输数据,或者解压缩接收到的数据。
下面的类主要是修饰上面的类(使用decorator模式)来提高传输效率。
TBufferedTransport:缓冲传输对象操作的数据,即从缓冲区读取数据进行传输,或者直接将数据写入缓冲区。
TFramedTransport:用于帧传输的非阻塞服务。类似于TBufferedTransport,也会缓冲相关数据,同时支持定长数据发送和接收。
TMemoryBuffer:从支持缓冲区(3)的服务模型中读取和写入数据
TsimpleServer——一个简单的单线程服务模型,通常用于测试。
tthreaddserver——多线程服务模型,使用阻塞IO,为每个请求创建一个线程。
tthreadpoolserver线程池服务模型,它使用标准的阻塞IO创建一组线程来预先处理请求。
TnBlockingServer多线程服务模型。如果使用非阻塞IO(需要TFramedTransport数据传输模式)处理大量更新,主要在TThreadedServer和TnBlockingServer之间选择。TNonblockingServer可以用少量线程处理大量并发连接,但延迟较高;TThreadedServer具有低延迟。实际上tthreaddserver的吞吐量可能比TNonblockingServer高,但是tthreaddserver的CPU消耗比TNonblockingServer高很多。安装安装使用节俭需要注意安装一些库的实现。
Thrift的C编译器在boost中使用shared_ptr。如果需要配合C使用,需要先安装boost。
如果希望使用非阻塞服务器,需要安装libevent。使用thrift时,首先定义一个idl文件(接口描述语言),然后使用thrift编译相应的代码。节俭-GencppXYZ。Thrift我们需要记住的是:Thrift帮助您生成给定服务的服务器端和客户端代码。Thrift这里的命名规则是针对服务XYZ的,其对应的服务器端代码(具体是这个服务的执行)是在XYZHandler类中,客户端代码(负责marshall,执行RPC)是在XYZClient类中。所以你需要使用这个服务,你只需要直接修改或者继承这些类。服务器编写的一般步骤:
1.创建处理程序
2.基于处理程序创建处理器
3.创建运输
4.创建协议模式
5.基于处理器、传输和协议创建服务器
6.运行服务器客户端的一般步骤:
1.创建运输
2.创建协议模式
3.基于传输和协议创建客户端
4.当您运行客户端方法来创建传输时,通常需要创建相应的套接字。代码附有周末写的测试代码,leveldb用thrift封装成网络服务。它包含各种服务模型。在kv.rar的注意事项。Thrift生成的服务器端是线程安全的。但是客户端不是线程安全的。因此,如果多个线程需要与服务器端通信,每个线程都需要启动自己的一个客户端实例。2.如果服务器使用TNonblockingServer,客户端必须使用TFramedTransport。链接程序时需要Thriftnb。
3.默认情况下,TServerSocket和TSocket都将NoDelay设置为1,这样消息可以尽快发送出去。如果客户端和服务器之间有大量的数据传输,可以通过设置NoDelay为0来启动Nagel算法,在发送之前缓存一段数据,从而减少消息的数量。
TSocket默认打开Linger,并将linger time设置为0,这样close就会丢弃Socket发送缓冲区中的数据,并向对等体发送RST消息。close不会被阻塞,会立即返回。
TServerSocket默认关闭Linger,close不会被阻塞,它会立即返回。
4.fb303作为handler的基类,里面预置了一些rpc方法用于监控,包括系统状态、请求次数等状态信息。
thrift文件中需要包含“fb303.thrift ”,以便将服务导入目标thrift文件。thrift编译的代码只需要相应的处理程序就可以继承facebook:fb303:FacebookBase。类scribeHandler:虚拟公共scribe:thrift:scribeIf,
脸书:FB 303:脸书基地{5。您可以使用ZeroMQ和其他工具作为传输工具进行通信。
可以参考thrift-0.7.0/contrib/zeromq中的代码。[未测试]
https://issues.apache.org/jira/browse/THRIFT-812
6.thrift支持完全异步,这需要在生成代码时使用
节俭一代cpp:cob_style xxx.thrift
这种情况下,生成的代码需要TEventServer.h,但它不存在于async目录中,只有TEvhttpServer.h
3359github.com/klickverbot/thrift/commit/5dABB8E3F63A 15874 e 436 c 9 a 650 DC 17 f 7 DD 7028 # diff-2【注意】async有些问题,需要用T Event Server.h编译自动生成的代码(0.7.0和svn trunk都可以),,,contrib/async里有http异步测试代码,大致看了一下它的实现,用std:tr1:function和std:tr1:bind实现了处理器的异步处理,并增加了TAsyncProcessor。当它的流程函数返回时,真正的逻辑可能还没有完成。对于服务器端,响应主要发送到客户端。同步RPC服务的TProcessor就可以了。只有像代理这样的中间服务需要异步处理,但是目前在thrift中只有TEvhttpServer可用。-)参考
http://dongxicheng.org/search-engine/thrift-framework-intro/
http://dongxicheng.org/search-engine/thrift-guide/
http://donxi cheng . org/search-engine/thrift-RPC/http://diwakergupta . github . com/thrift-missing-guide/
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。