介绍:

轻量级、跨语言。

简洁的抽象和实现:数据传输、序列化、应用逻辑处理。

IDL及代码生成系统。

基本架构图如下:

28种语言支持:28 programming languages

支持客户端及服务端版本非原子性升级。

Thrift whitepaper

一、IDL

1、基本数据类型:

• bool A boolean value, true or false

• byte A signed byte

• i16 A 16-bit signed integer

• i32 A 32-bit signed integer

• i64 A 64-bit signed integer

• double A 64-bit floating point number

• string An encoding-agnostic text or binary string

2、Structs:通用对象

等同于面向对象语言中的类。

struct Example {

1:i32 number=10,

2:i64 bigNumber

}

3、Containers 容器:

list<>、set<>、map<,>

4、Exceptions 异常:

等同于Structs,区别定义。

5、Services 服务定义:

等同于接口定义(或面型对象语言中的虚拟类)。

基本定义:

service <service-name> {

<return-type> <method-name>() [throws (<exceptions>)]

...

}

示例:

service StringCache {

void set(1:i32 key, 2:string value),

string get(1:i32 key) throws (1:KeyNotFound knf),

void delete(1:i32 key)

}

二、Transport

数据传输

1、接口 TTransport:代码生层及数据传输解耦,主要方法定义如下

• open Opens the tranpsort

• close Closes the tranport

• isOpen Indicates whether the transport is open

• read Reads from the transport

• write Writes to the transport

• flush Forces any pending writes

TServerTransport:接受或创建Transport对象。

2、实现

TSocket:TCP/IP数据流操作。

TFileTransport:文件系统数据流操作。

扩展:TBufferedTransport(提供读写buffer缓冲)、TFramedTransport(提供帧大小头信息,用以批数据传输或非阻塞操作)、TMemoryBuffer(直接从堆栈中读写)

三、Protocol

数据结构和数据传输解耦。

1、接口,双向消息序列化反序列化,基本方法如下:

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()

2、...

四、RPC实现

1、TProcessor

基本定义:

interface TProcessor {

bool process(TProtocol in, TProtocol out) throws TException

}

任何复杂的系统简而来说节课分为两个端客户端、服务端,用于处理输入输出。

process() 用于处理方法调用逻辑。

2、TServer

基本处理逻辑:

->使用TServerTransport接受TTransport

->使用TTransportFactory转换TTransport为实际应用的类型(通常应用TBufferedTransportFactory)

->使用TProtocolFactory为TTransport创建输入输出

->调用TProcessor process()逻辑

server处理连接;processor处理RPC逻辑。

不同实现:

TSimpleServer:单处理线程

TThreadedServer:每个连接一个处理线程

TThreadPoolServer:线程池处理

五、实现细节

。。。

Apache Thrift 白皮书的更多相关文章

  1. Apache thrift RPC 双向通信

    在上一篇介绍Apache thrift 安装和使用,写了一个简单的demo,讲解thrift服务的发布和客户端调用,但只是单向的客户端发送消息,服务端接收消息.而客户端却得不到服务器的响应. 在不涉及 ...

  2. Apache Thrift 跨语言服务开发框架

    Apache Thrift 是一种支持多种编程语言的远程服务调用框架,由 Facebook 于 2007 年开发,并于 2008 年进入 Apache 开源项目管理.Apache Thrift 通过 ...

  3. Apache Thrift 环境配置

    在 Ubuntu 14.04 下Apache Thrift 的安装方法: 1安装依赖包 sudo apt-get install libboost-dev libboost-test-dev libb ...

  4. Apache Thrift 服务开发框架学习记录

    Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架. 前言: 目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Servic ...

  5. Apache Thrift

    Baidu Thrift  Google Thrift Apache Thrift - 可伸缩的跨语言服务开发框架

  6. Apache Thrift - 可伸缩的跨语言服务开发框架

    To put it simply, Apache Thrift is a binary communication protocol 原文地址:http://www.ibm.com/developer ...

  7. Apache Thrift学习之二(基础及原理)

    Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架.本文将从 Java 开发人员角度详细介绍 Apache Thrift 的架构.开发和部署,并且 ...

  8. Apache Thrift学习之一(入门及Java实例演示)

    目录: 概述 下载配置 基本概念 数据类型 服务端编码基本步骤 客户端编码基本步骤 数据传输协议 实例演示(java) thrift生成代码 实现接口Iface TSimpleServer服务模型 T ...

  9. Apache Thrift入门(安装、测试与java程序编写)

    安装Apache Thrift ubuntu linux运行: #!/bin/bash #下载 wget http://mirrors.cnnic.cn/apache/thrift/0.9.1/thr ...

  10. Apache Thrift的简单使用

    Apache Thrift的简单使用 ---------------------- 1. 简介 Thrift是Facebook的一个开源项目,主要是一个跨语言的服务开发框架.它有一个代码生成器来对它所 ...

随机推荐

  1. C++ { } 的使用场景

    {} 可以用于初始化 C++11 中的变量,就像它们用于初始化 C 中的数组和结构一样. {} 主要是为了提供语法的一致性(使用 {} 初始化将在所有上下文中都有效,而使用赋值运算符或()初始化将在特 ...

  2. 50从零开始用Rust编写nginx,原来TLS证书还可以这么申请

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 负载均衡, 静态文件服务器,websocket代理,四层TCP/UDP转发,内网穿透等,会将实 ...

  3. beego中数据库表创建

    package main import ( "fmt" "github.com/astaxie/beego/orm" _ "github.com/go ...

  4. Simulink模型指标分析与模型重构的最佳实践 - 软件模型质量保证不可忽视的一环

    在基于模型的开发中,优质的模型架构是生成优质代码的必要前提.静态模型分析对于模型的质量保证有着至关重要的作用,同时建模规范已在业内有着广泛而成熟的应用.然而建模规范并非模型设计原则合规性的唯一考量标准 ...

  5. 学会了MySql高级查询让你在工作中游刃有余

    一.单元概述 通过本章的学习能够理解MySQL数据库中分组查询的含义,掌握常用分组函数的使用,掌握GROUP BY子句的使用规则,掌握分组后数据结果的条件过滤,掌握SELECT语句执行过程,理解子查询 ...

  6. 【Azure API 管理】Azure API Management通过请求中的Path来限定其被访问的频率(如1秒一次)

    问题描述 Azure API Management 是否可以通过请求中的Path来限定其被访问的频率? 在系统Request中发现某个Path 在短时间内被频繁的调用,影响了后台服务的性能及安全,所以 ...

  7. 【专业技能】程序员的软件工程素养之画好 UML 时序图

    目录 前言 一.认识时序图 1.1时序图元素 1.2怎么使用 二.画好时序图 2.1一般步骤 2.2举个例子 2.3推荐工具 三.其它作用 四.文章小结 前言 笔者在本科的时候上过软件工程的专业课,也 ...

  8. multiple definition of `MainWindow::MainWindow(QWidget*)

    qt刚建好工程运行的时候没问题,后面写了一点东西之后,再运行就发现出现MainWindow重复,我不理解. 解决方法:删除重复的引用. 再重新构建一下就好了.

  9. springboot,简要记录,方便复习,

    boot 笔记第一步新建工程,导包,由于boot的数据库框架是用mybtis -paus,所以关于数据库系统那儿不用色选mybatis ,需要重新maven导包完整导包以下人容: <?xml v ...

  10. 一文学会JDBC实现java和mySQL的数据连接(尚硅谷学习课程代码+笔记+思路总结)

    JDBC是指数据库连接技术,用于java连接mySQL等数据库.本文详细介绍了尚硅谷课程中JDBC的学习内容和补充知识. 概述 java语言只提供规范接口,存在于java.sql.javax.sql包 ...