一、thrift返回结果封装

  1. Thrift文件添加版本号,方便对thrift的版本进行控制
  2. 服务与返回的数据类型分开定义

在项目中使用Thrift提供RPC服务时,很多情况下我们都会将返回的结果进行封装和定义需要自己数据结构。为增加thrift文件的易读性,我们将数据结构和服务分开定义到不通的文件中 。通过这种方式,为调用方提供友好的使用体验。

thrift_datatype.thrift中定义数据类型:

  1. namespace java com.wy.service.thriftdatatype
  2. /*thrift版本控制*/
  3. const string VERSION = "1.0.1"
  4.  
  5. /*为ThriftResult添加数据不完全和内部错误两种类型*/
  6. /****************************************************************************************************
  7. * 定义返回值:
  8. * 枚举类型ThriftResult,表示返回结果,成功或失败;如果失败,则表示失败原因
  9. * 每种返回类型都对应一个封装的结构体,该结构体其命名遵循规则:"Result" + "具体操作结果类型",结构体都包含两部分内容:
  10. * 第一部分为枚举类型ThriftResult变量result,表示操作结果,可以 表示成功,或失败,失败时给出失败原因
  11. * 第二部分的变量名为value,表示返回结果的内容
  12. *****************************************************************************************************/
  13. enum ThriftResult
  14. {
  15. SUCCESS, /*成功*/
  16. SERVER_UNWORKING, /*服务器处于非Working状态*/
  17. NO_CONTENT, /*请求结果不存在*/
  18. DATA_NOT_COMPLETE, /*数据不完全*/
  19. PARAMETER_ERROR, /*参数错误*/
  20. EXCEPTION, /*内部出现异常*/
  21. INDEX_ERROR, /*错误的索引或者下标值*/
  22. INNER_ERROR, /*内部错误*/
  23. UNKNOWN_ERROR /*未知错误*/
  24. }
  25.  
  26. /*bool类型返回结果*/
  27. struct ResultBool
  28. {
  29. 1: ThriftResult result,
  30. 2: bool value
  31. }
  32.  
  33. /*int类型返回结果*/
  34. struct ResultInt
  35. {
  36. 1: ThriftResult result,
  37. 2: i32 value
  38. }
  39.  
  40. /*String类型返回结果*/
  41. struct ResultStr
  42. {
  43. 1: ThriftResult result,
  44. 2: string value
  45. }
  46.  
  47. /*long类型返回结果*/
  48. struct ResultLong
  49. {
  50. 1: ThriftResult result,
  51. 2: i64 value
  52. }
  53.  
  54. /*double类型返回结果*/
  55. struct ResultDouble
  56. {
  57. 1: ThriftResult result,
  58. 2: double value
  59. }
  60.  
  61. /*list<string>类型返回结果*/
  62. struct ResultListStr
  63. {
  64. 1: ThriftResult result,
  65. 2: list<string> value
  66. }
  67.  
  68. /*Set<string>类型返回结果*/
  69. struct ResultSetStr
  70. {
  71. 1: ThriftResult result,
  72. 2: set<string> value
  73. }
  74.  
  75. /*map<string,string>类型返回结果*/
  76. struct ResultMapStrStr
  77. {
  78. 1: ThriftResult result,
  79. 2: map<string,string> value
  80. }

thrift_service.thrift文件中定义服务接口函数

  1. namespace java com.wy.service.thriftservice
  2.  
  3. include "thrift_datatype.thrift"
  4.  
  5. service ThriftService
  6. {
  7. /*value中存放两个字符串拼接之后的字符串*/
  8. thrift_datatype.ResultStr getStr(1:string srcStr1, 2:string srcStr2),
  9. thrift_datatype.ResultInt getInt(1:i32 val)
  10. }

二、thrift文件常见问题

  1. Thrift的服务器端和客户端使用的通信方式要一样,否则便无法进行正常通信

如果服务器端使用的工作模式为TNonblockingServer,在该工作模式下需要采用的传输方式为TFramedTransport,也就是在通信过程中会将tcp的字节流封装成一个个的帧,此时就需要客户端程序也这么做,否则便会通信失败。

  1. ERROR [Thread-11] [AbstractNonblockingServer.java:348] - Read an invalid frame size of -2147418111. Are you using TFramedTransport on the client side?

2.  继承类的访问权限缩小

放大访问权限

  1. Cannotreduce the visibility of the inherited method fromProcessFunction

3.  存在抽象函数

将抽象函数添加一个空的函数体

  1. 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

由于本人经验有限,文章中难免会有错误,请浏览文章的您指正或有不同的观点共同探讨!

由浅入深了解Thrift之结果封装的更多相关文章

  1. 由浅入深了解Thrift之客户端连接池化续

    前文<由浅入深了解Thrift之客户端连接池化>中我们已经实现了服务调用端 连接的池化,实现的过于简陋,离实际的项目运用还很遥远.本文将在进一步改造,主要是两方面:1.服务端如何注册多个服 ...

  2. 由浅入深了解Thrift之客户端连接池化

    一.问题描述 在上一篇<由浅入深了解Thrift之服务模型和序列化机制>文章中,我们已经了解了thrift的基本架构和网络服务模型的优缺点.如今的互联网圈中,RPC服务化的思想如火如荼.我 ...

  3. 由浅入深了解Thrift(1,2,3)

    由浅入深了解Thrift(一)——Thrift介绍与用法 由浅入深了解Thrift(二)——Thrift工作原理 由浅入深了解Thrift(三)——Thrift server端的几种工作模式分析

  4. 由浅入深了解Thrift之微服务化应用架构

    为什么选择微服务 一般情况下,业务应用我们都会采用模块化的分层式架构,所有的业务逻辑代码最终会在一个代码库中并统一部署,我们称这种应用架构为单体应用. 单体应用的问题是,全部开发人员会共享一个代码库, ...

  5. 由浅入深了解Thrift之服务模型和序列化机制

    一.Thrift介绍 Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎.其允许你定义一个简单的定义文件中的数据类型和服务接口.以作为输入文件,编 ...

  6. Thrift 的原理和使用

    thrift 的原理和使用 Thrift 架构 Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目.Thrift通过IDL(Interf ...

  7. Thrift框架介绍

    1.前言 Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目.Thrift通过一个中间语言(IDL, 接口定义语言)来定义RPC的接口和 ...

  8. Thrift原理与使用实例

    一 Thrift框架介绍 1 前言 Thrift是一个跨语言的服务部署框架,最初由Faceboo开发并进入Apache开源项目. Thrift特征如下: 1)Thrift有自己的跨机器通信框架,并提供 ...

  9. 一个请求过来都经过了什么?(Thrift版)

    一.背景 最初遇到这个问题是去58面试.部门领导是原同事,所以面试比较水.水到什么程度呢? 面试就是走个形式而已,不会不过的. 一面面试官就问了一个问题:“一个请求过来都经过了什么?”  剩下的全是闲 ...

随机推荐

  1. 浅谈objective—C管理内存

    这段时间被导师催着论文,调试各种BUg,也是醉了,发现很大程度上,内存出错,栈溢出,各种悲剧.那么今天就和大家一起对OC的内存管理来个探微吧.Objective-C使用一个保留计数记录了我们所创建的所 ...

  2. oracle 临时表空间

    环境: OS: Oracle Linux Server release 5.7 DB: Oracle Database 11g Enterprise Edition Release 11.2.0.3. ...

  3. AppCan移动技术全景图:创新、协作、支撑

    开发者是移动互联网宏伟蓝图的最终实现者.如果你有创意.有技术,你可以开发一款服务上亿人的应用.所以,我感觉幸运,没有任何一个时代,能像现在这么好,技术人能够服务这么广大的市场,能够撬动百亿级的市场. ...

  4. HTML5七大优势“逼宫”APP

    HTML5颠覆了PC互联网的格局,优化了移动互联网的体验,接下来几年,HTML5将颠覆原生App世界. 跨平台: 在多屏年代,开发者的痛苦指数非常高,人人都期盼HTML5能扮演救星.多套代码.不同技术 ...

  5. [iOS]深入浅出 iOS 之多线程 NSThread

    OS 支持多个层次的多线程 编程,层次越高的抽象程度越高,使用起来也越方便,也是苹果最推荐使用的方法.     下面简要说明这三种不同范式:  Thread 是这三种范式里面相对轻量级的,但也是使用起 ...

  6. 数据持久化-Plist文件写入

    数据持久化,常见4种:归档,plist文件,sqlite,coreData.今天复习的是plist文件读写. // // ViewController.m // Test_Plist // // Cr ...

  7. 使用 PHP cURL 提交 JSON 数据

    http://www.oschina.net/code/snippet_54100_7351 http://www.lornajane.net/posts/2011/posting-json-data ...

  8. LoadRunner - 实战,转发

    最近几天一直在读代震军的博客,他是Discuz!NT的设计者,读了他的一系列关于 Discuz!NT的架构设计文章,大呼过瘾,特别是Discuz!NT在解决高访问高并发时所设计的一系列方案,本人尤其感 ...

  9. 16.如何设置Quartus II Programmer,保护pof不被读出

    Program时,把security bit勾上,点击start 这样examine时就不能正确的读出pof 读出来的pof 除文件头外,其余的内容全为0 怎么样,大家试试!

  10. 11.Warning (332060): Node: pi_fck3p was determined to be a clock but was found without an associated clock assignment.

    解释及措施:(1):这个信号是不是你期望的时钟信号?还是被综合器误将普通信号综合成了时钟信号?有没有在代码中用过这个信号的上升沿/下降沿? (2):如果是期望的时钟信号,那么是否有可能调整管脚位置约束 ...