thrift RPC 框架的自我搭建

安装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)
View Code

该错误 (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
View Code

用 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:

扫描二维码关注公众号,回复: 6317982 查看本文章
service SqlRecord {
        string sql_record(1:string data)
}
View Code

对sqlrecord.thrift 进行编译:

thrift  -r --gen py sqlrecord.thrift  
View Code

生成 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()
View Code

客户端的代码如下:

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)
View Code

github大神对于thrift 的升级链接:https://github.com/Thriftpy/thriftpy

thrift 的官方文档链接:http://thrift.apache.org/

猜你喜欢

转载自www.cnblogs.com/Weibull/p/10956229.html