安装thrift rpc 安装的系统是Centos 7
未成功的方法 :(原因没找到,但是还是要记录下)
安装依赖库 yum install automake libtool flex bison pkgconfig gcc-c++ boost-devel libevent-devel zlib-devel python-devel ruby-devel 下载thrift包 wget http://mirror.bit.edu.cn/apache/thrift/0.12.0/thrift-0.12.0.tar.gz tar -vzxf thrift-0.12.0.tar.gz ./configure --prefix=/usr/local 会报错(g++: error: /usr/lib64/libboost_unit_test_framework.a: No such file or directory)
该错误 (g++: error: /usr/lib64/libboost_unit_test_framework.a: No such file or directory) 没有解决掉,网上搜索也没有就结果,所以果断换一种方法。
成功的方法:
更新系统 yum -y update 如果有就可以跳过以下步骤: 安装工具平台 yum -y groupinstall "Development Tools" 安装wget工具 yum install -y wget 安装自动配置 wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz tar xvf autoconf-2.69.tar.gz cd autoconf-2.69 ./configure --prefix=/usr make sudo make install cd .. 安装自动编译 wget http://ftp.gnu.org/gnu/automake/automake-1.14.tar.gz tar xvf automake-1.14.tar.gz cd automake-1.14 ./configure --prefix=/usr make sudo make install cd .. 更新bison wget http://ftp.gnu.org/gnu/bison/bison-2.5.1.tar.gz tar xvf bison-2.5.1.tar.gz cd bison-2.5.1 ./configure --prefix=/usr make sudo make install cd .. 安装c的依赖库 yum -y install libevent-devel zlib-devel openssl-devel 安装boost 版本>=1.53 wget http://sourceforge.net/projects/boost/files/boost/1.53.0/boost_1_53_0.tar.gz tar xvf boost_1_53_0.tar.gz cd boost_1_53_0 ./bootstrap.sh sudo ./b2 install 下载thrift git clone https://git-wip-us.apache.org/repos/asf/thrift.git cd thrift ./bootstrap.sh ./configure --with-lua=no make
用 python 写服务端与客户端
先了解下python 服务端
服务端的实现 主要有以下五方面:
①Handler
服务端业务处理逻辑。这里就是业务代码,比如 计算两个字符串 相似度
②Processor
从Thrift框架 转移到 业务处理逻辑。因此是RPC调用,客户端要把 参数发送给服务端,而这一切由Thrift封装起来了,由Processor将收到的“数据”转交给业务逻辑去处理
③Protocol
数据的序列化与反序列化。客户端提供的是“字符串”,而数据传输是一个个的字节,因此会用到序列化与反序列化。
④Transport
传输层的数据传输。
⑤TServer
服务端的类型。服务器以何种方式来处理客户端请求,比如,一次Client请求创建一个新线程呢?还是使用线程池?……可参考:阻塞通信之Socket编程
TSimpleServer —— 单线程服务器端使用标准的阻塞式 I/O
TThreadPoolServer —— 多线程服务器端使用标准的阻塞式 I/O
TNonblockingServer —— 多线程服务器端使用非阻塞式 I/O # 这个不是很了解 暂时未搞定
解释:
写python 的thfit 客户端与服务端目的是想将sql的记录移到部署mysql的服务器上,这样前端服务只需要发送后端服务就可以了
以下是写的demo:
中间代码文件sqlrecord.thrift:
service SqlRecord { string sql_record(1:string data) }
对sqlrecord.thrift 进行编译:
thrift -r --gen py sqlrecord.thrift
生成 gen-py 的文件 即 客户端与服务端连接的中间代码
服务端的代码如下:
import sys sys.path.append('gen-py') from sqlrecord import SqlRecord from sqlrecord.ttypes import * from thrift.transport import TSocket from thrift.transport import TTransport from thrift.protocol import TBinaryProtocol from thrift.server import TServer from sqlRecord import sqlThread # sql 记录的代码 import json def producer(consumer): consumer.send(None) def outer(func): def inner(*args): flag = func(*args) consumer.send(args[1]) return flag return inner return outer def consumer(): sql = '' while 1: rec = yield sql if not rec: break if not isinstance(rec,str): break sql_rec = json.loads(rec) # 以下是记录sql的操作 可以换成其他 try: sqlThread(sql_rec) except Exception as e: print(e) continue print("插入成功") class SqlHandler(): @producer(consumer=consumer()) def sql_record(self,data): return "ok" class ThritfServer(): def __init__(self, host='127.0.0.1', port=9090, cls = None, handler = None): self._host = host self._port = port self._cls = cls self._handler = handler self._server = self.new() def new(self): if not hasattr(self._cls,'Processor'): return processor = self._cls.Processor(self._handler) transport = TSocket.TServerSocket(host=self._host,port=self._port) tfactory = TTransport.TBufferedTransportFactory() pfactory = TBinaryProtocol.TBinaryProtocolFactory() server = TServer.TThreadedServer(processor, transport, tfactory, pfactory) return server def run(self): self._server.serve() if __name__ == '__main__': handler = SqlHandler() server = ThritfServer(cls=SqlRecord,handler=handler) server.run()
客户端的代码如下:
import sys sys.path.append('gen-py') from sqlrecord import SqlRecord from sqlrecord.ttypes import * from thrift import Thrift from thrift.transport import TSocket from thrift.transport import TTransport from thrift.protocol import TBinaryProtocol import json import threading # sqlrecord.thrift 文件中定义的方法名 _thrift_methods = ['sql_record'] class ThriftClient(): def __init__(self,host='127.0.0.1',port=9090,cls=None): self._host = host self._port = port self._cls = cls self._transport = None self._client = None self.connect() def connect(self): if not hasattr(self._cls,'Client'): return socket = TSocket.TSocket(self._host,self._port) self._transport = TTransport.TBufferedTransport(socket) protocol = TBinaryProtocol.TBinaryProtocol(self._transport) self._client = self._cls.Client(protocol) self._transport.open() def send_data(self,data): if not isinstance(data,dict): return if not hasattr(self._client,_thrift_methods[0]): return send = getattr(self._client,_thrift_methods[0]) result = send(json.dumps(data)) print(result) def __del__(self): self._transport.close() if __name__ == "__main__": tc = ThriftClient(cls=SqlRecord) data = {'table': 'test', 'address': 'http://127.0.0.1/?1111.html', 'results': [[3, 8, 9, 9, 9, 4]], 'duration': 1129, 'average_duration': 564} tc.send_data(data)
github大神对于thrift 的升级链接:https://github.com/Thriftpy/thriftpy
thrift 的官方文档链接:http://thrift.apache.org/