由浅入深了解Thrift之结果封装

一、thrift返回结果封装

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

在项目中使用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文件常见问题

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

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

时间: 2025-01-21 19:54:52

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

由浅入深了解Thrift之服务化

一.问题描述 在上一篇<由浅入深了解Thrift之服务模型和序列化机制>文章中,我们已经了解了thrift的基本架构和网络服务模型的优缺点.如今的互联网圈中,RPC服务化的思想如火如荼.我们又该如何将thrift服务化应用到我们的项目中哪?实现thrift服务化前,我们先想想这几个问题:服务注册.服务发现.服务健康检测.服务“Load Balance”.隐藏client和server端的交互细节.服务调用端的对象池化. 服务的注册.发现和健康检测,我们使用zookeeper可以很好的解决 服务

由浅入深了解Thrift(二)

三.  Thrift的工作原理 1.普通的本地函数调用过程 例如,有如下关于本地函数的调用的java代码,在函数caller中调用函数getStr获取两个字符串的拼接结果: 代码3.1        本地函数调用调用方和被调用方都在一个程序内部,只是cpu在执行调用的时候切换去执行被调用的函数,执行完被调用函数之后,再切换回来执行调用之后的代码,其调用过程如下图3.1所示: 图3.1        站在调用方的角度,在本地函数调用过程中,执行被调用函数期间,调用方会被卡在那里一直等到被调用函数执

由浅入深了解Thrift(一)

一.  Thrift简单介绍 1.1.  Thrift是什么?能做什么? Thrift是Facebook于2007年开发的跨语言的rpc服框架,提供多语言的编译功能,并提供多种服务器工作模式:用户通过Thrift的IDL(接口定义语言)来描述接口函数及数据类型,然后通过Thrift的编译环境生成各种语言类型的接口文件,用户可以根据自己的需要采用不同的语言开发客户端代码和服务器端代码. 例如,我想开发一个快速计算的RPC服务,它主要通过接口函数getInt对外提供服务,这个RPC服务的getInt

由浅入深了解Thrift(三)

五.  Thrift服务器端几种工作模式分析与总结 Thrift为服务器端提供了多种工作模式,本文中将涉及以下5中工作模式:TSimpleServer.TNonblockingServer.THsHaServer.TThreadPoolServer.TThreadedSelectorServer,这5中工作模式的详细工作原理如下: 1.      TSimpleServer模式 TSimpleServer的工作模式只有一个工作线程,循环监听新请求的到来并完成对请求的处理,它只是在简单的演示时候使

Thrift框架介绍

1.前言 Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目.Thrift通过一个中间语言(IDL, 接口定义语言)来定义RPC的接口和数据类型,然后通过一个编译器生成不同语言的代码(目前支持C++,Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk和OCaml),并由生成的代码负责RPC协议层和传输层的实现. 2.架构 Thrift实际上是实现了

Thrift 的原理和使用

thrift 的原理和使用 Thrift 架构 Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目.Thrift通过IDL(Interface Definition Language,接口定义语言)来定义RPC(Remote Procedure Call,远程过程调用)的接口和数据类型,然后通过thrift编译器生成不同语言的代码(目前支持C++,Java, Python, PHP, Ruby, Erlang, Perl, Hask

Thrift架构介绍

Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目.Thrift通过一个中间语言(IDL, 接口定义语言)来定义RPC的接口和数据类型,然后通过一个编译器生成不同语言的代码(目前支持C++,Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk和OCaml),并由生成的代码负责RPC协议层和传输层的实现. 架构 Thrift实际上是实现了C/S模式,通

Thrift原理与使用实例

一 Thrift框架介绍 1 前言 Thrift是一个跨语言的服务部署框架,最初由Faceboo开发并进入Apache开源项目. Thrift特征如下: 1)Thrift有自己的跨机器通信框架,并提供一套库 2)Thrift是一个代码生成器,按照它的规则,可以生成多种编程语言的通信过程代码 Thrift通过中间语言(IDL, 接口定义语言)来定义RPC的接口和数据类型,然后通过一个编译器生成不同语言的代码(目前支持C++,Java, Python, PHP, Ruby, Erlang, Perl

Spark SQL CLI 实现分析

背景 本文主要介绍了Spark SQL里目前的CLI实现,代码之后肯定会有不少变动,所以我关注的是比较核心的逻辑.主要是对比了Hive CLI的实现方式,比较Spark SQL在哪块地方做了修改,哪些地方与Hive CLI是保持一致的.可以先看下总结一节里的内容. Spark SQL的hive-thriftserver项目里是其CLI实现代码,下面先说明Hive CLI的主要实现类和关系,再说明Spark SQL CLI的做法. Hive CLI 核心启动类是org.apache.hive.se