简介

Thrift最初由Facebook研发,主要用于各个服务之间的RPC通信,支持跨语言,常用的语言比如C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml都支持。Thrift是一个典型的**CS(客户端/服务端)**结构,客户端和服务端可以使用不同的语言开发。既然客户端和服务端能使用不同的语言开发,那么一定就要有一种中间语言来关联客户端和服务端的语言,没错,这种语言就是IDL(Interface Description Language)

thrift使用流程

  1. 明确要交互的数据格式和具体的方法,定义出thrift接口描述文件(英文叫做IntefaceDescription File)

  2. 调用thrift工具,依据thrift接口文件,生成RPC代码;

  3. 你的服务器端程序引用thrift生成的RPC代码,并实现其中的Search动作的逻辑,然后启动监听,等待客户端发来请求。

  4. 客户端同样引入并调用RPC代码来与服务器端通信

thrift IDL

###1. 基本类型
thrift不支持无符号类型,因为很多编程语言不存在无符号类型,比如java

  • bool: 布尔类型(True or False)
  • byte: 有符号字节
  • i16: 16位有符号整数
  • i32: 32位有符号整数
  • i64: 64位有符号整数
  • double: 64位浮点数
  • string: 字符串

###2. 容器类型
集合中的元素可以是除了service之外的任何类型,包括exception。

  • list <T> : 一系列由T类型的数据组成的有序列表,元素可以重复。会被转换成C++中的vector,Java中的ArrayList,脚本语言中的数组等。
  • set<T>: 一系列由T类型的数据组成的无序集合,元素不可重复。会转换成C++中的set,Java中的HashSet、Python中的Set等
  • map<K,V>: 一个字典结构,key为K类型,value为V类型,相当于Java中的HMap<K,V>。一个含有多个key:value键值对的结构。会被转换成C++中的map,Java中的HashMap,PHP中的关联数组,Python/Ruby中的dictionary等

###3. 结构体
就像C语言一样,thrift也支持struct类型,目的就是将一些数据聚合在一起,方便传输管理。struct的定 义形式如下:

struct People {1: required string name;2: required i32 age = 20;3: optional string sex;
}

可以看到,结构体中每一个域都有一个正整数标识符,这个标识符并不要求连续,但一旦定义,不建议再进行修改
另外,每个域前都会有required或optional的限定,前者表示是必填域,后者则表示是可选域。域是可以有默认值的,比如上例中的“age"。
如果一个域设置为optional且在构造结构体时没有给这个域赋值,那么在使用这个结构体时,就会忽略掉这个optional的域

异常(exception)

thrift支持自定义exception,规则和struct一样,如下:

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

除了使用exception来替代struct以外,“异常”这个类型,在语法上和刚才介绍过的结构体的用法是完全一致的。但是从语义上讲,exception和struct却大相径庭。exception是在远程调用发生异常时用来抛出异常用的

服务(Service)

服务的定义,与面向对象技术中定义一个接口很类似,而这些接口其实就是纯虚函数。thrift编译工具会根据服务的定义来产生相应的方法和函数。
每个服务,都包括了若干个函数,每个函数包括了若干参数和一个返回值(返回值可以是void.
(小技巧:返回值为void的函数,你可以在函数名前加上oneway标识符,将此函数以异步模式执行,这样在调用此函数后,函数会立即返回。)

对于返回void的函数,thrift仍然会确保函数返回,这样就表示这个函数已被正确执行,且服务器端已有返回信息了。但是如果给void的函数前加上oneway,那么此函数的返回只能表示数据已经进入传输层,并不能表示服务器端已经收到并返回了数据

service vulgar_detect{bool is_vulgar(1:string title),i32 calc(1: i32 num)
}

thrift编译工具

在我们编写好thrift接口描述文件之后,thrift编译工具就要派上用场了,它的作用就是根据thrift接口描述文件来生成相应开发语言的RPC代码.
在终端下输入:

thrift --gen ${开发语言} ${thrift接口描述文件}

关于thrift的更多命令可以输入

thrift --help

实战

说了这么多,我们来看个例子加深印象。

###1. 接口文件demo.thrift

service demo{string repeat2(1:string msg),i16 calc(1:i16 num1)
}

###2. 编辑服务端sever.rpy

# coding:utf-8
import sys,os
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)
from pygen.demo import democlass demoHandler:def __init__(self):passdef repeat2(self, msg):return msg * 2def calc(self, num1):return (num1**2)handler = demoHandler()
processor = demo.Processor(handler)
# 设定主机和端口号
transport = TSocket.TServerSocket(host='localhost',port=30303)
# 选择传输层(和客户端保持一致)
tfactory = TTransport.TBufferedTransportFactory()
# 选择传输协议(和客户端保持一致)
pfactory = TBinaryProtocol.TBinaryProtocolFactory()
# 创建服务端
server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)
print("Starting python server...")
# 开启服务
server.serve()
print("done!")

###3. 编辑客户端

# coding:utf-8
from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocolfrom pygen.demo import demotry:# 设定主机和端口号transport = TSocket.TSocket('localhost', 30303)# 选择传输层(和服务端保持一致)transport = TTransport.TBufferedTransport(transport)# 选择传输协议(和服务端保持一致)protocol = TBinaryProtocol.TBinaryProtocol(transport)# 创建客户端client = demo.Client(protocol)# 开启传输transport.open()# 发起请求print(client.repeat2('first thrift demo'))print(client.calc(72))# 关闭传输transport.close()except Thrift.TException as tx:print(tx.message)

以上三个文件都在同一目录下
使用如下生产rpc代码,将生成的gen-py重命名为pygen

thrift --gen py demo.thrift
python server.py #开启服务
python client.py # 发起请求

thrift实战教程相关推荐

  1. PyTorch 高级实战教程:基于 BI-LSTM CRF 实现命名实体识别和中文分词

    20210607 https://blog.csdn.net/u011828281/article/details/81171066 前言:译者实测 PyTorch 代码非常简洁易懂,只需要将中文分词 ...

  2. ArcGIS水文分析实战教程(9)雨量计算与流量统计

    ArcGIS水文分析实战教程(9)雨量计算与流量统计 本章导读:降水是水文循环中重要的一环,降水包括雨.雪.雾.露.雹等,本章介绍的是降雨的环节.通过雨量站与插值的方式,实现雨量的空间分布就算,为水文 ...

  3. 宏基因组分析实战教程1. 背景知识

    上次我写的学习经验和推荐的教程--<微生物组入门必读+宏基因组实操课程=新老司机赶快上车>,小伙伴们当天阅读破2700+人次,3.5天破3000+,达到了宏基因组快车满三千人发车的要求.我 ...

  4. js模板字符串自定义类名_【Vue.js 入门到实战教程】07Vue 组件注册 | 基本使用和组件嵌套...

    来源 | https://xueyuanjun.com/post/21929除了前面介绍的基本语法之外,Vue.js 还支持通过组件构建复杂的功能模块,组件可以称得上是 Vue.js 的灵魂,是 Vu ...

  5. python商业爬虫教程_廖雪峰老师的Python商业爬虫课程 Python网络爬虫实战教程 体会不一样的Python爬虫课程...

    廖雪峰老师的Python商业爬虫课程 Python网络爬虫实战教程 体会不一样的Python爬虫课程 1.JPG (53.51 KB, 下载次数: 1) 2019-8-9 08:15 上传 2.JPG ...

  6. Swift游戏开发实战教程(大学霸内部资料)

    Swift游戏开发实战教程(大学霸内部资料) 试读下载地址:http://pan.baidu.com/s/1sj7DvQH 介绍:本教程是国内第一本Swift游戏开发专向资料. 本教程详细讲解记忆配对 ...

  7. python教程下载地址-最新python实战教程网盘下载地址

    原标题:最新python实战教程网盘下载地址 Python在程序员中始终流行:40%的受访者都会学习,44%的受访者每周都会学习.目前技术领域最热点的技术排名,排在前一位的是:Python.Pytho ...

  8. python3项目-终于找到python3项目实战教程

    列表的元素是可以变动的,比如增加.删除.修改,不过需要注意的是,列表的元素不是基本数据类型,都是一个个的标识符引用对象.以下是小编为你整理的python3项目实战教程 先定义一个列表 a = [123 ...

  9. yolov5训练_YoloV5模型训练实战教程:Kaggle全球小麦检测竞赛

    写在前面 前段时间参加了Kaggle的一个目标检测竞赛,比赛后期因为工作较繁忙就搁置了,但仍然获得了铜牌(前10%).因此在这里想跟大家分享下自己的方案,希望能帮助大家更好的了解目标检测这一经典的计算 ...

  10. .Net Core 在 Linux-Centos上的部署实战教程(二)

    .Net Core 在 Linux-Centos上的部署实战教程(二) 原文:.Net Core 在 Linux-Centos上的部署实战教程(二) 上篇我们说了 如何在Linux上部署.net co ...

最新文章

  1. Tensor基础实践
  2. 博客摘录:网络管理员的两天
  3. [ js处理表单 ]:保存、提交
  4. C语言 将整数写入内存指定的连续字节单元中
  5. 【C++ STL学习之一】容器的共通能力和共通操作总结
  6. 华为云瑶光:打通云边端界限,为企业云上业务带来最优解
  7. Solr查询参数sort(排序)
  8. 第一章 软件项目管理概述
  9. 简单易懂的PHP的命名空间以及配合use的使用
  10. mysql工具——mysqlcheck(MYISAM)
  11. matlab使用CVX求解优化问题时,如果变量搜索空间过大,导致求解的数值解相当不准确,通过变量替换,缩小搜索空间
  12. MQL5更换默认储存地址
  13. 马云率队夜访茅台:打造中国大数据合作的经典样板
  14. Adaptive Icons - Android O 自适应图标简单用法
  15. 小学老师工资多少一个月_教师一个月工资是多少? 全国各地教师工资一览
  16. 大数据架构师成长之路
  17. python 按月份分组_Python按月份分组日期
  18. 大数问题(循环求余/快速幂求余/快速幂问题)
  19. Radar And Millimeter-Wave System Based On Photonic Technology
  20. uni-app蓝牙接收发失败解决办法

热门文章

  1. Python基础教程,Python入门教程(非常详细)
  2. js拼接json对象_JS实现合并json对象的方法
  3. kepware mysql_Kepware实现向数据库实时写入数据
  4. 微信小程序之设置背景图片
  5. 清华大学计算机系学几年,清华大学计算机科学与技术系
  6. 《机器视觉算法与应用》第3章 机器视觉算法之模板匹配——学习笔记
  7. JSP项目引入Vue.js进行项目开发(工程搭建)
  8. Python3 安装RobotFramework
  9. aix显示服务器ip,AIX系统查看和设置网关和IP配置
  10. VMware虚拟机和Linux的安装及镜像下载