一、写在前面
thrift是一种跨语言函数调用的框架,可以方便的实现多语言应用程序间的函数调用。
比如我现在有两个应用程序,一个是C语言写的,一个是python写的。如果我希望这两个程序可以进行函数调用,我们可以想到很多种方式,共享文件,消息队列,socket等等,然后双方规定好协议,比如传输1
调用对方的fun函数。但是这样实现有很多种弊端,如果两者间调用函数特别多,函数入参、返回值又不是基本数据类型的话,那这个函数调用框架就有的忙活的了。
thrift说“别怕,看我的”。thrift的思想其实很简单。A和B两个语言之间要实现通信,如果A可以之间调用B中的函数,通过函数获取A想要的结果,这种实现无非是极好的。但是A要调用B中的函数,需要解决一些问题:
- 数据类型如何实现互通转换;
- 如果实现函数调用
为了解决上述两个问题,thrfit规定通信的双方需要提供一个接口文档,这个接口文档是语言无关的,接口文档中所有的数据类型都是thrfit自己定义的数据类型,如i32
,i64
,bool
等,当然这些thrift数据类型在不同语言都有对应的数据类型,函数的入参和返回值也都限于接口文档中定义的数据类型。比方我需要个复杂数据类型,那么我就在接口文档中定义个复杂数据类型,这个复杂的数据类型由thrift基本数据构成,在C语言看来可能用结构体表示,而JAVA可能用类来实现一把。其实就是thrift在不同语言间加了个中间件,果然所有的软件问题都能通过加一个中间件来解决,如果有,就再加一层。
至于通信就更加简单了,我只要告诉对方我需要调用什么函数
,入参是什么
,返回值是什么
,对方接到这个消息之后就会查找自己实现的接口文档中的函数
,然后把接到的参数翻译成自己语言的数据(这个过程由thrift框架完成)
,最后把函数执行结果填充给thrift即可。
既然这么简单,一定要去瞧一瞧,那我们快上车吧。
二、thrfit编译安装
老规矩,编译安装采取源代码方式安装。
- 从git仓库下载代码https://github.com/apache/thrift.git;
- 需要安装些编译工具
sudo apt-get install flex bison
; - 安装autotool相关工具
sudo apt-get install libboost-dev libtool
; - 安装
glib
库,当然你机器上要是有的话可以忽略。下载代码http://ftp.gnome.org/pub/gnome/sources/glib/2.50/,安装相关依赖sudo apt-get install libffi-dev
,然后去glib工程里执行./configure --with-pcre=internal --enable-libmount=no --prefix=/usr
,然后make & make install
即可; - 下面为了编译方便,我们撸一个编译脚本好了,起名叫
build.sh
,里面的内容如下,执行一下即可,当然你如果不想编译其他语言的thrift
库,在./configure
后添加--without-语言
就可以了,如--without-cpp --without-nodejs --without-python
:
#!/bin/bash
CUR_DIR=`pwd`
THRIFT_VERSION=thrift
cd ${CUR_DIR}/${THRIFT_VERSION}
make distclean
#1.config
export CFLAGS="-I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include"
export LDFLAGS="-lglib-2.0"
./configure --with-php=no --prefix=/usr/
make & make install