thrift中的概念
Thrift的网络栈
Apache Thrift的网络栈的简单表示如下:
+-------------------------------------------+
| Server |
| (single-threaded, event-driven etc) |
+-------------------------------------------+
| Processor |
| (compiler generated) |
+-------------------------------------------+
| Protocol |
| (JSON, compact etc) |
+-------------------------------------------+
| Transport |
| (raw TCP, HTTP etc) |
+-------------------------------------------+
Transport (传输)
传输层提供了一个用于向网络读写的简单抽象. 通过这种方式, thrift可以将下层的传输协议与thrift上层的其他部分((例如序列化和反序列化)分离.
下面是Transport接口提供的一些方法:
(1) open
(2) close
(3) read
(4) write
(5) flush
除了上面的Transport接口, Thrift还使用ServerTransport接口来接受或者生成基本的transport对象. 正如名字所建议的, ServerTransport主要用在服务端为新来的连接创建新的 Transport对象. 提供的方法如下:
(1) open
(2) listen
(3) accept
(4) close
绝大多数thrift支持的语言都可用的transport如下:
(1) file: 从硬盘中读写文件
(2) http: http网络通信
Protocol (协议)
Protocol用来定义内存中的数据结构如何使用下层的Transport来序列化和反序列化自身. 所以protocol实现用来控制编码模式, 以及用于序列化和反序列化. protocol的一些实例包括JSON, XML, plain text, 紧凑的二进制编码等.
下面是Protocol的接口:
writeMessageBegin(name, type, seq)
writeMessageEnd()
writeStructBegin(name)
writeStructEnd()
writeFieldBegin(name, type, id)
writeFieldEnd()
writeFieldStop()
writeMapBegin(ktype, vtype, size)
writeMapEnd()
writeListBegin(etype, size)
writeListEnd()
writeSetBegin(etype, size)
writeSetEnd()
writeBool(bool)
writeByte(byte)
writeI16(i16)
writeI32(i32)
writeI64(i64)
writeDouble(double)
writeString(string) name, type, seq = readMessageBegin()
readMessageEnd()
name = readStructBegin()
readStructEnd()
name, type, id = readFieldBegin()
readFieldEnd()
k, v, size = readMapBegin()
readMapEnd()
etype, size = readListBegin()
readListEnd()
etype, size = readSetBegin()
readSetEnd()
bool = readBool()
byte = readByte()
i16 = readI16()
i32 = readI32()
i64 = readI64()
double = readDouble()
string = readString()
Thrift Protocols是面向字节流设计的. 这里不需要进行显式的分片. 例如, 我们在序列化时, 不需要知道字符串的长度, 也不需要知道list的元素个数. 对于绝大多数thrift支持的语言都支持的Protocol(协议)有:
(1) binary: 很简单的二进制编码, 现将成员的长度和类型编码成字节, 然后跟上成员的实际值
(2) 紧凑的编码格式 (参考 https://issues.apache.org/jira/browse/THRIFT-110)
(3) json格式
Processor (处理单元)
一个Processor用来封装从输入流读取数据和向输出流写入数据的能力. 输入流和输出流使用Protocol对象来表示. Processor的接口很简单:
interface TProcessor {
bool process(TProtocol in, TProtocol out) throws TException
}
服务端特定的processor实现由编译器生成. Processor所做的是从输入protocol中读取数据, 然后将这些数据转交给handler(具体处理单元, 用户实现), 然后再将结果写入到输出protocol中.
Server
Server用来将上述特征聚集到一起:
(1) 创建一个基于Handler的Processor
(2) 创建一个transport
(3) 创建输入和输出协议(protocol)
基于上面的组员, 创建一个Server, 然后Server调用serve函数, 等待连接, 然后对请求进行处理.
参考示例 (C++):
class SharedServiceHandler : virtual public SharedServiceIf {
public:
SharedServiceHandler() {
// Your initialization goes here
} void getStruct(SharedStruct& _return, const int32_t key) {
// Your implementation goes here
printf("getStruct\n");
} }; int main(int argc, char **argv) {
int port = ;
shared_ptr<SharedServiceHandler> handler(new SharedServiceHandler());
shared_ptr<TProcessor> processor(new SharedServiceProcessor(handler));
shared_ptr<TServerTransport> serverTransport(new TServerSocket(port));
shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory());
shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory()); TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
server.serve();
return ;
}
thrift中的概念的更多相关文章
- Kanzi Studio中的概念
Kanzi Studio是Kanzi的UI编辑器,功能非常强大.在使用Kanzi Stadio之前,首先要先熟悉编辑器中的概念. Kanzi Studio中主要分project窗格,property窗 ...
- clearcase 中一些概念和操作
clearcase 中一些概念和操作 视图 常用命令 ClearCase 安装和使用的一些FAQ 参考 ClearCase具体的说是做配置管理的工具,只是SCM管理工具其中的一种.是RATIONAL公 ...
- maya 2014帮助手册中 三维概念讲解
maya 2014 帮助手册中 三维概念讲解 多边形简介 三个或更多的边, 顶点 边 面 组成 经常使用三边形或四边形来建模 n边形不常用 单个多边形称为面 多个面连接到 ...
- ThreadPoolExecutor源码学习(2)-- 在thrift中的应用
thrift作为一个从底到上除去业务逻辑代码,可以生成多种语言客户端以及服务器代码,涵盖了网络,IO,进程,线程管理的框架,着实庞大,不过它层次清晰,4层每层解决不同的问题,可以按需取用,相当方便. ...
- thrift中的超时(timeout)坑
最近在项目中采用thrift作为后台服务rpc框架,总体用下来性能还不错,跨语言特性使用起来也还行,但是也遇到了一些坑,其中之一就是超时问题(timeout),如果服务端些的某些业务场景耗时较长,th ...
- Thrift中实现按照时间戳范围操作Hbase数据
在一次做项目的过程中,要实现一个功能,功能描述为前端给定日期范围,在该日期范围内取出指定行的信息.在Thrift常用的API中,取出一行所有的数据接口为getVer(),getver()具体描述如下: ...
- javascript中重要概念-闭包-深入理解
在上次的分享中javascript--函数参数与闭包--详解,对闭包的解释不够深入.本人经过一段时间的学习,对闭包的概念又有了新的理解.于是便把学习的过程整理成文章,一是为了加深自己闭包的理解,二是给 ...
- C#中thrift 中THttpHandler 传输数据 慢 slow 解决办法
1. 在用c# 写thrift的服务端,来相应http请求,在用结构体传输时,会遇到一个问题,就是(在用网络)传输数据特别慢, 这是由于在发生数据是用的TStreamTransport 导致每传一个数 ...
- Android开发环境中的概念和工具介绍
最近学习Android开发,以前使用C/C++多一些,现在再补点Java知识,不管是哪种语言,都不过是一种工具而已,真的学起来,大同小异,无谓优劣.学习Android编程肯定是要先从环境搭建开始,无论 ...
随机推荐
- weui.js汉字乱码
2019-6-25 11:04:13 星期二 min.js 源文件中会自带乱码: 鍙栨秷: 取消; 纭畾: 确定; 方案: 把weui.js用notepad++打开, 搜索乱码字符, 替换掉, ...
- asp.netcore 高并发下使用HttpClient的方法
大家都知道,使用HttpClient,在并发量不大的情况,一般没有任何问题:但是在并发量一上去,如果使用不当,会造成很严重的堵塞的情况. 解决方案如下: 一.可以参考微软官方提供的方法:https:/ ...
- zookeeper+Dubbo环境搭建及简单Demo
1 安装zk https://www.cnblogs.com/feifeicui/p/11175502.html 2 安装 dubbo-admin https://www.cnblogs.com/fe ...
- nginx安装和命令
1. nginx安装 1.1 mac上安装 brew search nginx brew install nginx 1.2 windows上安装 下载nginx.zip,解压到D盘,发送快捷方式到桌 ...
- (转) 解决django项目部署到nginx+uwsgi服务器后 admin页面样式消失的问题
原贴地址:https://blog.csdn.net/qq_42571805/article/details/80862455 摘要 uwsgi为主要服务器,nginx为反向代理服务器部署完成之后发现 ...
- 湖南省第十三届大学生计算机程序设计竞赛 Football Training Camp 贪心
2007: Football Training Camp[原创-转载请说明] Submit Page Summary Time Limit: 1 Sec Memory Limit: 1 ...
- Android EditText禁止回车换行
在做一个登录页面的时候,发现了输入手机号的EditText可以输入回车的bug,影响用户体验,在此分享下解决办法. 百度了很多,都是设置singline=true的或者设置maxLines=" ...
- 【记录】【MySQL】填充字符串函数 LPAD(str,len,padstr)
LPAD(str,len,padstr) 1.如果str的长度等于len,那么就返回str 2.如果str的长度大于len,那么就返回str的前len个长度 3.如果str的长度小于len,那么就返回 ...
- npm与yarn命令
npm 1. 查看npm版本 node -v npm -v 2. 更新npm至最新版 npm install npm@latest -g 3. npm install:安装依赖 # 在本地node_m ...
- Linux内核--伙伴系统--页释放
本文转载自:http://www.cnblogs.com/tolimit/ 感觉原博分析的不错,借花献佛. ---------------------------------------------- ...