一、写在前面

thrift是一种跨语言函数调用的框架,可以方便的实现多语言应用程序间的函数调用。

比如我现在有两个应用程序,一个是C语言写的,一个是python写的。如果我希望这两个程序可以进行函数调用,我们可以想到很多种方式,共享文件,消息队列,socket等等,然后双方规定好协议,比如传输1调用对方的fun函数。但是这样实现有很多种弊端,如果两者间调用函数特别多,函数入参、返回值又不是基本数据类型的话,那这个函数调用框架就有的忙活的了。

thrift说“别怕,看我的”。thrift的思想其实很简单。A和B两个语言之间要实现通信,如果A可以之间调用B中的函数,通过函数获取A想要的结果,这种实现无非是极好的。但是A要调用B中的函数,需要解决一些问题:

  • 数据类型如何实现互通转换;
  • 如果实现函数调用

为了解决上述两个问题,thrfit规定通信的双方需要提供一个接口文档,这个接口文档是语言无关的,接口文档中所有的数据类型都是thrfit自己定义的数据类型,如i32i64bool等,当然这些thrift数据类型在不同语言都有对应的数据类型,函数的入参和返回值也都限于接口文档中定义的数据类型。比方我需要个复杂数据类型,那么我就在接口文档中定义个复杂数据类型,这个复杂的数据类型由thrift基本数据构成,在C语言看来可能用结构体表示,而JAVA可能用类来实现一把。其实就是thrift在不同语言间加了个中间件,果然所有的软件问题都能通过加一个中间件来解决,如果有,就再加一层

360截图20181117181350554.jpg

至于通信就更加简单了,我只要告诉对方我需要调用什么函数入参是什么返回值是什么,对方接到这个消息之后就会查找自己实现的接口文档中的函数,然后把接到的参数翻译成自己语言的数据(这个过程由thrift框架完成),最后把函数执行结果填充给thrift即可。

既然这么简单,一定要去瞧一瞧,那我们快上车吧。

二、thrfit编译安装

老规矩,编译安装采取源代码方式安装。

  1. 从git仓库下载代码https://github.com/apache/thrift.git
  2. 需要安装些编译工具sudo apt-get install flex bison
  3. 安装autotool相关工具sudo apt-get install libboost-dev libtool
  4. 安装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即可;
  5. 下面为了编译方便,我们撸一个编译脚本好了,起名叫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