介绍:

轻量级、跨语言。

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

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. day03--实际操作演示linux系统挂载过程

    # 第一步骤: 拥有一个存储设备-光驱,使光驱加载光盘 # 第二步骤: 在linux系统中找到光驱设备 ls -l /dev/cdrom # 第三步骤: 需要将存储设备进行 挂载 挂载命令语法格式: ...

  2. 【Azure Data Lake Storage】如何才能保留Blob中的文件目录结构(即使文件夹中文件数量为0的情况下)?

    问题描述 在使用Azure Storage Account Blob时候,发现当文件夹中的Blob(文件)被全部输出后,文件夹也会消失? 为什么它不能像Windows系统中的文件夹一样,即使是一个空文 ...

  3. 【Azure 微服务】新创建的Service Fabric集群,如何从本地机器上连接到Service Fabric Explorer(Service Fabric状态/错误查看工具)呢?

    问题描述 当在Azure中成功创建一个Service Fabric Cluster 服务后,我们能够在它的Overview页面中发现 Service Fabric Explorer的终结点,但是打开后 ...

  4. [linux 爬坑] 几个linux发行版尝试和令人崩溃的ssr安装体验

    最近电脑上的manjaro好像出了问题,长时间不用就会死机.也懒得追究原因了,正好决定尝试几个发行版.首先尝试安装银河麒麟    这个发行版实际上就是ubuntu,甚至源什么的都是ubuntu的,也不 ...

  5. 5. JVM虚拟机栈

    1.概述 说到jvm 其中让人印象最深的就是栈和堆,也是 jvm中占用内存最大的两个地方. 从宏观上来看栈是运行时的单位,而堆是存储的单位 ,栈解决程序的运行问题,即程序如何执行,或者说如何处理数据. ...

  6. 2、zookeeper的简单命令

    Zookeeper的常用命令本篇不包括权限acl相关以及集群相关,那些要另开篇章.使用的版本是Zookeeper3.4.14,不同版本会有一定的差异性. 节点的存储信息 新增命令 语法:create ...

  7. [笔记]git pull vs git pull --rebase

    git pull vs git pull -rebase 背景 最近在实际开发过程,之前一直使用git pull 去更新该分支的代码,之前认为一旦pull 操作产生新的节点是对合并操作的一个记录,但是 ...

  8. FreeRTOS教程2 任务管理

    1.准备材料 正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP仿真器 XCO ...

  9. Zabbix“专家坐诊”第179期问答汇总

    欢迎大家加入乐维社区zabbix问答专栏,除了在论坛发帖求问外,还可以在QQ群里交流进步,并且每周三我们会进行免费的技术答疑活动. 问题一: Q:Zabbix alert syncer process ...

  10. vim技巧--提取文本与文本替换

    前几天遇到一个使用情景,需要从一个包含各个读取代码文件路径及名字的文件中把文件路径提取出来,做一个filelist,这里用到了文本的提取和替换,这里做个小总结记录一下. 从网上找了一个作者写的代码用来 ...