Thrift的了解及使用-以Python与Nodejs为例

Apache Thrift是一个跨语言的RPC框架,由Facebook开发,支持多种编程语言,包括Python和Nodejs。本文介绍了Thrift的基础知识,包括RPC概念、Thrift的协议栈结构和跨语言特性,并通过实例展示了如何使用Thrift实现在Python和Nodejs之间的通信,包括定义接口存根、生成接口文件以及编写server端和client端代码。
摘要由CSDN通过智能技术生成

什么是Thrift

Apache Thrift 是 Facebook 实现的一种高效的、支持多种编程语言的远程服务调用的框架。

它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势。


简单来说,是Facebook公布的一款开源跨语言的RPC框架.

什么是RPC

  • RPC全称为Remote Procedure Call,意为远程过程调用.
  • 假设有两台服务器A,B.A服务器上部署着一个应用a,B服务器上部署着一个应用b,现在a希望能够调用b应用的某个函数(方法),但是二者不在同一个进程内,不能直接调用,就需要通过网络传输,在AB服务器之间建一条网络传输通道,a把参数传过去,b接收到参数调用自己的方法,得到结果,再通过网络传回给a,简单讲就是A通过网络来调用B的过程.这个过程要涉及的东西很多,比如多线程,Socket,序列化反序列化,网络I/O,很复杂,于是牛掰的程序员把这些封装起来做成一套框架,供大家使用,就是RPC框架.

Thrift的跨语言特性

  • thrift通过一个中间语言IDL(接口定义语言)来定义RPC的数据类型和接口,这些内容写在以.thrift结尾的文件中,然后通过特殊的编译器来生成不同语言的代码,以满足不同需要的开发者,比如java开发者,就可以生成java代码,c++开发者可以生成c++代码,生成的代码中不但包含目标语言的接口定义,方法,数据类型,还包含有RPC协议层和传输层的实现代码.

Thrift的协议栈结构

在这里插入图片描述

  • thrift是一种c/s的架构体系.在最上层是用户自行实现的业务逻辑代码.第二层是由thrift编译器自动生成的代码,主要用于结构化数据的解析,发送和接收。TServer主要任务是高效的接受客户端请求,并将请求转发给Processor处理。Processor负责对客户端的请求做出响应,包括RPC请求转发,调用参数解析和用户逻辑调用,返回值写回等处理。从TProtocol以下部分是thirft的传输协议和底层I/O通信。TProtocol是用于数据类型解析的,将结构化数据转化为字节流给TTransport进行传输。TTransport是与底层数据传输密切相关的传输层,负责以字节流方式接收和发送消息体,不关注是什么数据类型。底层IO负责实际的数据传输,包括socket、文件和压缩数据流等。

Thrift实现-nodejs与python之间通信

  1. 官网下载安装Thrift
  2. RPC的通信原理
    2.1 双方持有共同的接口存根(接口定义)
    2.2 Server端实现具体的接口实现类。
    2.3 Client通过动态代理,封装网络通讯过程,发送调用接口名称和参数到Server端。
    2.4 Server将处理结果返回Client。

3. Thrift基础

3.1 Thrift基本数据类型:

在这里插入图片描述

3.2 结构:

在这里插入图片描述

3.3 service 定义的接口存根(返回类型,方法名,参数):

在这里插入图片描述

3.4 定义完接口存根后,利用thrift生成相应的接口文件:

thrift -out 存储路径 --gen 接口语言 thrift 文件名
python栗子 thrift -r -gen py pyTest.thrift
nodejs栗子 thrift --gen js:node pyTest.thrift

3.5 生成的相应接口文件概览:

生成的gen-py: init.py,pyTest
在这里插入图片描述
生成的gen-nodejs:
在这里插入图片描述

3.6 在server端编写相应的接口方法

接口定义为:
在这里插入图片描述
利用Thrift生成接口文件后编写python server端 来实现定义的接口存根
Python引入Thrift 方式: pip install thrift

import sys
import json
import configparser
sys.path.append("./gen-py")
from pyTest import HadoopService
from impala.dbapi import connect
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer

cf = configparser.ConfigParser()
cf.read("conf/config.conf")

class HadoopServiceHandler:
	def connectHadoop(self,msg):
		data = json.loads(msg)
		self.conn = connect(host=data["host"],port=data["port"],
			database=data["database"],auth_mechanism=data["auth_mechanism"]
		)
		sql = "show tables"
		cursor = self.conn.cursor()
		cursor.execute(sql)
		tables = cursor.fetchall()
		tableList = [
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值