1、thrift由两部分组成:
编译器(在comliler目录下,采用C++编写)和服务器(在lib目录下),其中编译器的作用是将用户定义的thrift文件编译成对应的语言代码,而服务器是事先已经实现好的、可供用户直接使用的RPC Server(当然,用户也很容易编写自己的Server)。同大部分编译器一样,thrift编译器(采用C++编写)也分为词法分析、语法分析等步骤,thrift采用了开源的flex和Bison进行词法语法分析(具体见thrift.ll和thrift.yy),经过语法分析后,thrift根据对应语言的模板(在compiler\cpp\src\generate目录下)生成相应的代码。对于服务器而言,thrift包含比较经典的服务器模型,比如单线模型(TSimpleServer),线程池模型(TThreadPoolServer)、一个请求一个线程(TThreadedServer)和非阻塞模型(TNonblockingServer)等。点击打开链接http://dongxicheng.org/search-engine/thrift-internals/
2、利用thrift部署服务
主要流程:编写服务说明,保存到.thrift文件;
根据需要,编译.thrift文件,生成相应的语言源代码;
根据实际需要,编写client端和service端代码。
(1).thrift文件编写:
一般将服务放到一个.thrift文件中,服务的编写语法于C语言基本一致,在.thrift文件中主要有一下几个内容:变量声明、数据声明(struct)和服务街廓生命(service,可以继承其他接口)。
下面分析thrift的tutorial中带的例子tutorialthrift:
包含头文件:
59行:include “shared.thrift”
指定目标语言:
67行:namespace cpp tutorial
定义变量:
86行:const i32 INT32CONSTANT=9853
定义结构体:
109行:struct Work{
1:i32 num1=0,
2:i32 num2,
3:Operation op,
4:optional string comment,
}
定义服务:
service Calculator extends shared SharedService{
void ping(),
i32 add(1:i32 num1,2:i32 num2),
i32 calculate(1:i32 logid,2:Work w) throw (1:InvalidOperation ouch),
oneway void zip()
}
要生成C++代码:./thrift --gen cpp tutorial.thrift,结果代码存放在gen-cpp目录下
要生成java代码:./thrift --gen java tutorial.thrift,结果代码存放在gen-java目录下
(2)client端和server端代码编写
client端和server端代码要调用编译.thrift生成的中间文件,下面分析cpp文件线面的CppClient.cpp和CppServer.cpp
在client端,用户自定义CalculatorClient类型的对象(用户在.thrift文件中声明的服务名称是Calculaor,则生成的中间代码中的主类为ClalculatorClient),该对象中封装了各种服务,可以直接嗯调用(如client.ping()),然后thrift会通过封装的rcp调用server端同名函数。在server端需要事先在.thrift文件中声明的服务中的所有功能,以便粗合理client发过来的请求。
在client端,用户自定义CalculatorClient类型的对象(用户在.thrift文件中声明的服务名称是Calculator, 则生成的中间代码中的主类为CalculatorClient), 该对象中封装了各种服务,可以直接调用(如client.ping()), 然后thrift会通过封装的rpc调用server端同名的函数。
在server端,需要实现在.thrift文件中声明的服务中的所有功能,以便处理client发过来的请求。
转载网址:http://dongxicheng.org/search-engine/thrift-framework-intro/点击打开链接