由浅入深了解Thrift之结果封装
一、thrift返回结果封装
- Thrift文件添加版本号,方便对thrift的版本进行控制
- 服务与返回的数据类型分开定义
在项目中使用Thrift提供RPC服务时,很多情况下我们都会将返回的结果进行封装和定义需要自己数据结构。为增加thrift文件的易读性,我们将数据结构和服务分开定义到不通的文件中 。通过这种方式,为调用方提供友好的使用体验。
thrift_datatype.thrift中定义数据类型:
namespace java com.wy.service.thriftdatatype /*thrift版本控制*/ const string VERSION = "1.0.1" /*为ThriftResult添加数据不完全和内部错误两种类型*/ /**************************************************************************************************** * 定义返回值: * 枚举类型ThriftResult,表示返回结果,成功或失败;如果失败,则表示失败原因 * 每种返回类型都对应一个封装的结构体,该结构体其命名遵循规则:"Result" + "具体操作结果类型",结构体都包含两部分内容: * 第一部分为枚举类型ThriftResult变量result,表示操作结果,可以 表示成功,或失败,失败时给出失败原因 * 第二部分的变量名为value,表示返回结果的内容 *****************************************************************************************************/ enum ThriftResult { SUCCESS, /*成功*/ SERVER_UNWORKING, /*服务器处于非Working状态*/ NO_CONTENT, /*请求结果不存在*/ DATA_NOT_COMPLETE, /*数据不完全*/ PARAMETER_ERROR, /*参数错误*/ EXCEPTION, /*内部出现异常*/ INDEX_ERROR, /*错误的索引或者下标值*/ INNER_ERROR, /*内部错误*/ UNKNOWN_ERROR /*未知错误*/ } /*bool类型返回结果*/ struct ResultBool { 1: ThriftResult result, 2: bool value } /*int类型返回结果*/ struct ResultInt { 1: ThriftResult result, 2: i32 value } /*String类型返回结果*/ struct ResultStr { 1: ThriftResult result, 2: string value } /*long类型返回结果*/ struct ResultLong { 1: ThriftResult result, 2: i64 value } /*double类型返回结果*/ struct ResultDouble { 1: ThriftResult result, 2: double value } /*list<string>类型返回结果*/ struct ResultListStr { 1: ThriftResult result, 2: list<string> value } /*Set<string>类型返回结果*/ struct ResultSetStr { 1: ThriftResult result, 2: set<string> value } /*map<string,string>类型返回结果*/ struct ResultMapStrStr { 1: ThriftResult result, 2: map<string,string> value }
thrift_service.thrift文件中定义服务接口函数
namespace java com.wy.service.thriftservice include "thrift_datatype.thrift" service ThriftService { /*value中存放两个字符串拼接之后的字符串*/ thrift_datatype.ResultStr getStr(1:string srcStr1, 2:string srcStr2), thrift_datatype.ResultInt getInt(1:i32 val) }
二、thrift文件常见问题
- Thrift的服务器端和客户端使用的通信方式要一样,否则便无法进行正常通信
如果服务器端使用的工作模式为TNonblockingServer,在该工作模式下需要采用的传输方式为TFramedTransport,也就是在通信过程中会将tcp的字节流封装成一个个的帧,此时就需要客户端程序也这么做,否则便会通信失败。
ERROR [Thread-11] [AbstractNonblockingServer.java:348] - Read an invalid frame size of -2147418111. Are you using TFramedTransport on the client side?
2. 继承类的访问权限缩小
放大访问权限
Cannotreduce the visibility of the inherited method fromProcessFunction
3. 存在抽象函数
将抽象函数添加一个空的函数体
The typeTestThriftService.Processor<I>.getStr<I> must implement theinherited abstract methodProcessFunction
4. thrift客户端在调用期间独占连接
在多线程工作模式下要注意,Thrift的连接是为一个服务调用方所独占。因此为提高服务调用方的效率,如前文我们所做的将连接或对象进行池化。
三、thrift服务日志
1、 记录一次完整的RPC callback过程, 并输出完整的一行日志记录, 包括(时间点, 来源, 输入参数, 输出参数, 中间经历的子过程, 消耗时间)
2、引入logid, 作为多个服务之间调用唯一完整过程的依据
很好的参考思想:http://www.cnblogs.com/mumuxinfei/p/3876190.html?utm_source=tuicool&utm_medium=referral
由于本人经验有限,文章中难免会有错误,请浏览文章的您指正或有不同的观点共同探讨!
作者:三石雨
出处:http://www.cnblogs.com/exceptioneye
再烦,也别忘微笑;再急,也要注意语气。
再苦,也别忘坚持;再累,也要爱自己。
低调做人,你会一次比一次稳健;高调做事,你会一次比一次优秀。