thrift原理浅析

wx62a6c3f71e775 wx62a6c3f71e775     2022-11-28     426

关键词:

RPC 原理

RPC( Remote Procedure Call ) 远程调用过程。

1. 定义了一个接口文件,描述了对象,对象成员,接口方法等一系列信息。
2.通过RPC 框架提供的编译器,将接口说明文件编译成对应的语言文件。
2. 在客户端和服务端分别引用 RPC 编译器生成的文件,即可像调用本地方法一样远程调用。

RPC 通信过程如下:thrift

1. 客户端以正常方式调用客户桩(client stub)
2. 客户桩生成一个消息,然后调用本地操作系统。
3. 客户端操作系统将消息发送给原程操作系统。
4. 远程操作系统将消息交给服务器桩
5. 服务器桩将参数提取出来,然后调用服务过程
6. 服务器执行要求的操作,操作完成后将结果返回给服务器桩,
7. 服务器桩将结果打包成一个消息, 然后调用本地操作系统。
8. 服务器操作系统将含有结果的消息发送给客户端操作系统
9. 客户端操作系统将消息交给客户桩
10. 客户桩将结果提取出来,返回给他的调用方
  • 资源粒度, RPC 调用类似于本地调用,RESTful API 每一次添加接口都可能需要额外开发接口的数据,这相当于应用视图中再写一次方法调用。
  • 流量消耗,RestFull API 在应用层和使用 HTTP 协议, 即使是传输高效的 JSON 也会消耗较大流量, RPC 可以使用 TCP,也可以使用 UDP , 而且可以编码,降低数据大小和减少流量消耗。

Thrift 架构

Thrift 作用于各个服务之间的 RPC 通信,支持跨语言,thrift 是一个典型的 CS 框架,客户端服务端可以使用不同的语言开发, thrift  通过 IDL (Interface Description Language) 来关联客户端和服务器。

Thrift 整体架构

thrift在这里插入图片描述

  • your code 是业务逻辑代码
  • FooService.Client /Foo.Processor() + Foo.Write() Foo.Read是 thrift 根据 IDL  生成的客户端和服务端代码,对应的是 RPC 中的 Client Stub 和 Server Stub
  • TProtocol 是用来对数据进行序列化和反序列化。
  • TTransport 提供传输数据功能,使用 Apache Thrift 可以方便的定义一个服务并选择不同的传输协议。

Thrift 网络栈架构

thrift在这里插入图片描述

TTransport 层

  • TSocket :阻塞 Socket
  • TFrametransport :以 frame 为单位进行传输, 非阻塞式服务中使用
  • TFileTransport : 以文件形式进行传输

TProtocol 层

代表 thrift 客户端和服务端之间的传输数据的协议,指的是客户端和服务端传输数据的格式,比如 Json,  thrift 中有如下格式:

  • TBinaryProtocol:二进制格式
  • TCompactProtocol:压缩格式
  • TJSONProtocol : Json 格式
  • TSimpleJsonProtocol:提供只写的 JSON 协议

Thrift 支持的 Server 模型

  • TSimpleServer :用于简单的单线程模型,常用于测试
  • TThreadPoolServer :多线程模型,使用标准的阻塞 IO
  • TNoBlockingServer: 多线程服务模型,使用非阻塞 IO,需要使用TFramedTransport 数据传输方式。
  • THsHaServer : THsHa 引入了线程池去处理,其模型读写任务放到线程池去处理,Half-sync/Half-async处理模式,Half-async是在处理IO事件上(accept/read/write io),Half-sync用于handler对rpc的同步处理;

Thrift  支持的基本数据类型

  • byte: 有符号字节
  • i16: 16 位有符号整数
  • i32 : 32 位有符号整数
  • i64: 64 位有符号整数
  • double : 64 位浮点数
  • string : 字符串

Thrift 支持的容器类型

  • list:一系列由 T 类型的数据组成的有序列表, 元素可以重复
  • set : 一系列由 T 类型组成的无序集合,元素不可以重复
  • map: 一个字典结构,Key 为 K 类型, Value 为 V 类型,和 Java 中的 HashMap 类似

thrift 支持 struct 类型,可以将一些数据类型聚合到一块。

struct People 
1:string name;
2:i32 age;
3:string gender;

thrift 支持枚举类型

enum Gender 
MALE,
FEMALE

thrift 支持异常类型

exception RequestException 
1:i32 code;
2:string reason;

thrift 定义 Service. 格式如下:

service HelloWorldService 
// service中可以定义若干个服务,相当于Java Interface中定义的方法
string doAction(1:string name, 2:i32 age);

thrift 支持给类型定义别名

typedef i32 int
typedef i64 long

thrift. 支持常量的定义

const i32 MAX_RETRIES_TIME = 10;
const string MY_WEBSITE = "http://facebook.com";

thrift 支持命名空间,相当于 Java 中的package.

namespace java com.test.thrift.demo

#、//、/**/都可以作为thrift文件中的注释。

thrift提供两个关键字required和optional,分别用于表示对应的字段是必填的还是可选的(推荐尽量使用optional),如下

struct People 
1:required string name;
2:optional i32 age;

thrift也支持文件包含,相当于CPP中的include,Java中的import,使用关键字include:

include "global.thrift"

thrift IDL 例子

// data.thrift
namespace java thrift.generated
namespace py py.thrift.generated

typedef i16 short
typedef i32 int
typedef i64 long
typedef bool boolean
typedef string String

// struct关键字用于定义结构体,相当于面向对象编程语言中的类
struct Person
// 相当于定义类中的成员,并生成相应的get和set方法,optional表示username这个成员可以没有
1: optional String username,
2: optional int age,
3: optional boolean married


// 定义一个异常类型,用于接口中可能抛出的异常
exception DataException
1: optional String message,
2: optional String callStack,
3: optional String date


// 定义服务接口
service PersonService
Person getPersonByUsername(1: required String username) throws (1: DataException data),
void savePerson(1: required Person person)

执行 thrift --gen java src/thrift/data.thrift  生成代码.

thrift 如何安装

客户端可以像调用本地的方法一样调用服务端的方法

生成代码结构如下:thrift


欢迎关注公众号:程序员开发者社区

thrift

微信号:程序员开发者社区

博客:王小明

关注我们,了解更多





浅析typescriptcompiler原理

等多种发展方向供员工选择,并辅以提供相应的技术力、专业力、通用力、领导力等培训课程。奇舞团以开放和求贤的心态欢迎各种优秀人才关注和加入奇舞团。 查看详情

springboot自动配置原理浅析(代码片段)

springboot自动配置原理浅析springboot版本2.5.5注解@SpringBootApplication的源码:@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConfiguration@E 查看详情

c++函数重载实现原理浅析(代码片段)

---------------------------------------------------献给所有和我一样还没拿到office的同学-----------------------------------------------------------------------------------                                              查看详情

sparkcoretaskscheduler源代码与任务提交原理浅析2

引言上一节《TaskScheduler源代码与任务提交原理浅析1》介绍了TaskScheduler的创建过程,在这一节中,我将承接《Stage生成和Stage源代码浅析》中的submitMissingTasks函数继续介绍task的创建和分发工作。DAGScheduler中的submitMissingTasks函数假... 查看详情

hashmap原理浅析

  HashMap概述  HashMap是基于哈希表和Map实现来的,它提供所有可选的映射方式,可以允许使用null键,除了不同步和允许使用null键之外,HashMap和HashTable基本上相同。因此HashMap是非线程安全的,如果想要实现线程安全,可以使... 查看详情

浅析bootstrap原理及优缺点

网格系统的实现原理,是通过定义容器大小,平分12份(也有平分成24份或32份,但12份是最常见的),再调整内外边距,最后结合媒体查询,就制作出了强大的响应式网格系统 网格系统的实现原理,是通过定义容器大小,平分12... 查看详情

leakcanary核心原理源码浅析

网上大牛太多,不敢说分析,也不敢装成大大,所以只能是浅析…那么今天这篇主要解决什么问题呢?其实就一个问题,LeakCanay.install(this)这个函数到底是怎么走的,用测试的话说就是数据流是怎么走的,用探索性测试的方法说... 查看详情

javascript自执行匿名函数(function(){})()的原理浅析

...篇文章主要介绍了Javascript自执行匿名函数(function(){})()的原理浅析的相关资料,需要的朋友可以参考下函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途。匿名函数指没有指定函数名或指针的函数,自执行匿名... 查看详情

https原理浅析

HTTPS(HypertextTransferProtocolSecure)协议用于提供安全的超文本传输服务.其本质上是SSL/TLS层上的HTTP协议,即所谓的"HTTPoverSSL/TLS".越来越多的WEB应用需要在网络上传输交易支付等敏感信息,使用明文通信HTTP协议显然无法满足对安全性的要... 查看详情

浅析jquery基本结构($实现原理)(代码片段)

jQuery是一个非常好的库,学习它的实现原理是一个很好的提高代码编写能力的途径,这里来简单解析下jQuery的基本架构,主要来说下$符号的实现原理。直接看代码吧。<script>  (function(w)//工厂functionjQuery(selector,context)returnne... 查看详情

浅析skiplist跳跃表原理及代码实现

...都广为使用,是比较高效的数据结构。由于它的代码以及原理实现的简单性,更为人们所接受。首先看看SkipList的定义,为什么叫跳跃表?"Skiplists aredatastructures thatuseprobabilistic balancingrather than strictly&nbs 查看详情

https的原理浅析与本地开发实践(下)

...TP转换到HTTPS,为系列第二篇,第一篇:HTTPS的原理浅析与本地开发实践(上)。希望这两篇关于HTTPS的浅析能够对你的日常研发过程有所帮助。使用CA机构签发的证书配置http——以阿里云免费SSL证书申请过程为... 查看详情

https的原理浅析与本地开发实践(下)

...TP转换到HTTPS,为系列第二篇,第一篇:HTTPS的原理浅析与本地开发实践(上)。希望这两篇关于HTTPS的浅析能够对你的日常研发过程有所帮助。使用CA机构签发的证书配置http——以阿里云免费SSL证书申请过程为... 查看详情

Apache thrift“TProtocol 类”设计原理——C++,为啥需要“writeBool()”

】Apachethrift“TProtocol类”设计原理——C++,为啥需要“writeBool()”【英文标题】:Apachethrift"TProtocolclass"designprinciple-C++,whydoweneed"writeBool()"Apachethrift“TProtocol类”设计原理——C++,为什么需要“writeBool()”【发布时间... 查看详情

比特币深层技术原理浅析

...字,带你深入剖析当前备受追捧的比特币背后的深层技术原理,最后会简要介绍一下业界市场的现状。这是一篇主要针对技术小白的文章。本文尽量使用通俗易懂但又不失要义的文字,带你深入剖析当前备受追捧的比特币背后的... 查看详情

浅析线性表的原理及简单实现

一、线性表原理:零个或多个同类数据元素的有限序列原理图:特点: 1、有序性2、有限性3、同类型元素4、第一个元素无前驱,最后一个元素无后继,中间的元素有一个前驱并且有一个后继线性表是一种逻辑上的数据结构... 查看详情

浅析kubernetes的工作原理

转至 https://www.cnblogs.com/163yun/p/9518901.html 先放一张Kubernetes的架构图:    整体来看,是一个老大,多个干活的这种结构,基本上所有的分布式系统都是这样,但是里面的组件名称就纷繁复杂,下面将一一解... 查看详情

session原理浅析

什么是Sesson?简单说就是一个会话级的cookie,外加服务器端内存中一组散列表。当你关闭浏览器的时候,这个cookie将消失。这个cookie不写在磁盘上,而是存在于浏览器缓存。 关于Session的传说传说中,Web应用程序中的Session和A... 查看详情