由浅入深了解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
由于本人经验有限,文章中难免会有错误,请浏览文章的您指正或有不同的观点共同探讨!
由浅入深了解Thrift之结果封装的更多相关文章
- 由浅入深了解Thrift之客户端连接池化续
前文<由浅入深了解Thrift之客户端连接池化>中我们已经实现了服务调用端 连接的池化,实现的过于简陋,离实际的项目运用还很遥远.本文将在进一步改造,主要是两方面:1.服务端如何注册多个服 ...
- 由浅入深了解Thrift之客户端连接池化
一.问题描述 在上一篇<由浅入深了解Thrift之服务模型和序列化机制>文章中,我们已经了解了thrift的基本架构和网络服务模型的优缺点.如今的互联网圈中,RPC服务化的思想如火如荼.我 ...
- 由浅入深了解Thrift(1,2,3)
由浅入深了解Thrift(一)——Thrift介绍与用法 由浅入深了解Thrift(二)——Thrift工作原理 由浅入深了解Thrift(三)——Thrift server端的几种工作模式分析
- 由浅入深了解Thrift之微服务化应用架构
为什么选择微服务 一般情况下,业务应用我们都会采用模块化的分层式架构,所有的业务逻辑代码最终会在一个代码库中并统一部署,我们称这种应用架构为单体应用. 单体应用的问题是,全部开发人员会共享一个代码库, ...
- 由浅入深了解Thrift之服务模型和序列化机制
一.Thrift介绍 Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎.其允许你定义一个简单的定义文件中的数据类型和服务接口.以作为输入文件,编 ...
- Thrift 的原理和使用
thrift 的原理和使用 Thrift 架构 Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目.Thrift通过IDL(Interf ...
- Thrift框架介绍
1.前言 Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目.Thrift通过一个中间语言(IDL, 接口定义语言)来定义RPC的接口和 ...
- Thrift原理与使用实例
一 Thrift框架介绍 1 前言 Thrift是一个跨语言的服务部署框架,最初由Faceboo开发并进入Apache开源项目. Thrift特征如下: 1)Thrift有自己的跨机器通信框架,并提供 ...
- 一个请求过来都经过了什么?(Thrift版)
一.背景 最初遇到这个问题是去58面试.部门领导是原同事,所以面试比较水.水到什么程度呢? 面试就是走个形式而已,不会不过的. 一面面试官就问了一个问题:“一个请求过来都经过了什么?” 剩下的全是闲 ...
随机推荐
- SQL语句基础之 管理数据库,表 和 数据
MySQL中的基本sql语句 MySQL中主要有三个大的对象,第一个是数据库,有了数据库后,我们才能在数据库里面建表,因为Mysql是关系数据库,它的数据都会以记录的形式存到表里,所以第二个是表,然后 ...
- hdu 4217 Data Structure?/treap
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4217 可用线段树写,效率要高点. 这道题以前用c语言写的treap水过了.. 现在接触了c++重写一遍 ...
- Windows server 2012清除并重建SID
首先介绍下什么是SID SID也就是安全标识符(Security Identifiers),是标识用户.组和计算机帐户的唯一的号码.在第一次创建该帐户时,将给网络上的每一个帐户发布一个唯一的 SID. ...
- 兼容sdk7&iOS7的issue解决小片段总结
ios7新增加的icon尺寸: 76 x 76:Size for iPad 2 and iPad mini (standard resolution) 120 x 120 :Size for iPho ...
- 混合使用C和C++
C++作为C语言的扩展集,几乎所有的C程序都可以在C++中编译和运行,但是要注意C程序中可能使用了C++中的关键字作为变量,比如在C中:int class = 0; 但这在C++中不行.出于方便性,我 ...
- 条款24:若所有的函数参数可能都需要发生类型转换才能使用,请采用non-member函数
假设有一个有理数类Rational,有一个计算有理数乘法的成员函数operator*,示例如下: #include <iostream> class Rational { public: ...
- SQL Server数据库学习笔记-概念数据模型
概念数据模型(Conceptual Data Model)也称为信息模型.它是对客观事物及其联系的抽象,用于信息世界的建模,是现实世界到信息世界的第一层抽象,是数据库设计人员进行数据库设计的有力工具. ...
- Python实现DBScan
Python实现DBScan 运行环境 Pyhton3 numpy(科学计算包) matplotlib(画图所需,不画图可不必) 计算过程 st=>start: 开始 e=>end: 结束 ...
- C++中的链表节点用模板类和用普通类来实现的区别
C++中的链表节点通常情况下类型都是一致的.因此我们可以用模板来实现. #include <iostream> using namespace std; template<typen ...
- Ant学习---第二节:Ant添加文件夹和文件夹集的使用
一.创建 java 项目(Eclipse 中),结构图如下: 1.创建 .java 文件,代码如下: package com.learn.ant; public class HelloWorld { ...