安装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..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..tar.gz
cd bison-2.5.
./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/

thrift RPC 框架的自我搭建的更多相关文章

  1. Thrift RPC框架介绍

    u 简介 Thrift是一种开源的跨语言的RPC服务框架.Thrift最初由facebook公司开发的,在2007年facebook将其提交apache基金会开源了.对于当时的facebook来说创造 ...

  2. [development][thrift] RPC框架 thrift

    一: wiki:https://zh.wikipedia.org/wiki/Thrift 二: 来自IBM的介绍:https://www.ibm.com/developerworks/cn/java/ ...

  3. 6种微服务RPC框架,你知道几个?

    开源 RPC 框架有哪些呢? 一类是跟某种特定语言平台绑定的,另一类是与语言无关即跨语言平台的. 跟语言平台绑定的开源 RPC 框架主要有下面几种. Dubbo:国内最早开源的 RPC 框架,由阿里巴 ...

  4. 6 种微服务 RPC 框架,你知道几个?

    开源 RPC 框架有哪些呢? 一类是跟某种特定语言平台绑定的,另一类是与语言无关即跨语言平台的. 跟语言平台绑定的开源 RPC 框架主要有下面几种. Dubbo:国内最早开源的 RPC 框架,由阿里巴 ...

  5. RPC框架实践之:Apache Thrift

    一.概述 RPC(Remote Procedure Call)即 远程过程调用,说的这么抽象,其实简化理解就是一个节点如何请求另一节点所提供的服务.在文章 微服务调用链追踪中心搭建 一文中模拟出来的调 ...

  6. rpc框架dubbo学习入门及环境搭建(spring boot+Kotlin)

    学习之前,确保有以下知识基础: Java网络编程 Socket传输数据 IO流 rpc简介及实现 rpc是remote procedure call的简写,意思为远程过程调用. rpc应用较多的情景是 ...

  7. rpc框架之 thrift连接池实现

    接前一篇rpc框架之HA/负载均衡构架设计 继续,写了一个简单的thrift 连接池: 先做点准备工作: package yjmyzz; public class ServerInfo { publi ...

  8. rpc框架: thrift/avro/protobuf 之maven插件生成java类

    thrift.avro.probobuf 这几个rpc框架的基本思想都差不多,先定义IDL文件,然后由各自的编译器(或maven插件)生成目标语言的源代码,但是,根据idl生成源代码这件事,如果每次都 ...

  9. rpc框架之 thrift 学习 1 - 安装 及 hello world

    thrift是一个facebook开源的高效RPC框架,其主要特点是跨语言及二进制高效传输(当然,除了二进制,也支持json等常用序列化机制),官网地址:http://thrift.apache.or ...

随机推荐

  1. C++:C++在图片特定区域之外产生随机数

    参考原文:C++产生随机数 (整数) C++在图片特定区域之外产生随机数,避开正则表达式,可以分为两种情况. 第一种:在某个数之前生成随机数:第二种,生成随机数,加上某个数,然后截断:第三种,指定范围 ...

  2. css3基础篇一

    CSS3 选择器 选择器 例子 例子描述 CSS .class .intro 选择 class="intro" 的所有元素. 1 #id #firstname 选择 id=&quo ...

  3. [Intermediate Algorithm] - Drop it

    题目 队友该卖就卖,千万别舍不得. 当你的队伍被敌人包围时,你选择拯救谁.抛弃谁非常重要,如果选择错误就会造成团灭. 如果是AD或AP,优先拯救. 因为AD和AP是队伍输出的核心. 其次应该拯救打野. ...

  4. OpenWRT 常用软件安装

    root@Jack:/tmp/opkg-lists# opkg--help opkg:unrecognized option `--help' opkgmust have one sub-comman ...

  5. C# 检测字符串是否为数字

    long n; 1. ], ].All(char.IsDigit); //识别空字符时候 会认为是数字 string str0 = ""; string str1 = " ...

  6. Django的Error汇总

    title: Django学习笔记 catalog: true subtitle: 11. Django_Error汇总 date: 2018-12-14 10:17:28 --- Django的Er ...

  7. Java基本类型转换

    1.自动类型转换 java所有的数值型变量都可以相互转换,如果系统支持把某种基本类型的值直接付赋给另一个基本类型的变量,则这种方式被称为自动类型转换. 当把一个表数范围小的数值或变量直接赋给另一个表数 ...

  8. CSS font-style中italic和Oblique有何区别 标签: css字体 2017-01-05 14:42 60人阅读 评论

    *要搞清楚这个问题,首先要明白字体是怎么回事.一种字体有粗体.斜体.下划线.删除线等诸多属性. 但是并不是所有字体都做了这些,一些不常用的字体,或许就只有个正常体,如果你用Italic,就没有效果了~ ...

  9. 使用Vue CLI 3将基于element-ui二次封装的组件发布到npm

    前言:之前在网上找的好多都是基于vue-cli 2.x的,而使用vue-cli 3的文章比较少,Vue CLI 3 中文文档,所以我在自己尝试的时候把几篇文章结合了一下,调出来了我想要的模式,也就是V ...

  10. workspace 配置

    1.新建workspace 在配置好相关信息前,请勿引入工程代码,避免环境不完整的情况下编译进入长时间等待 2.设置工作窗体结构 建议使用Java模式开发窗体设置 3. 编码 工程全部采用UTF-8编 ...