这一节说说客户端。可以说,对于阻塞的客户端,近乎于没有任何逻辑。这里仅仅把一次RPC调用的过程记录下来。还是认为,我们在Thrift声明的服务叫XXX,RPC调用的函数名叫YYY,而且不是oneway方法。Thrift会生成XXXClient类,这个类包括三个方法,YYY、send_YYY、recv_YYY。

程序员会显示的声明一个XXXClient的对象c,然后调用c.YYY。c.YYY顺次调用c.send_YYY和c.recv_YYY。前者是发送函数名,和参数,后者是接收返回值。整个流程如下:

1. writeMessageBegin

2. 写入参数,调用args.write

3. writeMessageEnd

4. getTransport()->writeEnd()

5. getTransport()->flush()

6. readMessageBegin 查看是异常还是返回值,查看RPC函数名

7. 如果是返回值,而且RPC函数名匹配,那么XXX_YYY_presult.read

8. readMessageEnd()

9. getTransport()->readEnd()

10. 读取返回值成功的话,把RPC结果返回,否则,抛出TApplicationException异常。

可以说,简单得不能再简单了!