跨语言rpc框架Thrift

article/2025/10/2 13:51:18

RPC 全称 Remote Procedure Call——远程过程调用。RPC技术简单说就是为了解决远程调用服务 的一种技术,使得调用者像调用本地服务一样方便透明

Thrift的定义

  Thrift是一个轻量级、跨语言的RPC框架,主要用于各个服务之间的RPC通信,最初由Facebook于2007 年开发,2008年进入Apache开源项目。它通过自身的IDL中间语言, 并借助代码生成引擎生成各种主流语言的RPC服务端/客户端模板代码。Thrift支持多种不同的编程语言,包括C++, Java, Python, PHP, Ruby, Erlang, Haskell, C#, Cocoa, Javascript, Node.js, Smalltalk, OCaml, Golang等

Thrift的架构

​  Thrift技术栈分层从下向上分别为:传输层(Transport Layer)、协议层(Protocol Layer)、处理层(Processor Layer)和服务层(Server Layer)。

层级作用
Transport Layer负责直接从网络中读取和写入数据,它定义了具体的网络传输协议,比如TCP/IP。
Protocol Layer协议层定义了数据传输格式,负责网络传输数据的序列化和反序列化; 比如说JSON、XML、二进制数据等。
Processor Layer处理层是由具体的IDL(接口描述语言)生成的,封装了具体的底层网 络传输和序列化方式,并委托给用户实现的Handler进行处理。
Server Layer整合上述组件,提供具体的网络IO模型(单线程/多线程/事件驱动),形成 最终的服务。

针对采用TCP/IP作为更底层的通信协议,整个通信过程如下图:
在这里插入图片描述

Thrift的特性

1、开发速度快: 通过编写RPC接口Thrift IDL文件,利用编译生成器自动生成服务端骨架(Skeletons)和客户端桩(Stubs)。 从而省去开发者自定义和维护接口编解码、消息传输、服务器多线程模型等基础工作。服务端:只需要按照服务骨架即接口,编写好具体的业务处理程序(Handler)即实现类即可。 客户端:只需要拷贝IDL定义好的客户端桩和服务对象,然后就像调用本地对象的方法一样调用远端服务。

2、接口维护简单:通过维护Thrift格式的IDL(接口描述语言)文件(注意写好注释),即可作为给Client使用的接口文档 使用,也自动生成接口代码,始终保持代码和文档的一致性。且Thrift协议可灵活支持接口的可扩展性。

3、学习成本低:因为其来自Google Protobuf开发团队,所以其IDL文件风格类似Google Protobuf,且更加易读易懂; 特别是RPC服务接口的风格就像写一个面向对象的Class一样简单。

4、跨语言支持:Thrift支持C++、 Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、JavaScript、 Node.js、Smalltalk等多种语言,即可生成上述语言的服务器端和客户端程序。

5、稳定:Facebook中有广泛使用,国内包括百度、美团小米、和饿了么等公司都在广泛使用。

Thrift的协议

  Thrift可以让用户选择客户端与服务端之间传输通信协议的类别,在传输协议上总体划分为文本(text)和二进制(binary)传输协议。为节约带宽,提高传输效率,一般情况下使用二进制类型的传输协议为多数, 有时还会使用基于文本类型的协议,这需要根据项目/产品中的实际需求。常用协议有以下几种:

  • TBinaryProtocol:二进制编码格式进行数据传输

  • TCompactProtocol:高效率的、密集的二进制编码格式进行数据传输

  • TJSONProtocol: 使用JSON文本的数据编码协议进行数据传输

  • TSimpleJSONProtocol:只提供JSON只写的协议,适用于通过脚本语言解析

Mac下Python跨语言调用测试

以Apache官网提供的测试代码为例子

1、安装HomeBrew

Mac下的包管理工具

# 安装homebrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

中途需要Press RETURN to continue,输入系统密码等操作就完成了安装。
Homebrew安装成功后,会自动创建目录/usr/local/Cellar 来存放Homebrew安装的程序,并在 /usr/local/bin中创建符号链接。在终端就可以使用 brew 命令了。

2、安装Thirft
brew install thrift
3、编译器编译.thrift文件,生成python代码

下载IDL文件 生成python代码

# 首先使用pip命令安装thirft包
pip3 install thirft# 生成python代码
thirft -gen py filename.thirft
4、编写服务端代码
# 核心代码# func
handler = CalculatorHandler()
processor = Calculator.Processor(handler)
# transport  server IP Port
transport = TSocket.TServerSocket(host='127.0.0.1', port=9090)
tfactory = TTransport.TBufferedTransportFactory()
pfactory = TBinaryProtocol.TBinaryProtocolFactory()
server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)print('Starting the server...')
server.serve()
print('done.')
5、编写Client端代码
# Make socket
transport = TSocket.TSocket('localhost', 9090)# Buffering is critical. Raw sockets are very slow
transport = TTransport.TBufferedTransport(transport)# Wrap in a protocol
protocol = TBinaryProtocol.TBinaryProtocol(transport)# Create a client to use the protocol encoder
client = Calculator.Client(protocol)# Connect!
transport.open()# get server Ping func
res = client.ping()
print(res)

6、开启服务

# python3 client.py
# python3 server.py

然后我们的PRC架构就搭建完成了!
在这里插入图片描述

调用远程的方法

  同样的,我们需要拿到IDL文件,生成python代码,然后编写Server端代码,就可以调用远程的方法了,主要的就是我们要获取到 IP,PORT,以及参数等信息就可以完成调用了!
在这里插入图片描述


http://chatgpt.dhexx.cn/article/4EXBEEvG.shtml

相关文章

RPC 框架性能大比拼

Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。 Motan 是新浪微博开源的一个Java 框架。它诞生的比较晚,起于2013年,2016年5月开源。Motan 在微博平台中已经广泛应用,每天为数…

分布式RPC框架性能大比拼

点击上方“后端技术精选”,选择“置顶公众号” 技术文章第一时间送达! 来源:鸟窝 链接:http://985.so/aXe2 推荐阅读(点击即可跳转阅读) 1. SpringBoot内容聚合 2. 面试题内容聚合 3. 设计模式内容聚合 4. 排序算法内容聚合 5. 多…

C++微服务RPC框架,一文带你彻底搞懂 RPC

RPC(Remote Procedure Call),是一个大家既熟悉又陌生的词,只要涉及到通信,必然需要某种网络协议。我们很可能用过HTTP,那么RPC又和HTTP有什么区别呢?RPC还有什么特点,常见的选型有哪…

手动实现一个RPC框架 (一):RPC的介绍

手动实现RPC框架 最近在备战22年暑假实习的招聘,由于之前也没有实习的经验,所以在项目经验这方面也比较缺乏。在跟着B站尚硅谷的课程学习完微服务和分布式组件的内容后又跟着写了尚医通的微服务实战项目。尚医通项目中有使用到OpenFeign和FeignClient来远…

[转]php中流行的rpc框架有哪些?

什么是rpc框架 先回答第一个问题:什么是RPC框架? 如果用一句话概括RPC就是:远程调用框架(Remote Procedure Call) 那什么是远程调用? 通常我们调用一个php中的方法,比如这样一个函数方法: loc…

中间件 rpc是什么?php中流行的中间件rpc框架有哪些

rpc是什么?php中流行的rpc框架有哪些。 更好的排版:https://www.zybuluo.com/phper/note/76641 什么是rpc框架 先回答第一个问题:什么是RPC框架? 如果用一句话概括RPC就是:远程调用框架(Remote Procedure C…

rpc是什么?php中流行的rpc框架有哪些?

什么是rpc框架 先回答第一个问题:什么是RPC框架?如果用一句话概括RPC就是:远程调用框架(Remote Procedure Call) 那什么是远程调用? 通常我们调用一个php中的方法,比如这样一个函数方法: localA…

常用的RPC框架

为什么要使用RPC? RPC(remote procedure call)是指远程过程调用,比如两台服务器A和B,A服务器上部署一个应用,B服务器上部署一个应用,A服务器上的应用想调用B服务器上的应用提供的接口&#xff0…

Go语言 - RPC框架

1.什么是RPC RPC - Remote Procedure Calls 远程函数调用 相当于本地将参数上传到云端,云端根据形参计算返回结果,并返还给本地。 2.RPC需要解决的问题 函数映射 数据转换成字节流 网络传输 3.一次RPC的完整过程 IDL文件:通过一种中立…

主流的RPC框架有哪些

RPC是远程过程调用的简称,广泛应用在大规模分布式应用中,作用是有助于系统的垂直拆分,使系统更易拓展。Java中的RPC框架比较多,各有特色,广泛使用的有RMI、Hessian、Dubbo等。RPC还有一个特点就是能够跨语言。 1、RMI&…

简单使用iPhone自带视频播放器

利用苹果自带的视频播放器播放视频 在调用方法前&#xff0c;我们需要包含头文件 #import <MediaPlayer/MediaPlayer.h> 然后调用系统的方法&#xff0c;来实现视频播放。只需简单几步即可 1.获取要播放的视频的路径 NSString *path [[NSBundle mainBundle]pathForR…

iOS 音视频录制之播放视频,AVPlayer可播放本地视频和在线视频

文章目录 在开发中&#xff0c;单纯使用AVPlayer类是无法显示视频的&#xff0c;要将视频层添加至AVPlayerLayer中&#xff0c;这样才能将视频显示出来&#xff0c;所以先在ViewController的interface中添加以下属性 property (nonatomic ,strong) AVPlayer *player; property …

【iOS】视频播放之AVPlayer

【iOS】视频播放之AVPlayer iOS平台使用播放视频&#xff0c;可用的选项一般有这四个&#xff0c;他们各自的作用和功能如下&#xff1a; 使用环境优点缺点AVPlayerViewControllerAVKit简单易用不可定制MPMoviePlayerControllerMediaPlayer简单易用不可定制IJKPlayerIJKMedi…

【iOS】AVPlayer 播放音视频

1、常见的音视频播放器 iOS开发中不可避免地会遇到音视频播放方面的需求。 常用的音频播放器有 AVAudioPlayer、AVPlayer 等。不同的是&#xff0c;AVAudioPlayer 只支持本地音频的播放&#xff0c;而 AVPlayer 既支持本地音频播放&#xff0c;也支持网络音频播放。 常用的视…

【iOS】AVPlayer 视频播放

视频播放器的类别 iOS开发中不可避免地会遇到音视频播放方面的需求。 常用的音频播放器有 AVAudioPlayer、AVPlayer 等。不同的是&#xff0c;AVAudioPlayer 只支持本地音频的播放&#xff0c;而 AVPlayer 既支持本地音频播放&#xff0c;也支持网络音频播放。 常用的视频播放…

iOS音视频播放-AVPlayer简单使用

按公司需求需要对音频文件进行后台播放,借此机会对音频播放做了个总结.主要针对 AVPlayer 进行详细说明. iOS 各播放器比较 名称使用环境优点确点System Sound ServicesAVFoundationC语言的底层写法&#xff0c;节省内存支持的格式有限&#xff0c;音量无法通过音量键控制&…

iOS音视频播放指南(二)

1. 让你的App支持画中画 画中画指可以让视频在小窗中播放,可以一边看视频一边刷知乎 你可以使用AVPlayerViewController或者AVPictureInPictureController来实现画中画播放。 其中AVPictureInPictureController支持你自定义一些播放控件 在支持画中画播放之前,确保你按照iOS音视…

iOS音视频播放指南(一)

1. 简介 苹果目前提供两个框架用来处理音视频播放 1.AVFoundation AVFoundation用于播放、处理音视频。可以通过结构图看到AVFoundation位于UIKit之下,很好理解AVFoundation并不提供用户界面,你可以自己自己构建用户界面来控制媒体的播放处理等功能。 但是苹果更推荐使用AVKit来…

iOS视频播放的基本方法

本文总结了iOS中最常见的视频播放方法&#xff0c;不同的方法都各具特点&#xff0c;我希望能够总结它们的不同&#xff0c;方便在开发中选择合适的技术方案。 Apple为我们提供了多种方法来实现视频播放&#xff0c;包括MPMoviePlayerController&#xff0c;MPMoviePlayerView…

【计算机系统1】4 Nim游戏

目录 目的与要求 内容与方法 步骤与过程 程序总体设计 核心数据结构及算法流程 核心代码 调试过程 界面展示子程序DISPLAY&#xff08;嵌套&#xff1a;球数展示子程序PUTBALL&#xff09; 游戏子程序GAME&#xff08;嵌套&#xff1a;单人每轮子程序PLAY&#xff09; 结论或体…