Apache Thrift 白皮书
介绍:
轻量级、跨语言。
简洁的抽象和实现:数据传输、序列化、应用逻辑处理。
IDL及代码生成系统。
基本架构图如下:
28种语言支持:28 programming languages。
支持客户端及服务端版本非原子性升级。
一、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 白皮书的更多相关文章
- Apache thrift RPC 双向通信
在上一篇介绍Apache thrift 安装和使用,写了一个简单的demo,讲解thrift服务的发布和客户端调用,但只是单向的客户端发送消息,服务端接收消息.而客户端却得不到服务器的响应. 在不涉及 ...
- Apache Thrift 跨语言服务开发框架
Apache Thrift 是一种支持多种编程语言的远程服务调用框架,由 Facebook 于 2007 年开发,并于 2008 年进入 Apache 开源项目管理.Apache Thrift 通过 ...
- Apache Thrift 环境配置
在 Ubuntu 14.04 下Apache Thrift 的安装方法: 1安装依赖包 sudo apt-get install libboost-dev libboost-test-dev libb ...
- Apache Thrift 服务开发框架学习记录
Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架. 前言: 目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Servic ...
- Apache Thrift
Baidu Thrift Google Thrift Apache Thrift - 可伸缩的跨语言服务开发框架
- Apache Thrift - 可伸缩的跨语言服务开发框架
To put it simply, Apache Thrift is a binary communication protocol 原文地址:http://www.ibm.com/developer ...
- Apache Thrift学习之二(基础及原理)
Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架.本文将从 Java 开发人员角度详细介绍 Apache Thrift 的架构.开发和部署,并且 ...
- Apache Thrift学习之一(入门及Java实例演示)
目录: 概述 下载配置 基本概念 数据类型 服务端编码基本步骤 客户端编码基本步骤 数据传输协议 实例演示(java) thrift生成代码 实现接口Iface TSimpleServer服务模型 T ...
- Apache Thrift入门(安装、测试与java程序编写)
安装Apache Thrift ubuntu linux运行: #!/bin/bash #下载 wget http://mirrors.cnnic.cn/apache/thrift/0.9.1/thr ...
- Apache Thrift的简单使用
Apache Thrift的简单使用 ---------------------- 1. 简介 Thrift是Facebook的一个开源项目,主要是一个跨语言的服务开发框架.它有一个代码生成器来对它所 ...
随机推荐
- Kafka集群搭建与SpringBoot项目集成
本篇文章的目的是帮助Kafka初学者快速搭建一个Kafka集群,以及怎么在SpringBoot项目中使用Kafka. kafka集群环境包地址:https://pan.baidu.com/s/1Mar ...
- 多线程系列(七) -ThreadLocal 用法及内存泄露分析
一.简介 在 Java web 项目中,想必很多的同学对ThreadLocal这个类并不陌生,它最常用的应用场景就是用来做对象的跨层传递,避免多次传递,打破层次之间的约束. 比如下面这个HttpSer ...
- Go语言并发编程(3):sync包介绍和使用(上)-Mutex,RWMutex,WaitGroup,sync.Map
一.sync 包简介 在并发编程中,为了解决竞争条件问题,Go 语言提供了 sync 标准包,它提供了基本的同步原语,例如互斥锁.读写锁等. sync 包使用建议: 除了 Once 和 WaitGro ...
- 一次nginx返回422状态码的经历
故事背景 后端使用Docker Compose部署一个代码片段管理应用:snibox,某天因为云服务卡死重启之后再次访问时,登录或退出都返回422状态码. 界面提示如下: 不过奇怪的是:直接通过IP+ ...
- 可视化学习:使用WebGL实现网格背景
前言 作为前端开发人员,我们最关注的就是应用的交互体验,而元素背景是最基础的交互体验之一.一般而言,能够使用代码实现的界面,我们都会尽可能减少图片的使用,这主要是有几方面的原因,第一,是图片会消耗更多 ...
- 学习ASP.NET Core Blazor编程系列文章之目录
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- org.jetbrains.idea.maven - com.google.inject.CreationException: Unable to create injector, see the following errors-导入maven项目报错
一.问题由来 最近准备更换Java开发工具,以前是使用Eclipse,现在准备换成号称Java开发神器的IntelliJ IDEA .在同事那里找到安装包后, 安装,导入需要的文件等等,一切都进行得很 ...
- vscode 文件上传快捷键 shift+alt+s (ftp专用)插件用的 ftp-sync
vscode 文件上传快捷键 shift+alt+s (ftp专用)插件用的 ftp-sync { "key": "shift+alt+s", "co ...
- openlayers.org 百度地图 静态化 同类产品
openlayers 官网 https://openlayers.org/ 发现不好打开,修改dns 114.114.114.114 202.99.104.68 打开快了许多 https://blog ...
- FFmpeg命令行之FFmpeg 采集设备
在使用 FFmpeg 作为编码器时,可以使用FFmpeg采集本地的音视频采集设备的数据,然后进行编码.封装.传输等操作. 例如,我们可以采集摄像头的图像作为视频,采集麦克风的数据作为音频,然后对采集的 ...